// I18n is slightly modified version of babilu.js from Tore Darell

var I18n = I18n || (function() {
    // Replace {{foo}} with obj.foo
    function interpolate(string, object) {
        return string.replace(/\{\{([^}]+)\}\}/g, function() {
            return object[arguments[1]] || arguments[0];
        });
    };

    // Split "foo.bar" to ["foo", "bar"] if key is a string
    function keyToArray(key) {
        if(!key) {
            return [];
        }
        if(typeof key != "string") {
            return key;
        }
        return key.split('.');
    };

    // Looks up a translation using an array of strings where the last
    // is the key and any string before that define the scope. The
    // current locale is always prepended and does not need to be
    // provided. The second parameter is an array of strings used as
    // defaults if the key can not be found. If a key starts with ":"
    // it is used as a key for lookup.  This method does not perform
    // pluralization or interpolation.
    function lookup(keys, defaults) {
        var i = 0, value = I18n.translations;
        defaults = (typeof defaults === "string") ? [defaults] : (defaults || []);
        while(keys[i]) {
            value = value && value[keys[i]];
            i++;
        }
        if(value) {
            return value;
        } else {
            if(defaults.length === 0) {
                return null;
            } else if (defaults[0].substr(0,1) === ':') {
                return lookup(keys.slice(0, keys.length - 1).concat(keyToArray(defaults[0].substr(1))), defaults.slice(1));
            } else {
                return defaults[0];
            }
        }
    };

    // Returns other when 0 given
    function pluralize(value, count) {
        if(count === undefined) return value;
        return count === 1 ? value.one : value.other;
    };

    // Works mostly the same as the Ruby equivalent, except there are
    // no symbols in JavaScript, so keys are always strings. The only
    // time this makes a difference is when differentiating between
    // keys and values in the defaultValue option. Strings starting
    // with ":" will be considered to be keys and used for lookup,
    // while other strings are returned as-is.
    function translate(key, options) {
        if(typeof key != "string") {
            // Bulk lookup
            var a = [], i;
            for(i = 0; i < key.length; i++) {
                a.push(translate(key[i], options));
            }
            return a;
        } else {
            options = options || {};
            options.defaultValue = options.defaultValue || null;
            key = keyToArray(options.scope).concat(keyToArray(key));
            var value = lookup(key, options.defaultValue);
            if(typeof value !== "string" && value) {
                value = pluralize(value, options.count);
            }
            if(typeof value === "string") {
                value = interpolate(value, options);
            }
            return value;
        }
    }

    return {
        translate: translate,
        t: translate
    };
})();

I18n.locale = I18n.locale || "fr";
I18n.translations = I18n.translations || {"activerecord": {"attributes": {"customer_message": {"contact_name": "Personne \u00e0 contacter","fax_number": "Fax","name": "Nom","phone_number": "T\u00e9l\u00e9phone","postal_address": "Adresse"},"customer_quote": {"arrival_at": "Date de retour","arrival_place": "Lieu d'arriv\u00e9e","departure_at": "Date de d\u00e9part","departure_place": "Lieu de d\u00e9part","people_count": "Nombre de personnes","round_trip": "Voyage Aller-Retour"},"customer_reclamation": {"line": "Ligne","occured_at": "Date de l'incident","stop_area": "Arr\u00eat","vehicule_id": "Num\u00e9ro du bus"}},"errors": {"messages": {"accepted": "doit \u00eatre accept\u00e9(e)","blank": "doit \u00eatre rempli(e)","confirmation": "ne concorde pas avec la confirmation","empty": "doit \u00eatre rempli(e)","equal_to": "doit \u00eatre \u00e9gal \u00e0 {{count}}","even": "doit \u00eatre pair","exclusion": "n'est pas disponible","greater_than": "doit \u00eatre sup\u00e9rieur \u00e0 {{count}}","greater_than_or_equal_to": "doit \u00eatre sup\u00e9rieur ou \u00e9gal \u00e0 {{count}}","inclusion": "n'est pas inclus(e) dans la liste","invalid": "n'est pas valide","less_than": "doit \u00eatre inf\u00e9rieur \u00e0 {{count}}","less_than_or_equal_to": "doit \u00eatre inf\u00e9rieur ou \u00e9gal \u00e0 {{count}}","not_a_number": "n'est pas un nombre","odd": "doit \u00eatre impair","taken": "n'est pas disponible","too_long": "est trop long (pas plus de {{count}} caract\u00e8res)","too_short": "est trop court (au moins {{count}} caract\u00e8res)","wrong_length": "ne fait pas la bonne longueur (doit comporter {{count}} caract\u00e8res)"},"template": {"body": "Veuillez v\u00e9rifier les champs suivants\u00a0:","header": {"one": "Impossible d'enregistrer {{model}}: 1 erreur","other": "Impossible d'enregistrer {{model}}: {{count}} erreurs."}}},"models": {"customer_message": "Message","customer_quote": "Demande de devis","customer_reclamation": "R\u00e9clamation","customer_suggestion": "Suggestion"}},"customer_messages": {"create": {"flash": {"error": "Merci de compl\u00e9ter les informations","success": "Merci, votre message a \u00e9t\u00e9 transmis"}},"new": {"header": "Ce formulaire vous permet d\u2019effectuer une demande d\u2019information, de nous faire part d\u2019un incident ou de nous faire part d\u2019une demande de devis pour un \u00ab service sp\u00e9cial \u00bb.\n\nNous vous remercions de le remplir dans le d\u00e9tail afin que nous puissions vous adresser une r\u00e9ponse pr\u00e9cise dans les meilleurs d\u00e9lais.\n","object_name": "votre message","quote": {"header": "Vous souhaitez b\u00e9n\u00e9ficier d\u2019un service sp\u00e9cifique. Nous mettons en \u0153uvre notre professionnalisme pour vous apporter toute satisfaction.\n"},"reclamation": {"header": "Vous souhaitez nous faire part d\u2019un incident ou d\u2019un d\u00e9sagr\u00e9ment rencontr\u00e9 sur notre r\u00e9seau\n","pre_message": "Merci de d\u00e9crire l'incident avec le maximum de d\u00e9tails"},"submit": "Envoyer","suggestion": {"header": "Vous d\u00e9sirez nous faire partager une id\u00e9e ou faire une demande de documentation \u2026\n"},"title": "Nous \u00e9crire"}},"date": {"abbr_day_names": ["dim","lun","mar","mer","jeu","ven","sam"],"abbr_month_names": [null,"jan.","f\u00e9v.","mar.","avr.","mai","juin","juil.","ao\u00fbt","sept.","oct.","nov.","d\u00e9c."],"day_names": ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],"formats": {"default": "%d/%m/%Y","long": "%e %B %Y","long_ordinal": "%e %B %Y","only_day": "%e","short": "%e %b"},"month_names": [null,"janvier","f\u00e9vrier","mars","avril","mai","juin","juillet","ao\u00fbt","septembre","octobre","novembre","d\u00e9cembre"],"order": ["day","month","year"]},"datetime": {"distance_in_words": {"about_x_hours": {"one": "environ une heure","other": "environ {{count}}\u00a0heures"},"about_x_months": {"one": "environ un mois","other": "environ {{count}}\u00a0mois"},"about_x_years": {"one": "environ un an","other": "environ {{count}}\u00a0ans"},"half_a_minute": "une demi-minute","less_than_x_minutes": {"one": "moins de 1\u00a0minute","other": "moins de {{count}}\u00a0minutes","zero": "moins d'une minute"},"less_than_x_seconds": {"one": "moins de 1\u00a0seconde","other": "moins de {{count}}\u00a0secondes","zero": "moins d'une seconde"},"over_x_years": {"one": "plus d'un an","other": "plus de {{count}}\u00a0ans"},"x_days": {"one": "1\u00a0jour","other": "{{count}}\u00a0jours"},"x_minutes": {"one": "1\u00a0minute","other": "{{count}}\u00a0minutes"},"x_months": {"one": "1\u00a0mois","other": "{{count}}\u00a0mois"},"x_seconds": {"one": "1\u00a0seconde","other": "{{count}}\u00a0secondes"}},"prompts": {"day": "Jour","hour": "Heure","minute": "Minute","month": "Mois","second": "Seconde","year": "Ann\u00e9e"}},"itineraries": {"form": {"arrival": "Arriv\u00e9e","arrival_disconnected": "D\u00e9sol\u00e9, votre destination est situ\u00e9e au-del\u00e0 de {{radius}} m\u00e8tres de l'arr\u00eat le plus proche","arrival_sample": "ex : Gare","default_message": "Merci de renseigner le formulaire.","departure": "D\u00e9part","departure_disconnected": "D\u00e9sol\u00e9, votre point de d\u00e9part est situ\u00e9 au-del\u00e0 de {{radius}} m\u00e8tres de l'arr\u00eat le plus proche","departure_sample": "ex : Mairie","invalid": "Requ\u00eate invalide","missing_arrival": "Veuillez renseigner votre destination.","missing_departure": "Veuillez renseigner un point de d\u00e9part.","unknown_arrival": "D\u00e9sol\u00e9, votre destination n'est pas reconnue","unknown_departure": "D\u00e9sol\u00e9, votre point de d\u00e9part n'est pas reconnu"},"helper": {"mailto": {"header": "Le lien suivant m\u00e8ne \u00e0 une recherche d'itineraire entre {{departure}} et {{arrival}} :","subject": "Recherche d'itin\u00e9raire"},"select_hour": {"format": "\u00e0 %H heures","symbolic": {"afternoon": "l'apr\u00e8s-midi","evening": "le soir","morning": "le matin"}},"transport_mode": {"name_for_-1": "Changement","name_for_0": "Inconnu","name_for_1": "Autocar","name_for_10": "Taxi","name_for_11": "TER","name_for_12": "Train","name_for_13": "Train Grande Ligne","name_for_14": "Tramway","name_for_15": "Trolleybus","name_for_16": "Voiture particuli\u00e8re","name_for_17": "V\u00e9lo","name_for_18": "Autre","name_for_2": "Avion","name_for_3": "Bac","name_for_4": "Bus","name_for_5": "Ferry","name_for_6": "Marche \u00e0 pied","name_for_7": "M\u00e9tro","name_for_8": "Navette","name_for_9": "RER"}},"map": {"from_address": "\u00c0 partir de cette adresse","from_place": "\u00c0 partir de ce lieu","from_stop": "\u00c0 partir de cet arr\u00eat","itinerary": "Itin\u00e9raire","to_address": "Vers cette adresse","to_place": "Vers ce lieu","to_stop": "Vers cet arr\u00eat"},"new": {"arrival_on": "Arriver","at": "\u00e0","departure_on": "Partir","flash": {"no_result": "D\u00e9sol\u00e9, aucun itin\u00e9raire ne correspond \u00e0 votre demande.","retry": "Veuillez r\u00e9essayer en modifiant vos crit\u00e8res de recherche.","unavailable_service": "Le service de recherche d'itin\u00e9raire est momentan\u00e9ment indisponible. Veuillez renouveler votre recherche dans une minute.","via_stop_place": "Nous vous proposons de r\u00e9essayer en passant par la gare la plus proche"},"on_day": "le","or": "ou","submit": "Chercher","title": "Votre trajet sur mesure"},"show": {"arrival": "Arriv\u00e9e","at": "\u00e0","correspondence": "Correspondance","departure": "D\u00e9part","direction": "Destination","duration": "Dur\u00e9e","from": "de","from_date": "Du","long_correspondence_in_bicycle": "Trajet en v\u00e9lo","long_correspondence_in_feet": "Trajet \u00e0 Pied","long_correspondence_in_taxi": "Trajet en Taxi","next_results": "r\u00e9sultats suivants","of_walk": "de marche","print": "Imprimer","real_time_info_explanation": "Des perturbations peuvent affecter les itin\u00e9raires signal\u00e9s par ce panneau. Voir le d\u00e9tails des itin\u00e9raires","send_email": "Envoyer par email","title": "R\u00e9sultats de votre recherche","to": "\u00e0","to_date": "au","transport_mode": "Mode de transport","trip_details": "D\u00e9tails du trajet","wait_time": "Attente"}},"number": {"currency": {"format": {"format": "%n\u00a0%u","precision": 2,"unit": "\u20ac"}},"format": {"delimiter": "\u00a0","precision": 3,"separator": ","},"human": {"format": {"precision": 2},"storage_units": ["Octet","ko","Mo","Go","To"]}},"places": {"nearest_stations": "Stations \u00e0 proximit\u00e9"},"process": {"busy": "recherche en cours ..."},"stop_area_line_search": {"lines": "Veuillez s\u00e9lectionner une ligne pour voir ses passages \u00e0 l'arr\u00eat {{stop}}"},"stop_area_search": {"cancel": "annuler","example_stop": "ex: gare sncf","invalid": "Veuillez saisir 2 lettres au minimum","no_result": "Aucun arr\u00eat ne correspond \u00e0 votre recherche","select_line": "Veuillez s\u00e9lectionner la station et la ligne pour voir les horaires de passage","stop_input_label": "Arr\u00eat","submit": "chercher","success": "La recherche a r\u00e9ussi","title": "Les horaires \u00e0 votre arr\u00eat"},"support": {"array": {"last_word_connector": " et ","sentence_connector": "et","skip_last_comma": true,"two_words_connector": " et ","word_connector": ", "}},"time": {"am": "am","formats": {"default": "%d %B %Y %H:%M","long": "%A %d %B %Y %H:%M:%S %Z","long_ordinal": "%A %d %B %Y %H:%M:%S %Z","only_second": "%S","short": "%d %b %H:%M","time": "%H:%M"},"pm": "pm"},"timetable_at_stop_search": {"connected_lines": "Autres lignes en correspondance","date_field_label": "Date","destination": "Destination","destination_note": "\u00e0 destination de {{location}}","direction": "Destination","get_from": "Partir de l'arr\u00eat","get_to": "Venir \u00e0 l'arr\u00eat","itinerary_link_guide_text": "Voir comment...","line": "Ligne","no_connected_lines": "Seule la ligne {{line}} dessert l'arr\u00eat {{stop}}. Aucune ligne n'est en correspondance.","no_result": "Aucun passage \u00e0 cet arr\u00eat, sur cette ligne, ce jour.","on_day": "le","or": "ou","print_friendly": "Version imprimable","print_friendly_title": "Horaires de passage - version imprimable","print_guide_text": "Les horaires correspondants aux autres destinations sont signal\u00e9s par un ast\u00e9risque","stop": "Arr\u00eat","submit_date": "Rafra\u00eechir","timetable_guide_text": "Veuillez cliquer sur l'horaire pour conna\u00eetre la desserte","title": "Horaires de passage de la ligne {{line}} \u00e0 l'arr\u00eat {{stop}}","updated": "Le tableau des horaires a \u00e9t\u00e9 mis \u00e0 jour"}};
