From 5a6533201e58e99f86a3b12d2abb9372460ee9b6 Mon Sep 17 00:00:00 2001 From: Zog Date: Wed, 7 Feb 2018 09:23:20 +0100 Subject: Refs #4126 @6h; Add i18n to JS --- .gitignore | 2 ++ Gemfile | 1 + Gemfile.lock | 3 +++ app/assets/javascripts/application.js | 3 +++ app/assets/javascripts/i18n/extended.coffee | 24 ++++++++++++++++++++++ app/assets/stylesheets/components/_tables.sass | 3 ++- .../vehicle_journeys/components/ConfirmModal.js | 6 +++--- .../vehicle_journeys/components/Filters.js | 18 ++++++++-------- .../vehicle_journeys/components/VehicleJourney.js | 10 ++++----- .../vehicle_journeys/components/VehicleJourneys.js | 18 ++++++++-------- .../components/tools/EditVehicleJourney.js | 2 +- app/views/calendars/_form_advanced.html.slim | 2 +- app/views/layouts/application.html.slim | 2 ++ app/views/routes/_form.html.slim | 2 +- app/views/time_tables/edit.html.slim | 2 +- app/views/time_tables/index.html.slim | 2 +- app/views/vehicle_journeys/index.html.slim | 2 +- app/views/workbenches/show.html.slim | 2 +- config/environments/development.rb | 1 + config/locales/en.yml | 5 +++++ config/locales/fr.yml | 4 ++++ config/locales/vehicle_journeys.en.yml | 15 ++++++++++++++ config/locales/vehicle_journeys.fr.yml | 16 +++++++++++++++ lib/tasks/ci.rake | 4 ++-- package.json | 4 ++++ spec/javascript/preprocessor.js | 15 ++++++++++++++ .../components/VehicleJourneys_spec.js | 7 +++++++ .../__snapshots__/VehicleJourneys_spec.js.snap | 20 +++++++++--------- 28 files changed, 149 insertions(+), 46 deletions(-) create mode 100644 app/assets/javascripts/i18n/extended.coffee create mode 100644 spec/javascript/preprocessor.js diff --git a/.gitignore b/.gitignore index acdb5e230..dd4d057ef 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,8 @@ /tmp *~ public/assets/ +public/javascripts/i18n.js +public/javascripts/translations.js # for vim users *.swp diff --git a/Gemfile b/Gemfile index bb1a42df0..db5202bdf 100644 --- a/Gemfile +++ b/Gemfile @@ -103,6 +103,7 @@ gem 'will_paginate-bootstrap' gem 'gretel' gem 'country_select' gem 'flag-icons-rails' +gem 'i18n-js' # Format Output gem 'json' diff --git a/Gemfile.lock b/Gemfile.lock index ffa63b535..41469d9c2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -270,6 +270,8 @@ GEM multi_xml (>= 0.5.2) i18n (0.9.3) concurrent-ruby (~> 1.0) + i18n-js (3.0.4) + i18n (~> 0.6, >= 0.6.6) i18n-tasks (0.9.15) activesupport (>= 4.0.2) ast (>= 2.1.0) @@ -636,6 +638,7 @@ DEPENDENCIES gretel has_array_of! htmlbeautifier + i18n-js i18n-tasks inherited_resources jbuilder (~> 2.0) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 4c5aff22f..6a79f7e8e 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -22,3 +22,6 @@ //= require_directory . // require('whatwg-fetch') // require('babel-polyfill') +//= require "i18n" +//= require "i18n/extended" +//= require "i18n/translations" diff --git a/app/assets/javascripts/i18n/extended.coffee b/app/assets/javascripts/i18n/extended.coffee new file mode 100644 index 000000000..aeb67bd09 --- /dev/null +++ b/app/assets/javascripts/i18n/extended.coffee @@ -0,0 +1,24 @@ +#= require i18n + +decorateI18n = (_i18n)-> + _i18n.tc = (key, opts={}) -> + out = _i18n.t(key, opts) + out += " " if _i18n.locale == "fr" + out + ":" + + _i18n.model_name = (model, opts={}) -> + last_key = if opts.plural then "other" else "one" + _i18n.t("activerecord.models.#{model}.#{last_key}") + + _i18n.attribute_name = (model, attribute, opts={}) -> + _i18n.t("activerecord.attributes.#{model}.#{attribute}") + + _i18n.enumerize = (enumerize, key, opts={}) -> + I18n.t("enumerize.#{enumerize}.#{key}") + + _i18n + +module?.exports = decorateI18n + +if I18n? + decorateI18n(I18n) diff --git a/app/assets/stylesheets/components/_tables.sass b/app/assets/stylesheets/components/_tables.sass index 35e1122f3..5f8b06f09 100644 --- a/app/assets/stylesheets/components/_tables.sass +++ b/app/assets/stylesheets/components/_tables.sass @@ -9,7 +9,6 @@ font-weight: 700 border-bottom: 2px solid $darkgrey vertical-align: middle - > a position: relative display: block @@ -326,6 +325,8 @@ padding: 6px 8px border-bottom: 2px solid rgba($grey, 0.5) border-top: 1px solid rgba($grey, 0.5) + text-transform: capitalize + .td position: relative padding: 6px 8px diff --git a/app/javascript/vehicle_journeys/components/ConfirmModal.js b/app/javascript/vehicle_journeys/components/ConfirmModal.js index 3bfc852fb..75e8a3932 100644 --- a/app/javascript/vehicle_journeys/components/ConfirmModal.js +++ b/app/javascript/vehicle_journeys/components/ConfirmModal.js @@ -7,7 +7,7 @@ export default function ConfirmModal({dispatch, modal, onModalAccept, onModalCan
-

Voulez-vous valider vos modifications avant de changer de page?

+

{I18n.t('vehicle_journeys.vehicle_journeys_matrix.modal_confirm')}

) -} +} ConfirmModal.propTypes = { vehicleJourneys: PropTypes.array.isRequired, modal: PropTypes.object.isRequired, onModalAccept: PropTypes.func.isRequired, onModalCancel: PropTypes.func.isRequired -} \ No newline at end of file +} diff --git a/app/javascript/vehicle_journeys/components/Filters.js b/app/javascript/vehicle_journeys/components/Filters.js index 2bd912e3e..f8697c930 100644 --- a/app/javascript/vehicle_journeys/components/Filters.js +++ b/app/javascript/vehicle_journeys/components/Filters.js @@ -46,10 +46,10 @@ export default function Filters({filters, pagination, missions, onFilter, onRese
{/* Plage horaire */}
- +
- +
- +
- +
@@ -122,7 +122,7 @@ export default function Filters({filters, pagination, missions, onFilter, onRese
{/* Switch avec/sans calendrier */}
- +
diff --git a/app/javascript/vehicle_journeys/components/VehicleJourney.js b/app/javascript/vehicle_journeys/components/VehicleJourney.js index 99a458f50..4a9432231 100644 --- a/app/javascript/vehicle_journeys/components/VehicleJourney.js +++ b/app/javascript/vehicle_journeys/components/VehicleJourney.js @@ -23,7 +23,7 @@ export default class VehicleJourney extends Component { let ttURL = refURL + '/time_tables/' + tt.id return ( - + ) } @@ -32,7 +32,7 @@ export default class VehicleJourney extends Component { let ttURL = refURL + '/purchase_windows/' + tt.id return ( - + ) } @@ -65,7 +65,7 @@ export default class VehicleJourney extends Component { } >
{this.props.value.short_id || '-'}
-
{this.props.value.published_journey_name && this.props.value.published_journey_name != "non renseigné" ? this.props.value.published_journey_name : '-'}
+
{this.props.value.published_journey_name && this.props.value.published_journey_name != I18n.t('undefined') ? this.props.value.published_journey_name : '-'}
{this.props.value.journey_pattern.short_id || '-'}
{this.props.value.company ? this.props.value.company.name : '-'}
@@ -100,7 +100,7 @@ export default class VehicleJourney extends Component {
{this.props.filters.toggleArrivals && -
+
}
-
+
{(this.props.status.fetchSuccess == false) && (
- Erreur : - la récupération des missions a rencontré un problème. Rechargez la page pour tenter de corriger le problème. + {I18n.tc("error")} + {I18n.t("vehicle_journeys.vehicle_journeys_matrix.fetching_error")}
)} { this.vehicleJourneysList().errors && this.vehicleJourneysList().errors.length && _.some(this.vehicleJourneysList(), 'errors') && (
- Erreur : + {I18n.tc("error")} {this.vehicleJourneysList().map((vj, index) => vj.errors && vj.errors.map((err, i) => { return ( @@ -129,12 +129,12 @@ export default class VehicleJourneys extends Component {
0) ? '' : ' no_result')}>
-
ID course
-
Nom course
-
ID mission
-
Transporteur
-
Calendriers
- { this.hasFeature('purchase_windows') &&
Calendriers Commerciaux
} +
{I18n.attribute_name("vehicle_journey", "id")}
+
{I18n.attribute_name("vehicle_journey", "name")}
+
{I18n.attribute_name("vehicle_journey", "journey_pattern_id")}
+
{I18n.model_name("company")}
+
{I18n.model_name("time_table", "plural": true)}
+ { this.hasFeature('purchase_windows') &&
{I18n.model_name("purchase_window", "plural": true)}
}
{this.stopPoints().map((sp, i) =>{ return ( diff --git a/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js b/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js index f6a0e3c61..bcfd4eb41 100644 --- a/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js +++ b/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js @@ -128,7 +128,7 @@ export default class EditVehicleJourney extends Component {
diff --git a/app/views/calendars/_form_advanced.html.slim b/app/views/calendars/_form_advanced.html.slim index b4154166b..e796e2e36 100644 --- a/app/views/calendars/_form_advanced.html.slim +++ b/app/views/calendars/_form_advanced.html.slim @@ -2,7 +2,7 @@ = javascript_tag do | window.actionType = "#{raw params[:action]}"; - | window.I18n = #{(I18n.backend.send(:translations)[I18n.locale].to_json).html_safe}; + // | window.I18n = #{(I18n.backend.send(:translations)[I18n.locale].to_json).html_safe}; | window.timetablesUrl = "#{calendar_url(@calendar).html_safe}"; = javascript_pack_tag 'calendars/edit.js' diff --git a/app/views/layouts/application.html.slim b/app/views/layouts/application.html.slim index 34b373295..3921c8701 100644 --- a/app/views/layouts/application.html.slim +++ b/app/views/layouts/application.html.slim @@ -13,6 +13,8 @@ html lang=I18n.locale = javascript_pack_tag 'application' = javascript_include_tag 'application' + = javascript_tag do + | I18n.locale = '#{I18n.locale}' body = render 'layouts/navigation/main_nav' diff --git a/app/views/routes/_form.html.slim b/app/views/routes/_form.html.slim index 29e5be3d2..81f719437 100644 --- a/app/views/routes/_form.html.slim +++ b/app/views/routes/_form.html.slim @@ -27,7 +27,7 @@ // Get JSON data for route stop points = javascript_tag do | window.itinerary_stop = "#{URI.escape(route_json_for_edit(@route))}"; - | window.I18n = #{(I18n.backend.send(:translations)[I18n.locale].to_json).html_safe}; + // | window.I18n = #{(I18n.backend.send(:translations)[I18n.locale].to_json).html_safe}; / StopPoints Reactux component = javascript_pack_tag 'routes/edit.js' diff --git a/app/views/time_tables/edit.html.slim b/app/views/time_tables/edit.html.slim index e1c566ff4..d8cffb1b0 100644 --- a/app/views/time_tables/edit.html.slim +++ b/app/views/time_tables/edit.html.slim @@ -8,6 +8,6 @@ = javascript_tag do | window.actionType = "#{raw params[:action]}"; - | window.I18n = #{(I18n.backend.send(:translations)[I18n.locale].to_json).html_safe}; + // | window.I18n = #{(I18n.backend.send(:translations)[I18n.locale].to_json).html_safe}; = javascript_pack_tag 'time_tables/edit.js' diff --git a/app/views/time_tables/index.html.slim b/app/views/time_tables/index.html.slim index f58fbb5ea..6913712a0 100644 --- a/app/views/time_tables/index.html.slim +++ b/app/views/time_tables/index.html.slim @@ -61,6 +61,6 @@ = replacement_msg t('time_tables.search_no_results') = javascript_tag do - | window.I18n = #{(I18n.backend.send(:translations).to_json).html_safe}; + // | window.I18n = #{(I18n.backend.send(:translations).to_json).html_safe}; = javascript_pack_tag 'date_filters' diff --git a/app/views/vehicle_journeys/index.html.slim b/app/views/vehicle_journeys/index.html.slim index caa8450a0..d53d8b50c 100644 --- a/app/views/vehicle_journeys/index.html.slim +++ b/app/views/vehicle_journeys/index.html.slim @@ -29,7 +29,7 @@ | window.features = #{raw @features}; | window.all_missions = #{(@all_missions.to_json).html_safe}; | window.custom_fields = #{(@custom_fields.to_json).html_safe}; - | window.I18n = #{(I18n.backend.send(:translations).to_json).html_safe}; + // | window.I18n = #{(I18n.backend.send(:translations).to_json).html_safe}; - if has_feature?(:vehicle_journeys_return_route) = javascript_tag do diff --git a/app/views/workbenches/show.html.slim b/app/views/workbenches/show.html.slim index a162ca334..aae34c51b 100644 --- a/app/views/workbenches/show.html.slim +++ b/app/views/workbenches/show.html.slim @@ -72,6 +72,6 @@ = replacement_msg t('referentials.search_no_results') = javascript_tag do - | window.I18n = #{(I18n.backend.send(:translations).to_json).html_safe}; + // | window.I18n = #{(I18n.backend.send(:translations).to_json).html_safe}; = javascript_pack_tag 'date_filters' diff --git a/config/environments/development.rb b/config/environments/development.rb index 1d2fee44f..446e72190 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -95,6 +95,7 @@ Rails.application.configure do config.i18n.available_locales = [:fr, :en] config.middleware.insert_after(ActionDispatch::Static, Rack::LiveReload) if ENV['LIVERELOAD'] + config.middleware.use I18n::JS::Middleware config.development_toolbar = false if ENV['TOOLBAR'] && File.exists?("config/development_toolbar.rb") config.development_toolbar = OpenStruct.new diff --git a/config/locales/en.yml b/config/locales/en.yml index e59960f95..d78d51dbe 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -3,6 +3,7 @@ en: "false": "No" "unknown": "Unknown" + time: formats: hour: "%Hh%M" @@ -61,3 +62,7 @@ en: reflex_data: 'Reflex datas' objectid: 'ID' brandname: IBOO + error: "Error" + undefined: 'undefined' + yes: yes + no: no diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 175b71ebc..d89c286af 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -61,3 +61,7 @@ fr: reflex_data: 'Données Reflex' objectid: 'ID' brandname: IBOO + error: "Erreur" + undefined: 'non renseigné' + yes: oui + no: non diff --git a/config/locales/vehicle_journeys.en.yml b/config/locales/vehicle_journeys.en.yml index abb1da530..a1f20a7e8 100644 --- a/config/locales/vehicle_journeys.en.yml +++ b/config/locales/vehicle_journeys.en.yml @@ -2,6 +2,10 @@ en: vehicle_journeys: vehicle_journeys_matrix: line_routes: "Line's routes" + fetching_error: "There has been a problem fetching the data. Please reload the page to try again." + show_timetable: 'Show calendar' + show_purchase_window: 'Show the purchase window' + modal_confirm: 'Do you want to save mofications before moving on to the next page ?' vehicle_journey: title_stopless: "Vehicle journey %{name}" title: "Vehicle journey leaving from %{stop} at %{time}" @@ -28,6 +32,8 @@ en: stop_title: "Stop" departure: "Departure" arrival: "Arrival" + departure_at: "Departure at" + arrival_at: "Arrival at" to_arrivals: "Copy departures to arrivals" to_departures: "Copy arrivals to departures" time_tables: "Associated calendars to vehicle journey" @@ -35,6 +41,12 @@ en: slide_title: "Shift all vehicle passing times" set: "Set" to: "at" + departure_range: + label: Journey departure range + start: Start + end: End + show_journeys_without_schedule: "Show journeys without schedule" + show_journeys_with_calendar: "Show journeys with calendar" slide_departure: "departure time at first stop" slide_arrival: "arrival time at first stop" submit_timed: "Create vehicle journey" @@ -81,6 +93,7 @@ en: line: "Line" route: "Route" journey_pattern: "Journey Pattern" + journey_pattern_id: "Pattern ID" time_tables: "Calendars" time_slot: "Time Slot" company: "Company" @@ -112,6 +125,8 @@ en: departure_time: "Departure" arrival_time: "Arrival" purchase_window: "Purchase availability" + name: "Journey Name" + id: "Journey ID" errors: models: vehicle_journey: diff --git a/config/locales/vehicle_journeys.fr.yml b/config/locales/vehicle_journeys.fr.yml index ca8475812..be5be2382 100644 --- a/config/locales/vehicle_journeys.fr.yml +++ b/config/locales/vehicle_journeys.fr.yml @@ -2,6 +2,10 @@ fr: vehicle_journeys: vehicle_journeys_matrix: line_routes: "Séquences d'arrêts de la ligne" + fetching_error: "La récupération des missions a rencontré un problème. Rechargez la page pour tenter de corriger le problème." + show_timetable: 'Voir le calendrier' + show_purchase_window: 'Voir le calendrier commercial' + modal_confirm: 'Voulez-vous valider vos modifications avant de changer de page?' vehicle_journey: title_stopless: "Course %{name}" title: "Course partant de %{stop} à %{time}" @@ -27,7 +31,10 @@ fr: form: stop_title: "Arrêt" departure: "Départ" + departure_at: "Départ à" arrival: "Arrivée" + arrival_at: "Arrivée à" + to_arrivals: "Copie départs vers arrivées" to_arrivals: "Copie départs vers arrivées" to_departures: "Copie arrivées vers départs" time_tables: "Calendriers associés à la course" @@ -35,6 +42,12 @@ fr: slide_title: "Décaler l'ensemble des horaires de course" set: "Fixer" to: "à" + departure_range: + label: Plage horaire au départ de la course + start: Début + end: Fin + show_journeys_without_schedule: "Afficher les courses sans horaires" + show_journeys_with_calendar: "Afficher les courses avec calendrier" slide_departure: "horaire de départ au 1° arrêt à" slide_arrival: "horaire d'arrivée au 1° arrêt à" submit_timed: "Créer course" @@ -81,6 +94,7 @@ fr: line: "Ligne" route: "Séquence d'arrêt" journey_pattern: "Mission" + journey_pattern_id: "ID Mission" time_tables: "Calendriers" time_slot: "Fréquence" company: "Transporteur" @@ -112,6 +126,8 @@ fr: departure_time: "Départ" arrival_time: "Arrivée" purchase_window: "Disponibilité commerciale" + name: "Nom Course" + id: "ID Course" errors: models: vehicle_journey: diff --git a/lib/tasks/ci.rake b/lib/tasks/ci.rake index 13d7b8d73..889a5c0ad 100644 --- a/lib/tasks/ci.rake +++ b/lib/tasks/ci.rake @@ -38,7 +38,7 @@ namespace :ci do end task :jest => "ci:assets" do - sh "yarn --no-progress install" # Hack to force install jest after webpack + sh "yarn --no-progress install" # Hack to force install jest after webpack sh "node_modules/.bin/jest" unless ["CHOUETTE_JEST_DISABLED"] end @@ -59,4 +59,4 @@ namespace :ci do end desc "Run continuous integration tasks (spec, ...)" -task :ci => ["ci:setup", "ci:spec", "ci:jest", "cucumber", "ci:check_security", "ci:deploy", "ci:clean"] +task :ci => ["ci:setup", "ci:spec", "i18n:js:export", "ci:jest", "cucumber", "ci:check_security", "ci:deploy", "ci:clean"] diff --git a/package.json b/package.json index e80f5231e..25b158e3d 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,10 @@ "roots": [ "/spec/javascript" ], + "transform": { + "^.+\\.coffee$": "/spec/javascript/preprocessor.js", + "^.+\\.jsx?$": "babel-jest" + }, "testEnvironment": "jest-environment-jsdom-global", "setupFiles": [ "/spec/javascript/spec_helper.js", diff --git a/spec/javascript/preprocessor.js b/spec/javascript/preprocessor.js new file mode 100644 index 000000000..a2de8e4be --- /dev/null +++ b/spec/javascript/preprocessor.js @@ -0,0 +1,15 @@ +'use strict'; + +var coffee = require('coffeescript'); + +module.exports = { + process: function(src, filename) { + if (coffee.helpers.isCoffee(filename)) { + return coffee.compile(src, { + 'bare': false, + 'inlineMap': true + }) + } + return src; + } +}; diff --git a/spec/javascript/vehicle_journeys/components/VehicleJourneys_spec.js b/spec/javascript/vehicle_journeys/components/VehicleJourneys_spec.js index 87151c64b..2a84cb9ca 100644 --- a/spec/javascript/vehicle_journeys/components/VehicleJourneys_spec.js +++ b/spec/javascript/vehicle_journeys/components/VehicleJourneys_spec.js @@ -1,6 +1,13 @@ import React, { Component } from 'react' import VehicleJourneys from '../../../../app/javascript/vehicle_journeys/components/VehicleJourneys' import renderer from 'react-test-renderer' +import fs from 'fs' + +import I18n from '../../../../public/javascripts/i18n' +import decorateI18n from '../../../../app/assets/javascripts/i18n/extended.coffee' +window.I18n = decorateI18n(I18n) +I18n.locale = "fr" +eval(fs.readFileSync('./public/javascripts/translations.js')+'') describe('stopPointHeader', () => { set('features', () => { diff --git a/spec/javascript/vehicle_journeys/components/__snapshots__/VehicleJourneys_spec.js.snap b/spec/javascript/vehicle_journeys/components/__snapshots__/VehicleJourneys_spec.js.snap index 703f727d7..cdd34cbbd 100644 --- a/spec/javascript/vehicle_journeys/components/__snapshots__/VehicleJourneys_spec.js.snap +++ b/spec/javascript/vehicle_journeys/components/__snapshots__/VehicleJourneys_spec.js.snap @@ -19,19 +19,19 @@ exports[`stopPointHeader should display the city name 1`] = `
- ID course + ID Course
- Nom course + Nom Course
- ID mission + ID Mission
- Transporteur + transporteur
- Calendriers + calendrier
- ID course + ID Course
- Nom course + Nom Course
- ID mission + ID Mission
- Transporteur + transporteur
- Calendriers + calendrier
- Liste des horaires {minVJ} à {maxVJ} sur {pagination.totalCount} - + {I18n.t("vehicle_journeys.vehicle_journeys_matrix.pagination", {minVJ, maxVJ, total:pagination.totalCount})}
{e.preventDefault()}}> + {I18n.t('vehicle_journeys.vehicle_journeys_matrix.selected_journeys', {count: actions.getSelected(vehicleJourneys).length})} +
) } diff --git a/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js b/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js index bcfd4eb41..d3c01f154 100644 --- a/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js +++ b/app/javascript/vehicle_journeys/components/tools/EditVehicleJourney.js @@ -59,7 +59,7 @@ export default class EditVehicleJourney extends Component {
-

Informations

+

{I18n.t('vehicle_journeys.form.infos')}

×
@@ -69,7 +69,7 @@ export default class EditVehicleJourney extends Component {
- +
- +
- +
- +
- +
- +
- + +
- +
) } } diff --git a/config/locales/vehicle_journeys.en.yml b/config/locales/vehicle_journeys.en.yml index a1f20a7e8..0c8a75b0c 100644 --- a/config/locales/vehicle_journeys.en.yml +++ b/config/locales/vehicle_journeys.en.yml @@ -1,11 +1,14 @@ en: vehicle_journeys: vehicle_journeys_matrix: - line_routes: "Line's routes" + cancel_selection: "Cancel Selection" fetching_error: "There has been a problem fetching the data. Please reload the page to try again." - show_timetable: 'Show calendar' - show_purchase_window: 'Show the purchase window' + line_routes: "Line's routes" modal_confirm: 'Do you want to save mofications before moving on to the next page ?' + pagination: "Schedules %{minVJ} to %{maxVJ} over %{total}" + selected_journeys: "%{count} selected journeys" + show_purchase_window: 'Show the purchase window' + show_timetable: 'Show calendar' vehicle_journey: title_stopless: "Vehicle journey %{name}" title: "Vehicle journey leaving from %{stop} at %{time}" @@ -29,52 +32,54 @@ en: title_stopless: "Update vehicle journey %{name}" title: "Update vehicle journey %{name} leaving from %{stop} at %{time}" form: - stop_title: "Stop" - departure: "Departure" + arrival_at: "Arrival at" arrival: "Arrival" departure_at: "Departure at" - arrival_at: "Arrival at" - to_arrivals: "Copy departures to arrivals" - to_departures: "Copy arrivals to departures" - time_tables: "Associated calendars to vehicle journey" - slide: "Shift" - slide_title: "Shift all vehicle passing times" - set: "Set" - to: "at" + departure: "Departure" departure_range: label: Journey departure range start: Start end: End - show_journeys_without_schedule: "Show journeys without schedule" + infos: Informations + set: "Set" + show_arrival_time: "Show and edit arrival times" show_journeys_with_calendar: "Show journeys with calendar" - slide_departure: "departure time at first stop" + show_journeys_without_schedule: "Show journeys without schedule" slide_arrival: "arrival time at first stop" - submit_timed: "Create vehicle journey" + slide_departure: "departure time at first stop" + slide_title: "Shift all vehicle passing times" + slide: "Shift" + stop_title: "Stop" + submit_frequency_edit: "Edit frequency vehicle journey" submit_frequency: "Create frequency vehicle journey" submit_timed_edit: "Edit vehicle journey" - submit_frequency_edit: "Edit frequency vehicle journey" + submit_timed: "Create vehicle journey" + time_tables: "Associated calendars to vehicle journey" + to_arrivals: "Copy departures to arrivals" + to_departures: "Copy arrivals to departures" + to: "at" timeless: title: "Timeless vehicle journeys" vehicle_journeys: "Vehicle journeys with times at stop" vehicles_list: "Vehicle journeys list" show: - title: "Vehicle Journey %{vehicle journey}" - stop_title: "Stop" - departure: "Departure" arrival: "Arrival" - time_tables: "Calendars list" bounding: "From %{start} to %{end}" - translation_form: "Vehicle journey translations" + departure: "Departure" journey_frequencies: "Timeband" + stop_title: "Stop" + time_tables: "Calendars list" + title: "Vehicle Journey %{vehicle journey}" + translation_form: "Vehicle journey translations" index: - title: "Vehicle journeys on route %{route}" - vehicle_journeys: "Departure's times" - selection: "Filter on" - selection_all: "All" + advanced_search: "Advanced Search" select_journey_patterns: "Select journey pattern" select_time_tables: "Enter a timetable" + selection_all: "All" + selection: "Filter on" time_range: "Departure time threshold" - advanced_search: "Advanced Search" + title: "Vehicle journeys on route %{route}" + vehicle_journeys: "Departure's times" time_filter: time_range_filter: "Filter" sidebar: @@ -90,43 +95,47 @@ en: other: "vehicle journeys" attributes: vehicle_journey: - line: "Line" - route: "Route" - journey_pattern: "Journey Pattern" - journey_pattern_id: "Pattern ID" - time_tables: "Calendars" - time_slot: "Time Slot" - company: "Company" - number: "Number" + accessible: "Accessible" + arrival_time: "Arrival" + checksum: "Checksum" comment: "Comments" - status_value: "Status Value" - transport_mode: "Transport Mode" - mobility_restricted_suitability: "PRM accessibility" + company: "Company" + created_at: Created at + creator_id: "Created by" + departure_time: "Departure" + facility: "Facility" flexible_service: "On demond transportation" - unspecified_mrs: "Not specified" - accessible: "Accessible" + footnote_ids: "Footnotes" + id: "Journey ID" + journey_frequency_ids: "Timeband" + journey_name: "Name of the journey" + journey_pattern_id: "Pattern ID" + journey_pattern: "Journey Pattern" + line: "Line" + mobility_restricted_suitability: "PRM accessibility" + name: "Journey Name" not_accessible: "Not accessible" - unspecified_fs: "Not specified" + number: "Number" + object_version: "Version" + objectid: "Neptune identifier" on_demand_fs: "On demand service" - regular_fs: "Regular service" - published_journey_name: "Published Name" published_journey_identifier: "Published Identifier" - facility: "Facility" - vehicle_type_identifier: "Vehicle Type Identifier" + published_journey_name: "Published Name" + purchase_window: "Purchase availability" + regular_fs: "Regular service" + route: "Route" + status_value: "Status Value" + time_slot: "Time Slot" time_table_ids: "Calendar list" - vehicle_journey_at_stop_ids: "Time list" - journey_frequency_ids: "Timeband" - objectid: "Neptune identifier" - object_version: "Version" - created_at: Created at + time_tables: "Calendars" + train_number: "Train number" + transport_mode: "Transport Mode" + transport_submode: "Transport Submode" + unspecified_fs: "Not specified" + unspecified_mrs: "Not specified" updated_at: Updated at - creator_id: "Created by" - footnote_ids: "Footnotes" - departure_time: "Departure" - arrival_time: "Arrival" - purchase_window: "Purchase availability" - name: "Journey Name" - id: "Journey ID" + vehicle_journey_at_stop_ids: "Time list" + vehicle_type_identifier: "Vehicle Type Identifier" errors: models: vehicle_journey: diff --git a/config/locales/vehicle_journeys.fr.yml b/config/locales/vehicle_journeys.fr.yml index be5be2382..6bf167234 100644 --- a/config/locales/vehicle_journeys.fr.yml +++ b/config/locales/vehicle_journeys.fr.yml @@ -1,11 +1,14 @@ fr: vehicle_journeys: vehicle_journeys_matrix: - line_routes: "Séquences d'arrêts de la ligne" + cancel_selection: "Annuler la sélection" fetching_error: "La récupération des missions a rencontré un problème. Rechargez la page pour tenter de corriger le problème." - show_timetable: 'Voir le calendrier' - show_purchase_window: 'Voir le calendrier commercial' + line_routes: "Séquences d'arrêts de la ligne" modal_confirm: 'Voulez-vous valider vos modifications avant de changer de page?' + pagination: "Liste des horaires %{minVJ} à %{maxVJ} sur %{total}" + selected_journeys: "%{count} course(s) sélectionnée(s)" + show_purchase_window: 'Voir le calendrier commercial' + show_timetable: 'Voir le calendrier' vehicle_journey: title_stopless: "Course %{name}" title: "Course partant de %{stop} à %{time}" @@ -29,53 +32,55 @@ fr: title_stopless: "Editer la course %{name}" title: "Editer la course partant de %{stop} à %{time}" form: - stop_title: "Arrêt" - departure: "Départ" - departure_at: "Départ à" - arrival: "Arrivée" arrival_at: "Arrivée à" - to_arrivals: "Copie départs vers arrivées" - to_arrivals: "Copie départs vers arrivées" - to_departures: "Copie arrivées vers départs" - time_tables: "Calendriers associés à la course" - slide: "Décaler" - slide_title: "Décaler l'ensemble des horaires de course" - set: "Fixer" - to: "à" + arrival: "Arrivée" + departure_at: "Départ à" + departure: "Départ" departure_range: label: Plage horaire au départ de la course start: Début end: Fin - show_journeys_without_schedule: "Afficher les courses sans horaires" + infos: Informations + set: "Fixer" + show_arrival_time: "Afficher et éditer les horaires d'arrivée" show_journeys_with_calendar: "Afficher les courses avec calendrier" - slide_departure: "horaire de départ au 1° arrêt à" + show_journeys_without_schedule: "Afficher les courses sans horaires" slide_arrival: "horaire d'arrivée au 1° arrêt à" - submit_timed: "Créer course" + slide_departure: "horaire de départ au 1° arrêt à" + slide_title: "Décaler l'ensemble des horaires de course" + slide: "Décaler" + stop_title: "Arrêt" + submit_frequency_edit: "Editer course en fréquence" submit_frequency: "Créer course en fréquence" submit_timed_edit: "Editer course" - submit_frequency_edit: "Editer course en fréquence" + submit_timed: "Créer course" + time_tables: "Calendriers associés à la course" + to_arrivals: "Copie départs vers arrivées" + to_arrivals: "Copie départs vers arrivées" + to_departures: "Copie arrivées vers départs" + to: "à" timeless: title: "Courses sans horaire" vehicle_journeys: "Courses ayant des horaires" vehicles_list: "Liste des courses" show: - title: "Course au départ de %{stop} à %{time} sur la séquence %{route}" - stop_title: "Arrêt" - departure: "Départ" arrival: "Arrivée" - time_tables: "Liste des calendriers" bounding: "De %{start} à %{end}" - translation_form: "Cloner la course" + departure: "Départ" journey_frequencies: "Créneau horaire" + stop_title: "Arrêt" + time_tables: "Liste des calendriers" + title: "Course au départ de %{stop} à %{time} sur la séquence %{route}" + translation_form: "Cloner la course" index: - title: "Horaires de '%{route}'" - vehicle_journeys: "Horaires de départ aux arrêts" - selection: "Filtrer sur" - selection_all: "Tous" + advanced_search: "Recherche avancée" select_journey_patterns: "Sélectionner une mission" select_time_tables: "Saisir un calendrier" + selection_all: "Tous" + selection: "Filtrer sur" time_range: "Seuil horaire au départ" - advanced_search: "Recherche avancée" + title: "Horaires de '%{route}'" + vehicle_journeys: "Horaires de départ aux arrêts" time_filter: time_range_filter: "Filtrer" sidebar: @@ -91,43 +96,47 @@ fr: other: "courses" attributes: vehicle_journey: - line: "Ligne" - route: "Séquence d'arrêt" - journey_pattern: "Mission" - journey_pattern_id: "ID Mission" - time_tables: "Calendriers" - time_slot: "Fréquence" - company: "Transporteur" - number: "Numéro" + accessible: "Accessible" + arrival_time: "Arrivée" + checksum: "Signature métier" comment: "Commentaires" - status_value: "Etat de trafic" - transport_mode: "Mode de transport" - mobility_restricted_suitability: "Accessibilité PMR" + company: "Transporteur" + created_at: "Créé le" + creator_id: "Créé par" + departure_time: "Départ" + facility: "Equipement" flexible_service: "Transport à la demande" - unspecified_mrs: "Non spécifié" - accessible: "Accessible" + footnote_ids: "Notes de bas de page" + id: "ID Course" + journey_frequency_ids: "Créneau horaire" + journey_name: "Nom de la course" + journey_pattern_id: "ID Mission" + journey_pattern: "Mission" + line: "Ligne" + mobility_restricted_suitability: "Accessibilité PMR" + name: "Nom Course" not_accessible: "Non accessible" - unspecified_fs: "Non spécifié" + number: "Numéro" + object_version: "Version" + objectid: "Identifiant Neptune" on_demand_fs: "Service à la demande" - regular_fs: "Service régulier" - published_journey_name: "Nom public" published_journey_identifier: "Identifiant public" - facility: "Equipement" - vehicle_type_identifier: "Type d'identifiant du véhicule" + published_journey_name: "Nom public" + purchase_window: "Disponibilité commerciale" + regular_fs: "Service régulier" + route: "Séquence d'arrêt" + status_value: "Etat de trafic" + time_slot: "Fréquence" time_table_ids: "Liste des calendriers" - vehicle_journey_at_stop_ids: "Liste des horaires" - journey_frequency_ids: "Créneau horaire" - objectid: "Identifiant Neptune" - object_version: "Version" - created_at: "Créé le" + time_tables: "Calendriers" + train_number: "Numéro de train" + transport_mode: "Mode de transport" + transport_submode: "Sous-mode de transport" + unspecified_fs: "Non spécifié" + unspecified_mrs: "Non spécifié" updated_at: "Edité le" - creator_id: "Créé par" - footnote_ids: "Notes de bas de page" - departure_time: "Départ" - arrival_time: "Arrivée" - purchase_window: "Disponibilité commerciale" - name: "Nom Course" - id: "ID Course" + vehicle_journey_at_stop_ids: "Liste des horaires" + vehicle_type_identifier: "Type d'identifiant du véhicule" errors: models: vehicle_journey: -- cgit v1.2.3 From 25490fc70826d293cf57ade58776b47a5de82816 Mon Sep 17 00:00:00 2001 From: Luc Donnet Date: Thu, 8 Feb 2018 10:46:29 +0100 Subject: Add i18n-js to capistrano deployment Refs #4126 @1 --- config/deploy.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/deploy.rb b/config/deploy.rb index 9be023adc..fc60113ce 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -78,7 +78,7 @@ namespace :deploy do run "ln -nfs #{shared_path}/tmp/imports #{release_path}/tmp/imports" end after 'deploy:update_code', 'deploy:symlink_shared' - before 'deploy:assets:precompile', 'deploy:symlink_shared' + before 'deploy:assets:precompile', 'deploy:symlink_shared', "deploy:i18n_js_export" desc "Make group writable all deployed files" task :group_writable do -- cgit v1.2.3