Open GaetanPTX opened 1 year ago
Hey,
If you have experience with javascript, follow the steps here to get yourself a development environment. Then in the source code, create following file: src/lib/lang/fr.json
, register it in src/lib/components/Lang/I18n.svelte
similar to Spanish, and then you can copy english translations from src/lib/lang/en.json
to src/lib/lang/fr.json
and start translating :)
If you don't have development experience, you can copy the english translations file below, add your translations and send it back to me here and I'll add them for you.
src/lib/lang/en.json
{
"appName": "Reiverr",
"setupRequiredTitle": "Welcome to",
"setupRequiredDescription": "It seems like the application is missing some environment variables that are necessary for the application to function. Please provide the following environment variables:",
"navbar": {
"home": "Home",
"discover": "Discover",
"library": "Library",
"sources": "Sources",
"settings": "Settings"
},
"search": {
"placeHolder": "Search for Movies and TV Shows",
"noRecentSearches": "No recent searches",
"noResults": "No search results"
},
"discover": {
"trending": "Trending",
"popularPeople": "Popular People",
"upcomingMovies": "Upcoming Movies",
"upcomingSeries": "Upcoming Series",
"genres": "Genres",
"newDigitalReleases": "New Digital Releases",
"streamingNow": "On Streaming Now",
"TVNetworks": "TV Networks"
},
"library": {
"missingConfiguration": "Configure Radarr, Sonarr and Jellyfin to watch and manage your library",
"available": "Available",
"watched": "Watched",
"unavailable": "Unavailable",
"sort": {
"byTitle": "By Title"
},
"content": {
"movie": "Movie",
"show": "Show",
"requestContent": "Request",
"directedBy": "Directed By",
"releaseDate": "Release Date",
"budget": "Budget",
"status": "Status",
"runtime": "Runtime",
"castAndCrew": "Cast & Crew",
"recommendations": "Recommendations",
"similarTitles": "Similar Titles"
}
},
"sources": {},
"titleShowcase": {
"details": "Details",
"watchTrailer": "Watch Trailer",
"releaseDate": "Release Date",
"directedBy": "Directed By"
},
"settings": {
"navbar": {
"settings": "Configuration",
"general": "General",
"integrations": "Integrations"
},
"general": {
"userInterface": {
"userInterface": "User Interface",
"language": "Language",
"autoplayTrailers": "Autoplay Trailers",
"animationDuration": "Animation Duration"
},
"discovery": {
"discovery": "Discovery",
"none": "None",
"region": "Region",
"excludeLibraryItemsFromDiscovery": "Exclude library items from Discovery",
"includedLanguages": "Included languages",
"includedLanguagesDescription": "Filter results based on spoken language. Takes ISO 639-1 language codes separated with commas. Leave empty to disable."
}
},
"integrations": {
"integrations": "Integrations",
"integrationsNote": "Note: Base urls must be accessible from the browser, meaning that internal docker addresses won't work, for example. API Keys <span class='font-medium underline'>will be exposed</span> to the browser.",
"baseUrl": "Base URL",
"apiKey": "API Key",
"testConnection": "Test Connection",
"status": {
"connected": "Connected",
"disconnected": "Disconnected"
},
"options": {
"options": "Options",
"rootFolder": "Root Folder",
"qualityProfile": "Quality Profile",
"languageProfile": "Language Profile",
"jellyfinUser": "Jellyfin User"
}
},
"misc": {
"saveChanges": "Save Changes",
"resetToDefaults": "Reset to Defaults ",
"changelog": "Changelog"
}
}
}
Thank you!
I translated the json file in French for your next update
{
"appName": "Reiverr",
"setupRequiredTitle": "Bienvenue à",
"setupRequiredDescription": "Il semble que l'application manque de certaines variables d'environnement nécessaires au fonctionnement de l'application. ",
"navbar": {
"home": "Accueil",
"discover": "Découvrir",
"library": "Bibliothèque",
"sources": "Sources",
"settings": "Paramètres"
},
"search": {
"placeHolder": "Rechercher des films et des émissions de télévision",
"noRecentSearches": "Aucune recherche récente",
"noResults": "Aucun résultat trouvé"
},
"discover": {
"trending": "Tendance",
"popularPeople": "Personnes populaires",
"upcomingMovies": "Films à venir",
"upcomingSeries": "Série à venir",
"genres": "Genres",
"newDigitalReleases": "Nouvelles versions numériques",
"streamingNow": "En streaming maintenant",
"TVNetworks": "Réseaux de télévision"
},
"library": {
"missingConfiguration": "Configurez Radarr, Sonarr et Jellyfin pour surveiller et gérer votre bibliothèque",
"available": "Disponible",
"watched": "Regardé",
"unavailable": "Indisponible",
"sort": {
"byTitle": "Par titre"
},
"content": {
"movie": "Film",
"show": "Voir",
"requestContent": "Demander",
"directedBy": "Dirigé par",
"releaseDate": "Date de sortie",
"budget": "Budget",
"status": "Statut",
"runtime": "Durée",
"castAndCrew": "Casting",
"recommendations": "Recommandations",
"similarTitles": "Titres similaires"
}
},
"sources": {},
"titleShowcase": {
"details": "Détails",
"watchTrailer": "Regarde la bande-annonce",
"releaseDate": "Date de sortie",
"directedBy": "Dirigé par"
},
"settings": {
"navbar": {
"settings": "Configuration",
"general": "Général",
"integrations": "Intégrations"
},
"general": {
"userInterface": {
"userInterface": "Interface utilisateur",
"language": "Langue",
"autoplayTrailers": "Bandes-annonces à lecture automatique",
"animationDuration": "Durée de l'animation"
},
"discovery": {
"discovery": "Découverte",
"none": "Aucun",
"region": "Région",
"excludeLibraryItemsFromDiscovery": "Exclure les éléments de bibliothèque de Discovery",
"includedLanguages": "Langues incluses",
"includedLanguagesDescription": "Filtrez les résultats en fonction de la langue parlée. "
}
},
"integrations": {
"integrations": "Intégrations",
"integrationsNote": "Remarque : Les URL de base doivent être accessibles depuis le navigateur, ce qui signifie que les adresses Docker internes ne fonctionneront pas, par exemple. La clé d'API <span class='font-medium underline'>sera exposée</span> au navigateur.",
"baseUrl": "URL de base",
"apiKey": "clé API",
"testConnection": "Tester la connexion",
"status": {
"connected": "Connecté",
"disconnected": "Déconnecté"
},
"options": {
"options": "Options",
"rootFolder": "Dossier racine",
"qualityProfile": "Profil de qualité",
"languageProfile": "Profil linguistique",
"jellyfinUser": "Utilisateur de Jellyfin"
}
},
"misc": {
"saveChanges": "Sauvegarder les modifications",
"resetToDefaults": "Réinitialiser les paramètres par défaut ",
"changelog": "Journal des modifications"
}
}
}
Very nice, I'll add them 👍 Just to double check, is the settings.integrations.integrationsNote correct? It seems like it's missing the API key part
Ah yes indeed I forgot this part, I corrected my previous message. Thanks
Here the Italian translation:
{
"appName": "Reiverr",
"setupRequiredTitle": "Benvenuti in",
"setupRequiredDescription": "Sembra che alcune variabili di ambiente necessarie per il funzionamento dell'applicazione siano mancanti. Per favore, inserisci le seguenti variabili d'ambiente:",
"navbar": {
"home": "Home",
"discover": "Esplora",
"library": "Libreria",
"sources": "Fonti",
"settings": "Impostazioni"
},
"search": {
"placeHolder": "Cerca Film o Serie TV",
"noRecentSearches": "Nessuna ricerca recente",
"noResults": "Nessun risultato"
},
"discover": {
"trending": "In tendenza",
"popularPeople": "Personaggi in tendenza",
"upcomingMovies": "Film in uscita",
"upcomingSeries": "Serie TV in uscita",
"genres": "Generi",
"newDigitalReleases": "Nuove uscite in digitale",
"streamingNow": "In streaming adesso",
"TVNetworks": "Network TV"
},
"library": {
"missingConfiguration": "Configura Radarr, Sonarr e Jellyfin per guardare e gestire la tua libreria",
"available": "Disponibile",
"watched": "Guardato",
"unavailable": "Non disponibile",
"sort": {
"byTitle": "Per Titolo"
},
"content": {
"movie": "Film",
"show": "Serie TV",
"requestContent": "Richiedi",
"directedBy": "Diretto da",
"releaseDate": "Data di uscita",
"budget": "Budget",
"status": "Stato",
"runtime": "Durata",
"castAndCrew": "Cast e Crew",
"recommendations": "Suggerimenti",
"similarTitles": "Titoli simili"
}
},
"sources": {},
"titleShowcase": {
"details": "Dettagli",
"watchTrailer": "Guarda il trailer",
"releaseDate": "Data di uscita",
"directedBy": "Diretto da"
},
"settings": {
"navbar": {
"settings": "Configurazione",
"general": "Generale",
"integrations": "Integrazioni"
},
"general": {
"userInterface": {
"userInterface": "Interfaccia utente",
"language": "Lingua",
"autoplayTrailers": "Riproduci automaticamente i trailer",
"animationDuration": "Durata dell'animazione"
},
"discovery": {
"discovery": "Esplora",
"none": "Niente",
"region": "Paese",
"excludeLibraryItemsFromDiscovery": "Escludi i media presenti nella libreria dalla sezione Esplora",
"includedLanguages": "Lingue disponibili",
"includedLanguagesDescription": "Filtra i risultati in base alla lingua dell'audio. Inserisci i codici della lingua in formato ISO 639-1 separati da virgola. Lascia vuoto per disabilitare."
}
},
"integrations": {
"integrations": "Integrazioni",
"integrationsNote": "Nota bene: L'indirizzo (URL) deve essere accessibile dal browser, questo vuol dire che indirizzi come quello interno di docker non funzioneranno. Le chiavi API <span class='font-medium underline'>saranno rese disponibili</span> al browser.",
"baseUrl": "Indirizzo (URL)",
"apiKey": "Chiave API",
"testConnection": "Testa la connessione",
"status": {
"connected": "Connesso",
"disconnected": "Disconnesso"
},
"options": {
"options": "Opzioni",
"rootFolder": "Percorso",
"qualityProfile": "Profilo di qualità",
"languageProfile": "Profilo della lingua",
"jellyfinUser": "Utente Jellyfin"
}
},
"misc": {
"saveChanges": "Salva",
"resetToDefaults": "Impostazioni predefinite",
"changelog": "Note di rilascio"
}
}
}
Thanks @serverless83, I added them and they will ship with the next version.
Translation to Portuguese Brazil:
{
"appName": "Reiverr",
"setupRequiredTitle": "Bem-vindo ao",
"setupRequiredDescription": "Parece que faltam algumas variáveis de ambiente, que são necessárias para o funcionamento do aplicativo. Forneça as seguintes variáveis de ambiente:",
"navbar": {
"home": "Início",
"discover": "Explorar",
"library": "Biblioteca",
"sources": "Fontes",
"settings": "Configurações"
},
"search": {
"placeHolder": "Pesquise Filmes e Séries",
"noRecentSearches": "Nenhuma pesquisa recente",
"noResults": "Nenhum resultado da pesquisa"
},
"discover": {
"trending": "Em alta",
"popularPeople": "Pessoas populares",
"upcomingMovies": "Próximos lançamentos de filmes",
"upcomingSeries": "Próximos lançamentos de séries",
"genres": "Gêneros",
"newDigitalReleases": "Novos lançamentos digitais",
"streamingNow": "Transmitindo agora",
"TVNetworks": "Emissora"
},
"library": {
"missingConfiguration": "Configure Radarr, Sonarr e Jellyfin para monitorar e gerenciar sua biblioteca",
"available": "Disponível",
"watched": "Assistido",
"unavailable": "Indisponível",
"sort": {
"byTitle": "Por título"
},
"content": {
"movie": "Filmes",
"show": "Séries",
"requestContent": "Solicitar",
"directedBy": "Dirigido por",
"releaseDate": "Data de lançamento",
"budget": "Orçamento",
"status": "Estado",
"runtime": "Tempo de execução",
"castAndCrew": "Elenco e equipe",
"recommendations": "Recomendações",
"similarTitles": "Títulos semelhantes"
}
},
"sources": {},
"titleShowcase": {
"details": "Detalhes",
"watchTrailer": "Assistir Trailer",
"releaseDate": "Data de lançamento",
"directedBy": "Dirigido por"
},
"settings": {
"navbar": {
"settings": "Configuração",
"general": "Geral",
"integrations": "Integrações"
},
"general": {
"userInterface": {
"userInterface": "Interface de usuário",
"language": "Idioma",
"autoplayTrailers": "Reprodução automática de trailers",
"animationDuration": "Duração da animação"
},
"discovery": {
"discovery": "Explorar",
"none": "Nenhum",
"region": "Região",
"excludeLibraryItemsFromDiscovery": "Excluir itens da biblioteca do Explorar",
"includedLanguages": "Idiomas incluídos",
"includedLanguagesDescription": "Filtre os resultados com base no idioma falado. Utiliza códigos de idioma ISO 639-1 separados por vírgulas. Deixe em branco para desabilitar."
}
},
"integrations": {
"integrations": "Integrações",
"integrationsNote": "Observação: as URLs base devem estar acessíveis no navegador, o que significa que os endereços internos do docker não funcionarão, por exemplo. As chaves de API <span class='font-medium underline'>serão expostas</span> ao navegador.",
"baseUrl": "URL base",
"apiKey": "Chave API",
"testConnection": "Testar conexão",
"status": {
"connected": "Conectado",
"disconnected": "Desconectado"
},
"options": {
"options": "Opções",
"rootFolder": "Pasta raiz",
"qualityProfile": "Perfil de qualidade",
"languageProfile": "Perfil de idioma",
"jellyfinUser": "Usuário Jellyfin"
}
},
"misc": {
"saveChanges": "Salvar alterações",
"resetToDefaults": "Redefinir para os padrões",
"changelog": "Mudanças"
}
}
}
Translation to German:
{
"appName": "Reiverr",
"setupRequiredTitle": "Willkommen bei",
"setupRequiredDescription": "Es scheint, dass der Anwendung einige Umgebungsvariablen fehlen, die für ihre Funktion erforderlich sind. Bitte geben Sie die folgenden Umgebungsvariablen an:",
"navbar": {
"home": "Startseite",
"discover": "Entdecken",
"library": "Bibliothek",
"sources": "Quellen",
"settings": "Einstellungen"
},
"search": {
"placeHolder": "Suche nach Filmen und Serien",
"noRecentSearches": "Keine kürzlichen Suchanfragen",
"noResults": "Keine Suchergebnisse"
},
"discover": {
"trending": "Trends",
"popularPeople": "Beliebte Personen",
"upcomingMovies": "Kommende Filme",
"upcomingSeries": "Kommende Serien",
"genres": "Genres",
"newDigitalReleases": "Neue digitale Veröffentlichungen",
"streamingNow": "Jetzt im Stream",
"TVNetworks": "Fernsehsender"
},
"library": {
"missingConfiguration": "Konfigurieren Sie Radarr, Sonarr und Jellyfin, um Ihre Bibliothek anzusehen und zu verwalten",
"available": "Verfügbar",
"watched": "Gesehen",
"unavailable": "Nicht verfügbar",
"sort": {
"byTitle": "Nach Titel"
},
"content": {
"movie": "Film",
"show": "Serie",
"requestContent": "Anfordern",
"directedBy": "Regie",
"releaseDate": "Veröffentlichungsdatum",
"budget": "Budget",
"status": "Status",
"runtime": "Laufzeit",
"castAndCrew": "Besetzung & Crew",
"recommendations": "Empfehlungen",
"similarTitles": "Ähnliche Titel"
}
},
"sources": {},
"titleShowcase": {
"details": "Details",
"watchTrailer": "Trailer ansehen",
"releaseDate": "Veröffentlichungsdatum",
"directedBy": "Regie"
},
"settings": {
"navbar": {
"settings": "Konfiguration",
"general": "Allgemein",
"integrations": "Integrationen"
},
"general": {
"userInterface": {
"userInterface": "Benutzeroberfläche",
"language": "Sprache",
"autoplayTrailers": "Trailer automatisch abspielen",
"animationDuration": "Animationsdauer"
},
"discovery": {
"discovery": "Entdeckung",
"none": "Keine",
"region": "Region",
"excludeLibraryItemsFromDiscovery": "Bibliothekselemente von der Entdeckung ausschließen",
"includedLanguages": "Eingeschlossene Sprachen",
"includedLanguagesDescription": "Filterergebnisse basierend auf gesprochener Sprache. Verwenden Sie durch Kommas getrennte ISO 639-1 Sprachcodes. Lassen Sie das Feld leer, um die Funktion zu deaktivieren."
}
},
"integrations": {
"integrations": "Integrationen",
"integrationsNote": "Hinweis: Basis-URLs müssen vom Browser aus erreichbar sein. Interne Docker-Adressen funktionieren zum Beispiel nicht. API-Schlüssel <span class='font-medium underline'>werden dem Browser angezeigt</span>.",
"baseUrl": "Basis-URL",
"apiKey": "API-Schlüssel",
"testConnection": "Verbindung testen",
"status": {
"connected": "Verbunden",
"disconnected": "Getrennt"
},
"options": {
"options": "Optionen",
"rootFolder": "Stammverzeichnis",
"qualityProfile": "Qualitätsprofil",
"languageProfile": "Sprachprofil",
"jellyfinUser": "Jellyfin-Benutzer"
}
},
"misc": {
"saveChanges": "Änderungen speichern",
"resetToDefaults": "Auf Standardwerte zurücksetzen",
"changelog": "Änderungsprotokoll"
}
}
}
I have a suggestion: convert the lang file names to locales instead of just the language. the motivation being that you can have more granular control over "accents" so to speak.
so en.json would become en-gb.json and en-us.json for example.
the reason I state this is because the dutch translations are made by a Belgium person. and whilst it is totally legible for me, dutch and flamish do have some differences witch result in sentences that are really unnatural in dutch, but totally normal in flamish. And since I don't think we should favor one over the other I suggest to just have both.
I'd be happy to provide you with a PR
I have a suggestion: convert the lang file names to locales instead of just the language. the motivation being that you can have more granular control over "accents" so to speak.
so en.json would become en-gb.json and en-us.json for example.
the reason I state this is because the dutch translations are made by a Belgium person. and whilst it is totally legible for me, dutch and flamish do have some differences witch result in sentences that are really unnatural in dutch, but totally normal in flamish. And since I don't think we should favor one over the other I suggest to just have both.
I'd be happy to provide you with a PR
Good insight, didn't realize this! I will probably leave language support to the community again, as I have quite a lot on my plate in terms of the rewrite. So if you or someone else wants to implement this to v0 or v2, I'd be happy to merge. Also seems like there's a lot of translations here that I've forgot to merge, so I'll try to include those next week (or if someone wants to speed things up, feel free to create a PR for me :))
Hi @aleksilassila,
A tip for you - Homarr is using crowdin project for language translations. Its very user friendly and anyone can contribute. Perhaps it can be used for Reiverr as well. Free license covers up to 60,000 words. Here is translation to Slovak:
{
"appName": "Reiverr",
"setupRequiredTitle": "Vitajte v ",
"setupRequiredDescription": "Zdá sa, že aplikácii chýbajú niektoré premenné jednotky, ktoré sú potrebné na fungovanie aplikácie. Uveďte nasledujúce premenné jednotky:",
"navbar": {
"home": "Domov",
"discover": "Objavte",
"library": "Knižnica",
"sources": "Zdroje",
"settings": "Nastavenia"
},
"search": {
"placeHolder": "Vyhľadajte Filmy a TV seriály",
"noRecentSearches": "Žiadne nedávne vyhľadávania",
"noResults": "Žiadne výsledky vyhľadávania"
},
"discover": {
"trending": "Trendy",
"popularPeople": "Obľúbení ľudia",
"upcomingMovies": "Pripravované Filmy",
"upcomingSeries": "Pripravované Seriály",
"genres": "Žánre",
"newDigitalReleases": "Nové digitálne tituly",
"streamingNow": "Vysielané práve teraz",
"TVNetworks": "TV Siete"
},
"library": {
"missingConfiguration": "Nakonfigurujte Radarr, Sonarr a Jellyfin na sledovanie a správu vašej knižnice",
"available": "Dostupné",
"watched": "Sledované",
"unavailable": "Nedostupné",
"sort": {
"byTitle": "Podľa Názvu"
},
"content": {
"movie": "Film",
"show": "Seriál",
"requestContent": "Požiadavka",
"directedBy": "Réžia",
"releaseDate": "Dátum Vydania",
"budget": "Rozpočet",
"status": "Stav",
"runtime": "Doba hrania",
"castAndCrew": "Obsadenie a štáb",
"recommendations": "Odporúčania",
"similarTitles": "Podobné tituly"
}
},
"sources": {},
"titleShowcase": {
"details": "Detaily",
"watchTrailer": "Pozrieť Upútavku",
"releaseDate": "Dátum Vydania",
"directedBy": "Réžia"
},
"settings": {
"navbar": {
"settings": "Konfigurácia",
"general": "Všeobecné",
"integrations": "Integrácie"
},
"general": {
"userInterface": {
"userInterface": "Používateľské rozhranie",
"language": "Jazyk",
"autoplayTrailers": "Automatické upútavky",
"animationDuration": "Trvanie animácie"
},
"discovery": {
"discovery": "Objavte",
"none": "Žiadne",
"region": "Región",
"excludeLibraryItemsFromDiscovery": "Vylúčiť položky knižnice z funkcie Objavte",
"includedLanguages": "Zahrnuté jazyky",
"includedLanguagesDescription": "Filtrujte výsledky na základe hovoreného jazyka. Preberá kódy jazykov ISO 639-1 oddelené čiarkami. Ak chcete deaktivovať, ponechajte prázdne."
}
},
"integrations": {
"integrations": "Integrácie",
"integrationsNote": "Poznámka: Základné adresy URL musia byť dostupné z prehliadača, čo znamená, že interné adresy dockerov napríklad nebudú fungovať. Kľúče API <span class='font-medium underline'>budú vystavené</span> prehliadaču.",
"baseUrl": "Základná adresa URL",
"apiKey": "API kľúč",
"testConnection": "Test pripojenia",
"status": {
"connected": "Pripojený",
"disconnected": "Odpojený"
},
"options": {
"options": "Možnosti",
"rootFolder": "Hlavný priečinok",
"qualityProfile": "Profil kvality",
"languageProfile": "Profil jazyka",
"jellyfinUser": "Jellyfin Používateľ"
}
},
"misc": {
"saveChanges": "Uložiť zmeny",
"resetToDefaults": "Obnoviť predvolené nastavenia ",
"changelog": "Denník zmien"
}
}
}
Where can I help translate Reiverr into French?