Files
rkt-web-player/private/translate.rkt
T
2026-08-28 16:59:45 +02:00

353 lines
12 KiB
Racket
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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 dapplication"
'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 nest pas autorisé par le serveur. Ajoutez lID dapplication suivant à [playback-agents] dans le fichier INI du serveur :\n\n~a"
'unauthorized-status "Non autorisé — lID dapplication 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 lagent 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 — lID 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 lagente 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))))