#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))))