refactoring

This commit is contained in:
2026-09-01 09:31:49 +02:00
parent b3a5a0b345
commit a5a53b7efc
20 changed files with 2082 additions and 1032 deletions
@@ -0,0 +1,366 @@
#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 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))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Tests for module library.rkt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(module+ test
(require rackunit)
(define original-language (current-lang))
(define english-keys
(sort (hash-keys (hash-ref translation-map 'en)) symbol<?))
(dynamic-wind
void
(λ ()
(for ((entry (in-list (languages))))
(define candidate (car entry))
(check-equal?
(sort (hash-keys (hash-ref translation-map candidate)) symbol<?)
english-keys)
(set-lang! candidate)
(check-true (string? (tr 'connected))))
(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))))