#lang racket/base (require racket/list 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)) (define english-keys (sort (hash-keys (hash-ref translation-map 'en)) symbol