opentripplanner / OpenTripPlanner

An open source multi-modal trip planner
http://www.opentripplanner.org
Other
2.12k stars 1.01k forks source link

Only 5 station seen in Bike sharing module in french locale #1539

Closed buma closed 3 years ago

buma commented 9 years ago

When using French locale only some stations are shown. Bug can be seen here: http://otp.acolytesanonymes.org/index.html

laurentg commented 9 years ago

Apparently it's a translation format error in the french translation, I get this in the browser console:

Uncaught [sprintf] expecting number but found string i18next-1.7.3.min.js:5
c.format i18next-1.7.3.min.js:5
c i18next-1.7.3.min.js:5
R i18next-1.7.3.min.js:5
(anonymous function) i18next-1.7.3.min.js:5
w i18next-1.7.3.min.js:5
t i18next-1.7.3.min.js:5
ngettext config.js?v=1:255
otp.modules.bikeshare.BikeShareModule.otp.Class.constructStationInfo BikeShareModule.js?v=1:319
...

The problem appears at the first station with a "bikeAvailables" value of 0 (the 6th in that case, so only 5 stations are output). I've looked at the french .po translation but did not found any error on master, @kalon33 can you check with the version you have if you have a correct translation:

msgid "<strong>%d</strong> bike available"
msgid_plural "<strong>%d</strong> bikes available"
msgstr[0] "<strong>%d</strong> vélo disponible"
msgstr[1] "<strong>%d</strong> vélos disponibles"

It could also be a bug with plural form in the I18n frawework.

kalon33 commented 9 years ago

@laurentg I'm using latest master on my server, so if you found no errors on master, I have no errors in the .po file on my server too.

----- Mail original -----

De: "Laurent Grégoire" notifications@github.com À: "opentripplanner/OpenTripPlanner" OpenTripPlanner@noreply.github.com Cc: "Nicolas Derive" kalon33@ubuntu.com Envoyé: Mercredi 24 Septembre 2014 18:11:41 Objet: Re: [OpenTripPlanner] Only 5 station seen in Bike sharing module in french locale (#1539)

Apparently it's a translation format error in the french translation, I get this in the browser console:

Uncaught [sprintf] expecting number but found string i18next-1.7.3.min.js:5 c.format i18next-1.7.3.min.js:5 c i18next-1.7.3.min.js:5 R i18next-1.7.3.min.js:5 (anonymous function) i18next-1.7.3.min.js:5 w i18next-1.7.3.min.js:5 t i18next-1.7.3.min.js:5 ngettext config.js?v=1:255 otp.modules.bikeshare.BikeShareModule.otp.Class.constructStationInfo BikeShareModule.js?v=1:319 ...

The problem appears at the first station with "bikeAvailables" is 0 (the 6th in that case, so only 5 stations are output). I've looked at the french .po translation but did not found any error on master, @kalon33 can you check with the version you have if you have a correct translation:

msgid " %d bike available" msgid_plural " %d bikes available" msgstr[0] " %d vélo disponible" msgstr[1] " %d vélos disponibles"

It could also be a bug with plural form in the I18n frawework.

— Reply to this email directly or view it on GitHub .

laurentg commented 9 years ago

OK, this is strange then, the French and English terms are equivalent regarding the snprintf format (%d in both cases). It could be a bug in the I18n framework, as we have the issue only for singular form, plural works OK. Maybe the accented letter could cause the issue? @kalon33 could you test to remove the accented letter in the french .po files for msgid "%d bike available" translation and see if that solve the issue?

buma commented 9 years ago

I think 0 might be a problem. I'll try to look into it. If you change accent change it in https://github.com/opentripplanner/OpenTripPlanner/blob/master/src/client/js/otp/locale/fr.json Po is converted to json.

buma commented 9 years ago

Definitely something with 0 and French locale. In Slovenian locale 0 works OK. But in French 0 is not plural, but singular and something doesn't work here. I have to debug it in i18next.

buma commented 9 years ago

This part of the code seems fishy:

            var pluralExtension = pluralExtensions.get(lngs[0], options.count);
            if (pluralExtension >= 0) {
                pluralKey = pluralKey + '_' + pluralExtension;
            } else if (pluralExtension === 1) {
                pluralKey = ns + o.nsseparator + key; // singular
            }

pluralExtension.get gets which plural should be used. It correctly figures out that for 0 in French singular should be used so it returns 1. After that first conditional is evaluated and _plural_1 is used as key. But only _plural key exists and second conditional should be used. (I can't find a value that would else if but not if.) I have to check if this is a bug in json generation or i18next.

buma commented 9 years ago

This is a fr.json file that works. (plural_1 is added). But I have to find a reason why plural_1 isn't added otherwise. @kalon33: Try with this file.

{
    "Transit": "Transports en commun",
    "Bus Only": "Bus uniquement",
    "Rail Only": "Ferré uniquement",
    "Bicycle Only": "Vélo uniquement",
    "Bicycle &amp; Transit": "Transports en commun + Vélo",
    "Walk Only": "Marche seulement",
    "Drive Only": "Voiture seulement",
    "Park and Ride": "Parc Relais",
    "Kiss and Ride": "arrêt minute",
    "Bike and Ride": "Parc Relais Vélo",
    "Rented Bicycle": "Vélo Libre Service",
    "Transit & Rented Bicycle": "Transports en commun et Vélo Libre Service",
    "Recenter Map Here": "Centrer la carte ici",
    "Zoom In": "Zoomer",
    "Zoom Out": "Dézoomer",
    "Minimize all": "Tout minimiser",
    "Unminimize all": "Tout restaurer",
    "Stop Viewer": "Visualisateur d'arrêt",
    "Plan Trip": "Organiser un voyage",
    "From Stop": "De l'arrêt",
    "To Stop": "À l'arrêt",
    "Routes Serving Stop": "Lignes desservant l'arrêt",
    "Legend : travel time in minutes": "Légende : temps de trajet en minutes",
    "Analyst": "Analyseur",
    "Refresh": "Rafraîchir",
    "Set as Analysis Location": "Définir comme origine de l'analyse",
    "Bike Share Planner": "Organisation en Vélo Libre Service",
    "Trip Options": "Paramètres de l'itinéraire",
    "PICK UP BIKE": "Récupérer un vélo",
    "ALTERNATE PICKUP": "Alternative de récupération de vélo",
    "DROP OFF BIKE": "Déposer le vélo",
    "ALTERNATE DROP OFF": "Alternative de dépôt de vélo",
    "BIKE STATION": "Station de vélos",
    "Station:": "Station :",
    "<strong>%d</strong> bike available": "<strong>%d</strong> vélo disponible",
    "<strong>%d</strong> bike available_plural_1": "<strong>%d</strong> vélo disponible",
    "<strong>%d</strong> bike available_plural": "<strong>%d</strong> vélos disponibles",
    "<strong>%d</strong> dock available": "<strong>%d</strong> emplacements disponibles",
    "<strong>%d</strong> dock available_plural": "<strong>%d</strong> emplacements disponibles",
    "<strong>%d</strong> dock available_plural_1": "<strong>%d</strong> emplacements disponibles",
    "Recommended Pick Up:": "Station de récupération de vélo recommandée :",
    "Recommended Drop Off:": "Station de dépôt de vélo recommandée",
    "Multimodal Trip Planner": "Planificateur d'itinéraires multimodal",
    "Itineraries": "Itinéraires",
    "%d Itinerary Returned": "%d itinéraire trouvé",
    "%d Itinerary Returned_plural": "%d itinéraires trouvés",
    "%d Itinerary Returned_plural_1": "%d itinéraire trouvé",
    "Link to search": "Lien vers cette recherche",
    "First": "Premier",
    "Previous": "Précédent",
    "Next": "Suivant",
    "Last": "Dernier",
    "CONTINUES AS": "Continue comme",
    "%d min late": "en retard de %d min",
    "%d min late_plural_1": "en retard de %d min",
    "%d min late_plural": "en retard de %d mins",
    "%d min early": "en avance de %d min",
    "%d min early_plural_1": "en avance de %d min",
    "%d min early_plural": "en avance de %d mins",
    "on time": "à l'heure",
    "Total walk distance for this trip exceeds specified maximum": "La distance de marche totale pour ce voyage excède le maximum spécifié",
    "End": "Arrivée",
    "Trip Summary": "Résumé du voyage",
    "Travel": "Voyage",
    "Time": "Durée",
    "Total Walk": "Total de marche",
    "Total Bike": "Total de vélo",
    "Transfers": "correspondances",
    "Fare": "Tarif",
    "Valid": "Valide le",
    "Link to Itinerary": "Lien vers l'itinéraire",
    "Print": "Imprimer",
    "Your Trip": "Votre voyage",
    "Email": "Courriel",
    "every %d min": "toutes les %d min",
    "every %d min_plural_1": "toutes les %d min",
    "every %d min_plural": "toutes les %d mins",
    "<b>Board</b> at ": "<b>Montez</b> à ",
    "Stop": "Arrêt",
    "Time in transit": "Temps de correspondance",
    "Trip Viewer": "Visualisateur de voyage",
    "late as": "en retard à",
    "Stay on board": "rester à bord",
    "Alight": "Descendre",
    "at": "à",
    "%(currency)s %(price)s": "%(price)s %(currency)s",
    "Start: %(location)s at %(time_date)s": "Départ : %(location)s à %(time_date)s",
    "Board": "Monter",
    "(%(agency_id)s Stop ID #%(stop_id)s),": "arrêt #%(stop_id)s) de (%(agency_id)s,",
    "End: %(location)s at %(time_date)s": "Arrivée : %(location)s à %(time_date)s",
    "\nView itinerary online:\n%(itinerary_link)s\n": [
        "",
        "Voir l'itinéraire en ligne :",
        "%(itinerary_link)s",
        ""
    ],
    "We're sorry. The trip planner is temporarily unavailable. Please try again later.": "Nous sommes désolé. Le planificateur de voyage est temporairement indisponible. Merci de réessayer plus tard.",
    "Trip is not possible.  You might be trying to plan a trip outside the map data boundary.": "Ce trajet n'est pas possible. Vous essayez probablement de planifier un trajet en dehors des limites de la zone couverte.",
    "Trip is not possible.  Your start or end point might not be safely accessible (for instance), you might be starting on a residential street connected only to a highway).": "Ce trajet n'est pas possible. Vos points de départ et d'arrivée peuvent ne pas être accessible de manière sûre (par exemple, vous commencez peut être votre trajet sur une route résidentielle uniquement reliée à une autoroute).",
    "No transit times available. The date may be past or too far in the future or there may not be transit service for your trip at the time you chose.": "Aucune durée de voyage disponible. La date est peut être passée ou trop loin dans le futur, ou il n'y a peut être pas de transports en service pour votre trajet à l'heure choisie.",
    "The trip planner is taking way too long to process your request. Please try again later.": "Le planificateur de voyage prend largement trop de temps à étudier votre demande. Merci de réessayer plus tard.",
    "The request has errors that the server is not willing or able to process.": "La requête renvoie des erreurs que le serveur ne souhaite ou ne peut pas traiter.",
    "Origin is unknown. Can you be a bit more descriptive?": "L'origine est inconnue. Pouvez-vous être plus précis ?",
    "Destination is unknown.  Can you be a bit more descriptive?": "La destination est inconnue. Pouvez-vous être plus précis ?",
    "Both origin and destination are unknown. Can you be a bit more descriptive?": "L'origine et la destination sont toutes deux inconnues. Pouvez-vous être plus précis ?",
    "Both origin and destination are not wheelchair accessible": "Ni l'origine ni la destination ne sont accessible en fauteuil roulant",
    "Origin is within a trivial distance of the destination.": "L'origine est à une distance trop courte de la destination.",
    "The trip planner is unsure of the location you want to start from. Please select from the following options, or be more specific.": "Le planificateur de voyage n'est pas sûr du lieu d'où vous voulez partir. Merci de le sélectionner parmi les options suivantes, ou d'être plus précis.",
    "The trip planner is unsure of the destination you want to go to. Please select from the following options, or be more specific.": "Le planificateur de voyage n'est pas sûr du lieu où vous désirez vous rendre. Merci de le sélectionner parmi les options suivantes, ou d'être plus précis.",
    "Both origin and destination are ambiguous. Please select from the following options, or be more specific.": "L'origine et la destination sont toutes deux ambigües. Merci de les sélectionner parmi les options suivantes, ou d'être plus précis.",
    "All of triangleSafetyFactor, triangleSlopeFactor, and triangleTimeFactor must be set if any are": "Toutes les options triangleSafetyFactor, triangleSlopeFactor, et triangleTimeFactor doivent être paramétrées si l'une d'elles l'est",
    "The values of triangleSafetyFactor, triangleSlopeFactor, and triangleTimeFactor must sum to 1": "Les valeurs de triangleSafetyFactor, triangleSlopeFactor, et triangleTimeFactor doivent avoir pour addition 1",
    "If triangleSafetyFactor, triangleSlopeFactor, and triangleTimeFactor are provided, OptimizeType must be TRIANGLE": "Si triangleSafetyFactor, triangleSlopeFactor, et triangleTimeFactor sont fournis, OptimizeType doit être TRIANGLE",
    "If OptimizeType is TRIANGLE, triangleSafetyFactor, triangleSlopeFactor, and triangleTimeFactor must be set": "Si OptimizeType est TRIANGLE, triangleSafetyFactor, triangleSlopeFactor, et triangleTimeFactor doivent être paramétrées",
    "Set as Start Location": "Définir comme point de départ",
    "Set as End Location": "Définir comme point d'arrivée",
    "Destination": "Destination",
    "Error %(error_id)d": "Erreur %(error_id)d",
    "No Trip Found": "Aucun voyage trouvé",
    "Your %(bike_share_name)s route": "Votre itinéraire en %(bike_share_name)s",
    "Your bike route": "Votre itinéraire en vélo",
    "Walk to the %(bike_share_name)s dock.": "Marcher jusqu'à l'emplacement %(bike_share_name)s.",
    "Walk from the %(bike_share_name)s dock to your destination.": "Marcher de l'emplacement %(bike_share_name)s jusqu'à votre destination",
    "Your walk route": "Votre itinéraire à pieds",
    "north": "nord",
    "northeast": "nord-est",
    "east": "est",
    "southeast": "sud-est",
    "south": "sud",
    "southwest": "sud-ouest",
    "west": "ouest",
    "northwest": "nord-ouest",
    "hard left": "complètement à gauche",
    "left": "à gauche",
    "slight left": "légèrement à gauche",
    "continue": "continuer",
    "slight right": "légèrement à droite",
    "right": "à droite",
    "hard right": "complètement à droite",
    "elevator": "ascenseur",
    "U-turn left": "virage en U à gauche",
    "U-turn right": "virage en U à droite",
    "Walk": "Marche à pied",
    "Cycle": "Vélo",
    "Car": "Voiture",
    "Bus": "Bus",
    "Subway": "Métro",
    "Train": "Train",
    "Ferry": "Ferry",
    "Light Rail": "Tram ou Trolley",
    "Cable Car": "Tramway funiculaire",
    "Funicular": "Funiculaire",
    "Aerial Tram": "Téléphérique",
    "Take roundabout <b>counterclockwise</b> to <b>%(ordinal_exit_number)s</b> exit on <b>%(street_name)s</b>": "Prendre le rond-point <b>dans le sens contraire des aiguilles d'une montre</b> jusqu'à la <b>%(ordinal_exit_number)s</b> sortie sur <b>%(street_name)s</b>",
    "Take roundabout counterclockwise to %(ordinal_exit_number)s exit on %(street_name)s": "Prendre le rond-point dans le sens contraire des aiguilles d'une montre jusqu'à la %(ordinal_exit_number)s sortie sur %(street_name)s",
    "Take roundabout <b>clockwise</b> to <b>%(ordinal_exit_number)s</b> exit on <b>%(street_name)s</b>": "Prendre le rond-point <b>dans le sens des aiguilles d'une montre</b> jusqu'à la <b>%(ordinal_exit_number)s</b> sortie sur <b>%(street_name)s</b>",
    "Take roundabout clockwise to %(ordinal_exit_number)s exit on %(street_name)s": "Prendre le rond-point dans le sens des aiguilles d'une montre jusqu'à la %(ordinal_exit_number)s sortie sur %(street_name)s",
    "Start on": "Partir de",
    " heading ": " vers le ",
    "to continue on": "pour continuer sur",
    "on to": "sur",
    "first": "première",
    "second": "seconde",
    "third": "troisième",
    "fourth": "quatrième",
    "fifth": "cinquième",
    "sixth": "sixième",
    "seventh": "septième",
    "eight": "huitième",
    "ninth": "neuvième",
    "tenth": "dixième",
    "%d hr": "%d h",
    "%d hr_plural_1": "%d h",
    "%d hr_plural": "%d h",
    "%d min": "%d min",
    "%d min_plural_1": "%d min",
    "%d min_plural": "%d mins",
    "%d sec": "%d s",
    "%d sec_plural_1": "%d s",
    "%d sec_plural": "%d s",
    "OK": "OK",
    "Minimize": "Minimiser",
    "Bring to front": "Placer au dessus",
    "Send to back": "Placer en dessous",
    "Route:": "Ligne :",
    "Variant:": "Variante :",
    "Stop Finder": "Recherche d'arrêt",
    "Agency": "Transporteur",
    "By ID": "Par identifiant",
    "By Name": "Par nom",
    "Search": "Recherche",
    "No Stops Found": "Aucun arrêt trouvé",
    "Date": "Date",
    "Find Stops": "Trouver les arrêts",
    "(No Stop Selected)": "(Aucun arrêt sélectionné)",
    "Block": "Bloc",
    "Recenter": "Recentrer",
    "Viewer": "Visualisateur",
    "Quick": "Le plus Rapide",
    "Flat": "Le plus Plat",
    "Bike Friendly": "Adapté au vélo",
    "B": "A",
    "F": "P",
    "Q": "R",
    "All Routes": "Tous les itinéraires",
    "Save": "Sauvegarder",
    "Close": "Fermer",
    "Travel Options": "Paramètres de voyage",
    "Geocoder": "Géocodeur",
    "Arrive": "Arrivée",
    "Now": "Maintenant",
    "Wheelchair accesible trip:": "Accessible aux fauteuils roulants:",
    "Travel by": "Voyager par",
    "Presets": "Val. pré-définies",
    "Maximum walk": "Marcher au maximum",
    "Maximum bike": "Parcours à vélo maximum",
    "Preferred Routes": "Itinéraires préférés",
    "Edit": "Modifier",
    "None": "Aucune",
    "Weight": "Pondération",
    "Banned routes": "Itinéraires à éviter",
    "Use": "Utiliser",
    "My Own Bike": "mon propre vélo",
    "A Shared Bike": "un Vélo Libre Service",
    "Plan Your Trip": "Calculer votre itinéraire",
    " to _direction": " jusqu'à ",
    " to _bus_direction": " vers ",
    "Start_template": "Départ",
    "Depart_itinerary": "Départ",
    "depart_itinerary": "Départ",
    "Start_popup": "Départ",
    "Depart_tripoptions": "Départ"
}
kalon33 commented 9 years ago

@buma with your corrected fr.json, that works properly, and I'm able to see all the stations (feel free to test on my server, I fixed it with your patched file). Thanks :)

----- Mail original -----

De: "Marko Burjek" notifications@github.com À: "opentripplanner/OpenTripPlanner" OpenTripPlanner@noreply.github.com Cc: "Nicolas Derive" kalon33@ubuntu.com Envoyé: Mercredi 24 Septembre 2014 20:10:06 Objet: Re: [OpenTripPlanner] Only 5 station seen in Bike sharing module in french locale (#1539)

This is a fr.json file that works. (plural_1 is added). But I have to find a reason why plural_1 isn't added otherwise. @kalon33 : Try with this file. { "Transit" : "Transports en commun" , "Bus Only" : "Bus uniquement" , "Rail Only" : "Ferré uniquement" , "Bicycle Only" : "Vélo uniquement" , "Bicycle & Transit" : "Transports en commun + Vélo" , "Walk Only" : "Marche seulement" , "Drive Only" : "Voiture seulement" , "Park and Ride" : "Parc Relais" , "Kiss and Ride" : "arrêt minute" , "Bike and Ride" : "Parc Relais Vélo" , "Rented Bicycle" : "Vélo Libre Service" , "Transit & Rented Bicycle" : "Transports en commun et Vélo Libre Service" , "Recenter Map Here" : "Centrer la carte ici" , "Zoom In" : "Zoomer" , "Zoom Out" : "Dézoomer" , "Minimize all" : "Tout minimiser" , "Unminimize all" : "Tout restaurer" , "Stop Viewer" : "Visualisateur d'arrêt" , "Plan Trip" : "Organiser un voyage" , "From Stop" : "De l'arrêt" , "To Stop" : "À l'arrêt" , "Routes Serving Stop" : "Lignes desservant l'arrêt" , "Legend : travel time in minutes" : "Légende : temps de trajet en minutes" , "Analyst" : "Analyseur" , "Refresh" : "Rafraîchir" , "Set as Analysis Location" : "Définir comme origine de l'analyse" , "Bike Share Planner" : "Organisation en Vélo Libre Service" , "Trip Options" : "Paramètres de l'itinéraire" , "PICK UP BIKE" : "Récupérer un vélo" , "ALTERNATE PICKUP" : "Alternative de récupération de vélo" , "DROP OFF BIKE" : "Déposer le vélo" , "ALTERNATE DROP OFF" : "Alternative de dépôt de vélo" , "BIKE STATION" : "Station de vélos" , "Station:" : "Station :" , "%d bike available" : "%d vélo disponible" , "%d bike available_plural_1" : "%d vélo disponible" , "%d bike available_plural" : "%d vélos disponibles" , "%d dock available" : "%d emplacements disponibles" , "%d dock available_plural" : "%d emplacements disponibles" , "%d dock available_plural_1" : "%d emplacements disponibles" , "Recommended Pick Up:" : "Station de récupération de vélo recommandée :" , "Recommended Drop Off:" : "Station de dépôt de vélo recommandée" , "Multimodal Trip Planner" : "Planificateur d'itinéraires multimodal" , "Itineraries" : "Itinéraires" , "%d Itinerary Returned" : "%d itinéraire trouvé" , "%d Itinerary Returned_plural" : "%d itinéraires trouvés" , "%d Itinerary Returned_plural_1" : "%d itinéraire trouvé" , "Link to search" : "Lien vers cette recherche" , "First" : "Premier" , "Previous" : "Précédent" , "Next" : "Suivant" , "Last" : "Dernier" , "CONTINUES AS" : "Continue comme" , "%d min late" : "en retard de %d min" , "%d min late_plural_1" : "en retard de %d min" , "%d min late_plural" : "en retard de %d mins" , "%d min early" : "en avance de %d min" , "%d min early_plural_1" : "en avance de %d min" , "%d min early_plural" : "en avance de %d mins" , "on time" : "à l'heure" , "Total walk distance for this trip exceeds specified maximum" : "La distance de marche totale pour ce voyage excède le maximum spécifié" , "End" : "Arrivée" , "Trip Summary" : "Résumé du voyage" , "Travel" : "Voyage" , "Time" : "Durée" , "Total Walk" : "Total de marche" , "Total Bike" : "Total de vélo" , "Transfers" : "correspondances" , "Fare" : "Tarif" , "Valid" : "Valide le" , "Link to Itinerary" : "Lien vers l'itinéraire" , "Print" : "Imprimer" , "Your Trip" : "Votre voyage" , "Email" : "Courriel" , "every %d min" : "toutes les %d min" , "every %d min_plural_1" : "toutes les %d min" , "every %d min_plural" : "toutes les %d mins" , "Board at " : "Montez à " , "Stop" : "Arrêt" , "Time in transit" : "Temps de correspondance" , "Trip Viewer" : "Visualisateur de voyage" , "late as" : "en retard à" , "Stay on board" : "rester à bord" , "Alight" : "Descendre" , "at" : "à" , "%(currency)s %(price)s" : "%(price)s %(currency)s" , "Start: %(location)s at %(time_date)s" : "Départ : %(location)s à %(time_date)s" , "Board" : "Monter" , "(%(agency_id)s Stop ID #%(stop_id)s)," : "arrêt #%(stop_id)s) de (%(agency_id)s," , "End: %(location)s at %(time_date)s" : "Arrivée : %(location)s à %(time_date)s" , "\nView itinerary online:\n%(itinerary_link)s\n" : [ "" , "Voir l'itinéraire en ligne :" , "%(itinerary_link)s" , "" ], "We're sorry. The trip planner is temporarily unavailable. Please try again later." : "Nous sommes désolé. Le planificateur de voyage est temporairement indisponible. Merci de réessayer plus tard." , "Trip is not possible. You might be trying to plan a trip outside the map data boundary." : "Ce trajet n'est pas possible. Vous essayez probablement de planifier un trajet en dehors des limites de la zone couverte." , "Trip is not possible. Your start or end point might not be safely accessible (for instance), you might be starting on a residential street connected only to a highway)." : "Ce trajet n'est pas possible. Vos points de départ et d'arrivée peuvent ne pas être accessible de manière sûre (par exemple, vous commencez peut être votre trajet sur une route résidentielle uniquement reliée à une autoroute)." , "No transit times available. The date may be past or too far in the future or there may not be transit service for your trip at the time you chose." : "Aucune durée de voyage disponible. La date est peut être passée ou trop loin dans le futur, ou il n'y a peut être pas de transports en service pour votre trajet à l'heure choisie." , "The trip planner is taking way too long to process your request. Please try again later." : "Le planificateur de voyage prend largement trop de temps à étudier votre demande. Merci de réessayer plus tard." , "The request has errors that the server is not willing or able to process." : "La requête renvoie des erreurs que le serveur ne souhaite ou ne peut pas traiter." , "Origin is unknown. Can you be a bit more descriptive?" : "L'origine est inconnue. Pouvez-vous être plus précis ?" , "Destination is unknown. Can you be a bit more descriptive?" : "La destination est inconnue. Pouvez-vous être plus précis ?" , "Both origin and destination are unknown. Can you be a bit more descriptive?" : "L'origine et la destination sont toutes deux inconnues. Pouvez-vous être plus précis ?" , "Both origin and destination are not wheelchair accessible" : "Ni l'origine ni la destination ne sont accessible en fauteuil roulant" , "Origin is within a trivial distance of the destination." : "L'origine est à une distance trop courte de la destination." , "The trip planner is unsure of the location you want to start from. Please select from the following options, or be more specific." : "Le planificateur de voyage n'est pas sûr du lieu d'où vous voulez partir. Merci de le sélectionner parmi les options suivantes, ou d'être plus précis." , "The trip planner is unsure of the destination you want to go to. Please select from the following options, or be more specific." : "Le planificateur de voyage n'est pas sûr du lieu où vous désirez vous rendre. Merci de le sélectionner parmi les options suivantes, ou d'être plus précis." , "Both origin and destination are ambiguous. Please select from the following options, or be more specific." : "L'origine et la destination sont toutes deux ambigües. Merci de les sélectionner parmi les options suivantes, ou d'être plus précis." , "All of triangleSafetyFactor, triangleSlopeFactor, and triangleTimeFactor must be set if any are" : "Toutes les options triangleSafetyFactor, triangleSlopeFactor, et triangleTimeFactor doivent être paramétrées si l'une d'elles l'est" , "The values of triangleSafetyFactor, triangleSlopeFactor, and triangleTimeFactor must sum to 1" : "Les valeurs de triangleSafetyFactor, triangleSlopeFactor, et triangleTimeFactor doivent avoir pour addition 1" , "If triangleSafetyFactor, triangleSlopeFactor, and triangleTimeFactor are provided, OptimizeType must be TRIANGLE" : "Si triangleSafetyFactor, triangleSlopeFactor, et triangleTimeFactor sont fournis, OptimizeType doit être TRIANGLE" , "If OptimizeType is TRIANGLE, triangleSafetyFactor, triangleSlopeFactor, and triangleTimeFactor must be set" : "Si OptimizeType est TRIANGLE, triangleSafetyFactor, triangleSlopeFactor, et triangleTimeFactor doivent être paramétrées" , "Set as Start Location" : "Définir comme point de départ" , "Set as End Location" : "Définir comme point d'arrivée" , "Destination" : "Destination" , "Error %(error_id)d" : "Erreur %(error_id)d" , "No Trip Found" : "Aucun voyage trouvé" , "Your %(bike_share_name)s route" : "Votre itinéraire en %(bike_share_name)s" , "Your bike route" : "Votre itinéraire en vélo" , "Walk to the %(bike_share_name)s dock." : "Marcher jusqu'à l'emplacement %(bike_share_name)s." , "Walk from the %(bike_share_name)s dock to your destination." : "Marcher de l'emplacement %(bike_share_name)s jusqu'à votre destination" , "Your walk route" : "Votre itinéraire à pieds" , "north" : "nord" , "northeast" : "nord-est" , "east" : "est" , "southeast" : "sud-est" , "south" : "sud" , "southwest" : "sud-ouest" , "west" : "ouest" , "northwest" : "nord-ouest" , "hard left" : "complètement à gauche" , "left" : "à gauche" , "slight left" : "légèrement à gauche" , "continue" : "continuer" , "slight right" : "légèrement à droite" , "right" : "à droite" , "hard right" : "complètement à droite" , "elevator" : "ascenseur" , "U-turn left" : "virage en U à gauche" , "U-turn right" : "virage en U à droite" , "Walk" : "Marche à pied" , "Cycle" : "Vélo" , "Car" : "Voiture" , "Bus" : "Bus" , "Subway" : "Métro" , "Train" : "Train" , "Ferry" : "Ferry" , "Light Rail" : "Tram ou Trolley" , "Cable Car" : "Tramway funiculaire" , "Funicular" : "Funiculaire" , "Aerial Tram" : "Téléphérique" , "Take roundabout counterclockwise to %(ordinal_exit_number)s exit on %(street_name)s" : "Prendre le rond-point dans le sens contraire des aiguilles d'une montre jusqu'à la %(ordinal_exit_number)s sortie sur %(street_name)s" , "Take roundabout counterclockwise to %(ordinal_exit_number)s exit on %(street_name)s" : "Prendre le rond-point dans le sens contraire des aiguilles d'une montre jusqu'à la %(ordinal_exit_number)s sortie sur %(street_name)s" , "Take roundabout clockwise to %(ordinal_exit_number)s exit on %(street_name)s" : "Prendre le rond-point dans le sens des aiguilles d'une montre jusqu'à la %(ordinal_exit_number)s sortie sur %(street_name)s" , "Take roundabout clockwise to %(ordinal_exit_number)s exit on %(street_name)s" : "Prendre le rond-point dans le sens des aiguilles d'une montre jusqu'à la %(ordinal_exit_number)s sortie sur %(street_name)s" , "Start on" : "Partir de" , " heading " : " vers le " , "to continue on" : "pour continuer sur" , "on to" : "sur" , "first" : "première" , "second" : "seconde" , "third" : "troisième" , "fourth" : "quatrième" , "fifth" : "cinquième" , "sixth" : "sixième" , "seventh" : "septième" , "eight" : "huitième" , "ninth" : "neuvième" , "tenth" : "dixième" , "%d hr" : "%d h" , "%d hr_plural_1" : "%d h" , "%d hr_plural" : "%d h" , "%d min" : "%d min" , "%d min_plural_1" : "%d min" , "%d min_plural" : "%d mins" , "%d sec" : "%d s" , "%d sec_plural_1" : "%d s" , "%d sec_plural" : "%d s" , "OK" : "OK" , "Minimize" : "Minimiser" , "Bring to front" : "Placer au dessus" , "Send to back" : "Placer en dessous" , "Route:" : "Ligne :" , "Variant:" : "Variante :" , "Stop Finder" : "Recherche d'arrêt" , "Agency" : "Transporteur" , "By ID" : "Par identifiant" , "By Name" : "Par nom" , "Search" : "Recherche" , "No Stops Found" : "Aucun arrêt trouvé" , "Date" : "Date" , "Find Stops" : "Trouver les arrêts" , "(No Stop Selected)" : "(Aucun arrêt sélectionné)" , "Block" : "Bloc" , "Recenter" : "Recentrer" , "Viewer" : "Visualisateur" , "Quick" : "Le plus Rapide" , "Flat" : "Le plus Plat" , "Bike Friendly" : "Adapté au vélo" , "B" : "A" , "F" : "P" , "Q" : "R" , "All Routes" : "Tous les itinéraires" , "Save" : "Sauvegarder" , "Close" : "Fermer" , "Travel Options" : "Paramètres de voyage" , "Geocoder" : "Géocodeur" , "Arrive" : "Arrivée" , "Now" : "Maintenant" , "Wheelchair accesible trip:" : "Accessible aux fauteuils roulants:" , "Travel by" : "Voyager par" , "Presets" : "Val. pré-définies" , "Maximum walk" : "Marcher au maximum" , "Maximum bike" : "Parcours à vélo maximum" , "Preferred Routes" : "Itinéraires préférés" , "Edit" : "Modifier" , "None" : "Aucune" , "Weight" : "Pondération" , "Banned routes" : "Itinéraires à éviter" , "Use" : "Utiliser" , "My Own Bike" : "mon propre vélo" , "A Shared Bike" : "un Vélo Libre Service" , "Plan Your Trip" : "Calculer votre itinéraire" , " to _direction" : " jusqu'à " , " to _bus_direction" : " vers " , "Start_template" : "Départ" , "Depart_itinerary" : "Départ" , "depart_itinerary" : "Départ" , "Start_popup" : "Départ" , "Depart_tripoptions" : "Départ" }

— Reply to this email directly or view it on GitHub .

kalon33 commented 9 years ago

@buma so this needs the french .po file to be patched?

buma commented 9 years ago

No. Po file is correct.

Probably converter from PO to json needs to be fixed. It has some exceptions for french but I have to figure it out if they work.

kalon33 commented 9 years ago

@buma Do you have some news about this one? Thanks :)

buma commented 9 years ago

I'll change translation library pretty soon. This will fix this issue and some others. My plan is to do it really soon.

buma commented 9 years ago

I did some tests and with newest translation library version there are no problems in French plural forms. But there are problems in german (since it doesn't have translations). So I tested with Jed. Here is a branch which uses Jed translation library it should fix all problems according to my tests.

More about it in issue #1961.

abyrd commented 3 years ago

Closing since the cause has been identified and documented in #1961.