353 lines
12 KiB
Racket
353 lines
12 KiB
Racket
#lang racket/base
|
||
|
||
(require racket/string)
|
||
|
||
(provide tr
|
||
__
|
||
languages
|
||
set-lang!
|
||
current-lang)
|
||
|
||
(define translation-map
|
||
(hasheq
|
||
'en
|
||
(hasheq
|
||
'app-title "RKT Web Player Agent"
|
||
'server "RKT Web Player server"
|
||
'name "Name"
|
||
'application-id "Application ID"
|
||
'playback "Playback"
|
||
'no-track "Nothing is playing"
|
||
'no-track-selected "No track selected"
|
||
'save-connect "Save and connect"
|
||
'reconnect "Reconnect"
|
||
'connecting "Connecting…"
|
||
'connected "Connected"
|
||
'denied-title "Playback agent not allowed"
|
||
'denied-message "This playback agent is not allowed by the server. Add the following application ID to [playback-agents] in the server INI:\n\n~a"
|
||
'unauthorized-status "Not authorized — application ID is not in the server INI"
|
||
'disconnected "Not connected: ~a"
|
||
'playing "Playing"
|
||
'paused "Paused"
|
||
'loading "Loading"
|
||
'stopped "Stopped"
|
||
'channel "channel"
|
||
'channels "channels"
|
||
'tray-open "Open RKT Web Player Agent"
|
||
'quit "Quit")
|
||
'nl
|
||
(hasheq
|
||
'app-title "RKT Web Player Agent"
|
||
'server "RKT Web Player server"
|
||
'name "Naam"
|
||
'application-id "Applicatie-ID"
|
||
'playback "Afspelen"
|
||
'no-track "Er wordt niets afgespeeld"
|
||
'no-track-selected "Geen track geselecteerd"
|
||
'save-connect "Opslaan en verbinden"
|
||
'reconnect "Opnieuw verbinden"
|
||
'connecting "Verbinden…"
|
||
'connected "Verbonden"
|
||
'denied-title "Playback agent niet toegestaan"
|
||
'denied-message "Deze playback agent is niet toegelaten door de server. Voeg het volgende applicatie-ID toe aan [playback-agents] in de server-INI:\n\n~a"
|
||
'unauthorized-status "Niet geautoriseerd — applicatie-ID staat niet in de server-INI"
|
||
'disconnected "Niet verbonden: ~a"
|
||
'playing "Speelt"
|
||
'paused "Gepauzeerd"
|
||
'loading "Laden"
|
||
'stopped "Gestopt"
|
||
'channel "kanaal"
|
||
'channels "kanalen"
|
||
'tray-open "RKT Web Player Agent openen"
|
||
'quit "Afsluiten")
|
||
'de
|
||
(hasheq
|
||
'app-title "RKT Web Player Agent"
|
||
'server "RKT Web Player Server"
|
||
'name "Name"
|
||
'application-id "Anwendungs-ID"
|
||
'playback "Wiedergabe"
|
||
'no-track "Keine Wiedergabe"
|
||
'no-track-selected "Kein Titel ausgewählt"
|
||
'save-connect "Speichern und verbinden"
|
||
'reconnect "Neu verbinden"
|
||
'connecting "Verbinden…"
|
||
'connected "Verbunden"
|
||
'denied-title "Playback-Agent nicht zugelassen"
|
||
'denied-message "Dieser Playback-Agent ist vom Server nicht zugelassen. Fügen Sie die folgende Anwendungs-ID unter [playback-agents] in die Server-INI ein:\n\n~a"
|
||
'unauthorized-status "Nicht autorisiert — Anwendungs-ID fehlt in der Server-INI"
|
||
'disconnected "Nicht verbunden: ~a"
|
||
'playing "Wiedergabe"
|
||
'paused "Pausiert"
|
||
'loading "Laden"
|
||
'stopped "Gestoppt"
|
||
'channel "Kanal"
|
||
'channels "Kanäle"
|
||
'tray-open "RKT Web Player Agent öffnen"
|
||
'quit "Beenden")
|
||
'fr
|
||
(hasheq
|
||
'app-title "Agent RKT Web Player"
|
||
'server "Serveur RKT Web Player"
|
||
'name "Nom"
|
||
'application-id "ID d’application"
|
||
'playback "Lecture"
|
||
'no-track "Aucune lecture en cours"
|
||
'no-track-selected "Aucune piste sélectionnée"
|
||
'save-connect "Enregistrer et connecter"
|
||
'reconnect "Reconnecter"
|
||
'connecting "Connexion…"
|
||
'connected "Connecté"
|
||
'denied-title "Agent de lecture non autorisé"
|
||
'denied-message "Cet agent de lecture n’est pas autorisé par le serveur. Ajoutez l’ID d’application suivant à [playback-agents] dans le fichier INI du serveur :\n\n~a"
|
||
'unauthorized-status "Non autorisé — l’ID d’application est absent du fichier INI du serveur"
|
||
'disconnected "Non connecté : ~a"
|
||
'playing "Lecture"
|
||
'paused "En pause"
|
||
'loading "Chargement"
|
||
'stopped "Arrêté"
|
||
'channel "canal"
|
||
'channels "canaux"
|
||
'tray-open "Ouvrir l’agent RKT Web Player"
|
||
'quit "Quitter")
|
||
'es
|
||
(hasheq
|
||
'app-title "Agente de RKT Web Player"
|
||
'server "Servidor RKT Web Player"
|
||
'name "Nombre"
|
||
'application-id "ID de aplicación"
|
||
'playback "Reproducción"
|
||
'no-track "No se está reproduciendo nada"
|
||
'no-track-selected "No hay ninguna pista seleccionada"
|
||
'save-connect "Guardar y conectar"
|
||
'reconnect "Volver a conectar"
|
||
'connecting "Conectando…"
|
||
'connected "Conectado"
|
||
'denied-title "Agente de reproducción no permitido"
|
||
'denied-message "El servidor no permite este agente de reproducción. Añade el siguiente ID de aplicación a [playback-agents] en el INI del servidor:\n\n~a"
|
||
'unauthorized-status "No autorizado — el ID de aplicación no está en el INI del servidor"
|
||
'disconnected "Sin conexión: ~a"
|
||
'playing "Reproduciendo"
|
||
'paused "En pausa"
|
||
'loading "Cargando"
|
||
'stopped "Detenido"
|
||
'channel "canal"
|
||
'channels "canales"
|
||
'tray-open "Abrir el agente de RKT Web Player"
|
||
'quit "Salir")
|
||
'it
|
||
(hasheq
|
||
'app-title "Agente RKT Web Player"
|
||
'server "Server RKT Web Player"
|
||
'name "Nome"
|
||
'application-id "ID applicazione"
|
||
'playback "Riproduzione"
|
||
'no-track "Nessuna riproduzione in corso"
|
||
'no-track-selected "Nessuna traccia selezionata"
|
||
'save-connect "Salva e connetti"
|
||
'reconnect "Riconnetti"
|
||
'connecting "Connessione…"
|
||
'connected "Connesso"
|
||
'denied-title "Agente di riproduzione non consentito"
|
||
'denied-message "Questo agente di riproduzione non è consentito dal server. Aggiungi il seguente ID applicazione a [playback-agents] nel file INI del server:\n\n~a"
|
||
'unauthorized-status "Non autorizzato — l’ID applicazione non è nel file INI del server"
|
||
'disconnected "Non connesso: ~a"
|
||
'playing "In riproduzione"
|
||
'paused "In pausa"
|
||
'loading "Caricamento"
|
||
'stopped "Arrestato"
|
||
'channel "canale"
|
||
'channels "canali"
|
||
'tray-open "Apri l’agente RKT Web Player"
|
||
'quit "Esci")
|
||
'sv
|
||
(hasheq
|
||
'app-title "RKT Web Player-agent"
|
||
'server "RKT Web Player-server"
|
||
'name "Namn"
|
||
'application-id "Program-ID"
|
||
'playback "Uppspelning"
|
||
'no-track "Inget spelas upp"
|
||
'no-track-selected "Inget spår har valts"
|
||
'save-connect "Spara och anslut"
|
||
'reconnect "Anslut igen"
|
||
'connecting "Ansluter…"
|
||
'connected "Ansluten"
|
||
'denied-title "Uppspelningsagenten är inte tillåten"
|
||
'denied-message "Servern tillåter inte den här uppspelningsagenten. Lägg till följande program-ID under [playback-agents] i serverns INI-fil:\n\n~a"
|
||
'unauthorized-status "Inte behörig — program-ID saknas i serverns INI-fil"
|
||
'disconnected "Inte ansluten: ~a"
|
||
'playing "Spelar"
|
||
'paused "Pausad"
|
||
'loading "Läser in"
|
||
'stopped "Stoppad"
|
||
'channel "kanal"
|
||
'channels "kanaler"
|
||
'tray-open "Öppna RKT Web Player-agenten"
|
||
'quit "Avsluta")
|
||
'no
|
||
(hasheq
|
||
'app-title "RKT Web Player-agent"
|
||
'server "RKT Web Player-server"
|
||
'name "Navn"
|
||
'application-id "Applikasjons-ID"
|
||
'playback "Avspilling"
|
||
'no-track "Ingenting spilles av"
|
||
'no-track-selected "Ingen spor er valgt"
|
||
'save-connect "Lagre og koble til"
|
||
'reconnect "Koble til på nytt"
|
||
'connecting "Kobler til…"
|
||
'connected "Tilkoblet"
|
||
'denied-title "Avspillingsagenten er ikke tillatt"
|
||
'denied-message "Serveren tillater ikke denne avspillingsagenten. Legg til følgende applikasjons-ID under [playback-agents] i serverens INI-fil:\n\n~a"
|
||
'unauthorized-status "Ikke autorisert — applikasjons-ID mangler i serverens INI-fil"
|
||
'disconnected "Ikke tilkoblet: ~a"
|
||
'playing "Spiller"
|
||
'paused "På pause"
|
||
'loading "Laster"
|
||
'stopped "Stoppet"
|
||
'channel "kanal"
|
||
'channels "kanaler"
|
||
'tray-open "Åpne RKT Web Player-agenten"
|
||
'quit "Avslutt")
|
||
'fi
|
||
(hasheq
|
||
'app-title "RKT Web Player -agentti"
|
||
'server "RKT Web Player -palvelin"
|
||
'name "Nimi"
|
||
'application-id "Sovellustunnus"
|
||
'playback "Toisto"
|
||
'no-track "Mitään ei toisteta"
|
||
'no-track-selected "Kappaletta ei ole valittu"
|
||
'save-connect "Tallenna ja yhdistä"
|
||
'reconnect "Yhdistä uudelleen"
|
||
'connecting "Yhdistetään…"
|
||
'connected "Yhdistetty"
|
||
'denied-title "Toistoagenttia ei sallita"
|
||
'denied-message "Palvelin ei salli tätä toistoagenttia. Lisää seuraava sovellustunnus palvelimen INI-tiedoston [playback-agents]-osioon:\n\n~a"
|
||
'unauthorized-status "Ei valtuutettu — sovellustunnus puuttuu palvelimen INI-tiedostosta"
|
||
'disconnected "Ei yhteyttä: ~a"
|
||
'playing "Toistetaan"
|
||
'paused "Keskeytetty"
|
||
'loading "Ladataan"
|
||
'stopped "Pysäytetty"
|
||
'channel "kanava"
|
||
'channels "kanavaa"
|
||
'tray-open "Avaa RKT Web Player -agentti"
|
||
'quit "Lopeta")
|
||
'is
|
||
(hasheq
|
||
'app-title "RKT Web Player-spilari"
|
||
'server "RKT Web Player-þjónn"
|
||
'name "Nafn"
|
||
'application-id "Forritsauðkenni"
|
||
'playback "Spilun"
|
||
'no-track "Ekkert er í spilun"
|
||
'no-track-selected "Ekkert lag valið"
|
||
'save-connect "Vista og tengjast"
|
||
'reconnect "Tengjast aftur"
|
||
'connecting "Tengist…"
|
||
'connected "Tengt"
|
||
'denied-title "Spilarinn er ekki leyfður"
|
||
'denied-message "Þessi spilari er ekki leyfður af þjóninum. Bættu eftirfarandi forritsauðkenni við [playback-agents] í INI-skrá þjónsins:\n\n~a"
|
||
'unauthorized-status "Ekki heimilað — forritsauðkenni vantar í INI-skrá þjónsins"
|
||
'disconnected "Ekki tengt: ~a"
|
||
'playing "Spilar"
|
||
'paused "Í bið"
|
||
'loading "Hleður"
|
||
'stopped "Stöðvað"
|
||
'channel "rás"
|
||
'channels "rásir"
|
||
'tray-open "Opna RKT Web Player-spilarann"
|
||
'quit "Hætta")))
|
||
|
||
(define (system-language)
|
||
(define language-name
|
||
(string-downcase (format "~a" (system-language+country))))
|
||
(define short-name (car (regexp-split #px"[-_]" language-name)))
|
||
(define candidate
|
||
(case (string->symbol short-name)
|
||
((nb nn) 'no)
|
||
(else (string->symbol short-name))))
|
||
(if (hash-has-key? translation-map candidate) candidate 'en))
|
||
|
||
(define language (system-language))
|
||
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
; goal : Return the supported language symbols and their native names.
|
||
; pre : None.
|
||
; post : Translation state remains unchanged.
|
||
; result : An association list suitable for a language selector.
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
(define (languages)
|
||
'((en "English")
|
||
(nl "Nederlands")
|
||
(de "Deutsch")
|
||
(fr "Français")
|
||
(es "Español")
|
||
(it "Italiano")
|
||
(sv "Svenska")
|
||
(no "Norsk")
|
||
(fi "Suomi")
|
||
(is "Íslenska")))
|
||
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
; goal : Select the language used by tr and __.
|
||
; pre : Value is one of the symbols returned by languages.
|
||
; post : Subsequent translations use value.
|
||
; result : Void.
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
(define (set-lang! value)
|
||
(unless (hash-has-key? translation-map value)
|
||
(raise-argument-error 'set-lang! "supported language symbol" value))
|
||
(set! language value))
|
||
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
; goal : Report the active translation language.
|
||
; pre : None.
|
||
; post : Translation state remains unchanged.
|
||
; result : A supported language symbol.
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
(define (current-lang)
|
||
language)
|
||
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
; goal : Translate an application string identifier.
|
||
; pre : Id is a symbol.
|
||
; post : Translation state remains unchanged.
|
||
; result : The active translation, its English fallback, or the identifier.
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
(define (tr id)
|
||
(hash-ref (hash-ref translation-map language)
|
||
id
|
||
(λ ()
|
||
(hash-ref (hash-ref translation-map 'en)
|
||
id
|
||
(λ () (symbol->string id))))))
|
||
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
; goal : Provide the conventional short alias used by rktplayer GUI code.
|
||
; pre : Id is a symbol.
|
||
; post : Translation state remains unchanged.
|
||
; result : The same translated string as tr.
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
(define (__ id)
|
||
(tr id))
|
||
|
||
(module+ test
|
||
(require rackunit)
|
||
|
||
(define original-language (current-lang))
|
||
(dynamic-wind
|
||
void
|
||
(λ ()
|
||
(set-lang! 'nl)
|
||
(check-equal? (tr 'connected) "Verbonden")
|
||
(set-lang! 'de)
|
||
(check-equal? (__ 'quit) "Beenden")
|
||
(set-lang! 'is)
|
||
(check-equal? (tr 'connected) "Tengt")
|
||
(check-equal? (tr 'unknown-translation) "unknown-translation")
|
||
(check-exn exn:fail:contract? (λ () (set-lang! 'xx))))
|
||
(λ () (set-lang! original-language))))
|