1/* pianod web client - internationalization/translation support
2   Copr. 2015-2017 Perette Barella/Devious Fish
3   All rights reserved.
4*/
5
6
7
8
9var Translate = function () {
10	function Translate () {
11		/* Nothing */
12	};
13
14	/* Constants */
15	var ERRORS = {
16
17
18		200: "Succès",
19		203: "Début de données",
20		204: "Pas de données ou la fin des données",
21		206: "Match trouvé",
22		207: "Valeur a été approchée",
23		210: "Commande reconnu mais l'action est en suspens",
24		300: "Détail",
25		301: "Réglages proxy invalide",
26		303: "Playlist non valide",
27		304: "Article pas trouvé",
28		400: "Bad commande",
29		401: "Non autorisé pour action demandée",
30		402: "Action a échoué",
31		403: "Existe déjà",
32		404: "Article demandé est introuvable",
33		405: "Action est pas applicable à l'état actuel",
34		406: "Login ou mot de passe invalide",
35		407: "Paramètre non valide",
36		408: "Playlist personnalisation échoué",
37		409: "Conflits rencontré",
38		410: "Panne temporaire, l'achèvement avenir inconnu",
39		411: "Le quota est dépassé",
40		412: "Devez être connecté",
41		413: "Non pris en charge",
42		414: "Ressources insuffisantes",
43		415: "Limite a été atteint",
44		416: "Opération uniquement valable sur les playlists primaires",
45		417: "Mauvais type d'action",
46		418: "Expression persistante ou valeur requise",
47		460: "Action pas pris en charge par la source",
48		461: "Valeur est pas pris en charge par la source",
49		462: "Action pas possible sur gestionnaire de médias",
50		498: "Il ya un bogue dans pianod",
51		499: "Non implémenté",
52		500: "Erreur de serveur interne",
53		501: "Rien à jouer",
54		502: "Échec Réseau",
55		503: "Service arrêt",
56		504: "L'échec de l'authentification",
57		505: "Ressources insufficent",
58		507: "Erreur de communication avec Pandora",
59		508: "Exécution de la commande incomplète",
60		509: "La permission a refusé",
61		510: "Exception",
62		511: "Temporisation Réseau",
63		512: "Impossible d'ouvrir la sortie audio",
64		'Bogus': 'Bogosity'
65	};
66
67
68
69	var MESSAGES = {
70			"ERROR_LOGIN_FAILED": "Procédure de connexion échouée",
71	"ERROR_CONNECTION_FAILED": "Connexion échouée.",
72	"ERROR_LOGIN_BAD_CREDENTIALS": "Mauvaises qualifications d'utilisateur.",
73	"CHECK_PORT_NUMBER": "Vérifiez le numéro de port.",
74	"LOGIN_SESSION_STARTING": "Connexion d'ouverture à %1$s.",
75	"LOGIN_SESSION_ENDED": "Session terminée.",
76	"STATUS_AUTHENTICATION_OK": "Authentication successful.",
77
78
79		"HEADING_ALBUM": "Album",
80
81		"HEADING_ARTIST": "artiste",
82
83		"HEADING_SONG": "Titre",
84
85		"HEADING_GENRE": "Genre",
86
87		"HEADING_TYPE": "Type",
88
89		"HEADING_SEEDTYPE": "Type de graine",
90
91		"HEADING_PLAYLIST": "Liste de reproduction",
92
93		"HEADING_YEAR": "Année",
94
95		"HEADING_DURATION": "Durée",
96
97		"HEADING_ACTION": "Actions",
98
99
100				"Cap_song": "Chanson",
101	"Cap_artist": "Artiste",
102	"Cap_album": "Album",
103	"Cap_playlist": "Playlist",
104
105
106		"lower_song": "chanson",
107	"lower_artist": "artiste",
108	"lower_album": "album",
109	"lower_playlist": "playlist",
110
111
112
113
114				"PROMPT_CONFIRM_DELETE": "Êtes-vous sûr vous voulez-vous effacer %1$s ?",
115	"CONFIRM_DELETE": "%1$s effacé.",
116	"CONFIRM_ADD": "%1$s ajouté.",
117	"CONFIRM_ADDED_TO": "%1$s ajouté à %2$s.",
118	"CONFIRM_CREATE": "%1$s créé.",
119	"CONFIRM_RENAME": "%1$s renamed to %2$s.",
120
121
122
123				"ACTION_TABLE_QUE": "+Liste",
124	"ACTION_TABLE_DEQUE": "✖Deque",
125	"ACTION_TABLE_SKIP": "Saut",
126	"ACTION_TABLE_SEED": "+Graine",
127	"ACTION_TABLE_UNSEED": "✖Retirez la graine",
128
129
130
131
132				"CONFIRM_CLEAR_REQUESTS": "File d'attente de demandes effacée.",
133	"SELECT_PLAYLISTS_NONE": "Aucunes listes de reproduction",
134	"ERROR_NO_USABLE_SOURCES": "Aucunes sources utilisables.",
135	"CONFIRM_RATE_OVERPLAYED": "Estimation de chanson temporairement déclassifiée.",
136	"CONFIRM_ADD_SEED_TYPE_TO": "Graine ajoutée de %1$s à %2$s.",
137	"CONFIRM_DEQUEUED": "Musique demandée annulée.",
138	"INDICATOR_AUTOTUNING": "∫",
139	"STATUS_NOTHING_PLAYING": "There is nothing playing right now.",
140	"ERROR_QUEUEHISTORY_RANGE": "No further items.",
141
142
143
144
145				"INFO_SEARCH_RESULTS_OMITTED": "Quelques résultats ont été omis :",
146	"ERROR_CHOOSE_PLAYLIST": "Veuillez choisir une liste de reproduction de cible.",
147	"ERROR_NEED_PLAYLIST_NAME": "Veuillez fournir un nom de liste de reproduction.",
148	"CONFIRM_QUEUED": "Demandes alignées.",
149	"ERROR_NEED_SEARCH_QUERY": "Veuillez écrire une requête de recherche.",
150	"MESSAGE_CREATE_WITH_ALL_RESULTS": "tous recherchent des résultats",
151	"MESSAGE_CREATE_APPLIES_TARGET": "s'applique à la source de cible",
152
153
154
155
156				"ERROR_NO_SOURCES": "Veuillez fournir quelques sources.",
157	"ERROR_NEED_SOURCE_SELECTION": "Please choose a source.",
158	"ERROR_NEED_SOURCE_TYPE": "Please choose a source type.",
159	"CONFIRM_SOURCE_ADDED": "La source ajoutée, peut prendre un moment pour être prête.",
160	"CONFIRM_SOURCE_REMOVED": "Source removed.",
161	"CONFIRM_SOURCE_SELECTED": "Source choisie.",
162
163
164		"ADDSOURCE_NULL_PATH": "Veuillez spécifier le chemin/dossier pour la musique.",
165
166
167
168
169				"ACTION_SKIP": "Chanson de saut",
170
171		"TOOLTIP_SKIP": "Sautez la chanson actuelle",
172
173		"ACTION_DEQUEUE": "Dequeue",
174
175		"TOOLTIP_DEQUEUE": "Cancel an upcoming song.",
176
177		"ACTION_RECUE": "Chanson de demande",
178
179		"TOOLTIP_RECUE": "Demandez cette chanson de nouveau.",
180
181
182		"PROMPT_CREATE_PLAYLIST_FROM": "Créez la liste de reproduction de %1$s",
183	"PROMPT_ADD_SEED_FROM": "Ajoutez la graine de %1$s",
184
185
186
187
188				"PROMPT_CONFIRM_DELETE_SEED": "Êtes-vous sûr vous voulez-vous retirer la graine pour %1$s ?",
189	"ERROR_SELECT_PLAYLIST": "Veuillez choisir une liste de reproduction.",
190
191
192
193
194				"HEADING_LISTENERS_ONLINE": "Auditeurs en ligne:",
195	"ERROR_ACTIVITY_DISABLED": "Les messages d'activité sont handicapés.",
196	"ERROR_YELL_NO_MESSAGE": "Aucun message à hurler.",
197
198
199
200
201				"PROMPT_OLD_PASSWORD": "Ancien mot de passe",
202	"PROMPT_NEW_PASSWORD": "Nouveau mot de passe",
203	"PROMPT_PIANOD_PASSWORD": "mot de passe de pianod",
204	"PROMPT_SYSTEM_PASSWORD": "Mot de passe de système",
205
206
207		"PROMPT_CONFIRM_NO_PASSWORD": "Ceci effacera le mot de passe de %1$s ainsi ils peuvent ouvrir une session sans mot de passe. C'est peu sûr.  Êtes-vous sûr?",
208	"CONFIRM_USER_UPDATED": "Utilisateur %1$s actualisées.",
209	"CONFIRM_PASSWORD_CHANGE": "Le mot de passe a été mis à jour.",
210	"ERROR_CANNOT_GET_USER_LIST": "Ne peut pas rechercher la liste utilisateurs.",
211	"ERROR_PASSWORDS_UNMATCHED": "Les nouveaux mots de passe ne s'assortissent pas.",
212	"ERROR_SELECT_USER": "Veuillez choisir un utilisateur.",
213	"LABEL_KICK_VISITORS": "Tous les visiteurs",
214	"CONFIRM_KICK": "L'utilisateur %1$s a expulsé.",
215
216
217		'Bogus': 'Bogosity'
218	};
219
220	/* Private variables */
221
222	/* Private functions */
223	if (typeof (assert) == 'undefined') {
224		var assert = function () { };
225	}
226
227	/* Return a function object, which will see all of
228	   the above via the closure. */
229	Translate.prototype.translate = function (value) {
230		if (typeof (value) == 'string') {
231			// Translate a string
232			var message = value in MESSAGES ? MESSAGES [value] : value;
233			// Perform printf-style positional string substitutions.
234			for (var i = 1; i < arguments.length; i++) {
235				message = message.replace (RegExp ("%" + i + "\\$s", "g"), arguments [i]);
236			}
237			return message;
238		}
239		// Translate a Football comm response.
240		assert (arguments.length == 1);
241		assert (typeof (value) == 'object');
242		assert ('code' in value);
243		if (typeof (value) != 'object' || !('code' in value)) {
244			return 'Bad translation request';
245		}
246		if (!(value.code in ERRORS)) {
247			return value.text;
248		}
249		// Replace value up to first colon.
250		var pieces = value.text.split (':');
251		pieces [0] = ERRORS [value.code];
252		return pieces.join (':')
253	};
254	return Translate;
255}();
256
257