218 lines
7.6 KiB
Racket
218 lines
7.6 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")))
|
||
|
||
(define (system-language)
|
||
(define language-name
|
||
(string-downcase (format "~a" (system-language+country))))
|
||
(define short-name (car (regexp-split #px"[-_]" language-name)))
|
||
(define candidate (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")))
|
||
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
; 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")
|
||
(check-equal? (tr 'unknown-translation) "unknown-translation")
|
||
(check-exn exn:fail:contract? (λ () (set-lang! 'xx))))
|
||
(λ () (set-lang! original-language))))
|