Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add French language support #267

Merged
merged 7 commits into from
Feb 12, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 164 additions & 0 deletions src/i18n/fr/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
import type { BaseTranslation } from '../i18n-types';

const fr = {
addConnection: 'Ajouter une connexion',
allowConnections: 'Changez les paramètres de votre serveur pour autoriser les connexions depuis',
allowMixedContent: 'Autoriser le contenu mixte',
apiKey: 'Clé API',
areYouSureYouWantToDeleteAllKnowledge:
'Êtes-vous sûr de vouloir supprimer toute la connaissance?',
areYouSureYouWantToDeleteAllSessions: 'Êtes-vous sûr de vouloir supprimer toutes les sessions?',
areYouSureYouWantToDeleteAllSettings: 'Êtes-vous sûr de vouloir supprimer tous les paramètres?',
areYouSureYouWantToLeave: "Êtes-vous sûr de vouloir quitter?\nLa complétion en cours s'arrêtera",
assistant: 'Assistant',
automatic: 'Auto',
automaticallyCheckForUpdates: 'Vérifier automatiquement les mises à jour',
availableModels: 'Modèles disponibles',
baseUrl: 'URL de base',
browseModels: 'Parcourez la liste des modèles disponibles',
cancel: 'Annuler',
cantConnectToOllamaServer: 'Impossible de se connecter au serveur Ollama',
checkBrowserExtensions:
"Vérifiez également qu'aucune extension de navigateur ne bloque la connexionr",
checkingForUpdates: 'Recherche de mises à jour...',
checkNow: 'Vérifier maintenant',
clear: 'Effacer',
confirmDeletion: 'Confirmer la suppression',
connectionType: 'Type de connexion',
connectionLabelHelp: 'Identifie la connexion dans la liste des modèles',
connecting: 'Connexion...',
connectionIsVerified: 'La connexion a été vérifiée et est prête à être utilisée',
connectionFailedToVerify:
'Échec de la vérification de la connexion, vérifiez les paramètres de connexion et réessayez',
content: 'Contenu',
controls: 'Contrôles',
controlsOnlyAvailableForOllama:
'Les contrôles avancés sont actuellement uniquement disponibles pour les modèles Ollama',
copy: 'Copier',
couldntCheckForUpdates: 'Impossible de vérifier automatiquement la présence de mises à jour',
couldntConnectToOllamaServer: 'Impossible de se connecter au serveur Ollama',
creatingTunnel: 'Création d’un tunnel',
currentVersion: 'Version actuelle',
dangerZone: 'Zone dangereuse',
dark: 'Sombre',
deleteAllKnowledge: 'Supprimer toute la connaissance',
deleteAllSessions: 'Supprimer toutes les sessions',
deleteAllSettings: 'Supprimer tous les paramètres',
deleteKnowledge: 'Supprimer la connaissance',
deleteServer: 'Supprimer le serveur',
deleteSession: 'Supprimer la session',
disconnected: 'Déconnecté',
dismiss: 'Ignorer',
downloadModel: 'Télécharger le modèle',
edit: 'Éditer',
emptyKnowledge: 'Aucune connaissance',
emptySessions: 'Aucune session',
error: 'Erreur',
f16Kv: 'F16 KV',
frequencyPenalty: 'Pénalité de fréquence',
genericError: 'Désolé, quelque chose s’est mal passé',
goToDownloads: 'Aller aux téléchargements',
goToKnowledge: 'Aller à la connaissance',
goToReleases: 'Aller aux versions',
howToObtainOpenAIKey: 'Comment obtenir une clé API d’OpenAI?',
howToUpdateDocker: 'Comment mettre à jour le conteneur Docker?',
interface: 'Interface',
internalServerError: 'Il y a eu une erreur interne du serveur, veuillez réessayer plus tard',
isCurrentVersionLatest: 'Vous êtes sur la dernière version',
isLatestVersion: 'Une version plus récente est disponible',
knowledge: 'Connaissance',
knowledgeSaved: 'Connaissance sauvegardée',
label: 'Étiquette',
language: 'Langue',
lastUsedModels: 'Modèles utilisés récemment',
light: 'Clair',
lowVram: 'Faible VRAM',
mainGpu: 'GPU principal',
messageOfTheDay: 'Message du jour',
messages: 'Messages',
minP: 'Min P',
mirostat: 'Mirostat',
mirostatEta: 'Mirostat ETA',
mirostatTau: 'Mirostat Tau',
modelNotFound: 'Modèle non trouvé',
modelOptions: 'Options de modèle',
modelWasDownloaded: '{model:string} a été téléchargé',
modelsFilter: 'Filtre des noms de modèles',
modelsFilterHelp: 'Masque les noms de modèles ne commençant pas par le filtre',
motd: 'Motd',
name: 'Nom',
newKnowledge: 'Nouvelle connaissance',
newSession: 'Nouvelle session',
noApiKey: 'Aucune clé API',
noKnowledgeChosen: 'Créez une nouvelle connaissance ou choisissez-en une dans la liste',
noRecentModels: 'Aucun modèle utilisé récemment',
noServerConnections: 'Aucune connexion de serveur, ajoutez-en un pour commencer',
noSessionChosen: 'Créez une nouvelle session ou choisissez-en une existante dans la liste',
notFound: "La page que vous recherchez n'existe pas",
numBatch: 'Num lot',
numCtx: 'Taille du contexte',
numGpu: 'Num GPU',
numKeep: 'Num garder',
numPredict: 'Num prédire',
numThread: 'Nombre de threads',
numa: 'NUMA',
ollama: 'Ollama',
ollamaLibrary: 'Bibliothèque d’Ollama',
openAIOfficialAPI: 'OpenAI : API officielle',
openAICompatible: 'OpenAI : Serveurs compatibles (ex. llama.cpp)',
otherModels: 'Autres modèles',
penalizeNewline: 'Pénaliser le retour à la ligne',
presencePenalty: 'Pénalité de présence',
prompt: 'Invite',
promptPlaceholder: 'Écrivez littéralement n’importe quoi',
pullModel: 'Tirer le modèle',
pullModelPlaceholder: 'Balise du modèle (ex. llama3.1)',
pullingModel: 'Téléchargement du modèle en cours',
random: 'Aléatoire',
reasoning: 'Raisonnement',
refreshToUpdate: 'Actualiser pour mettre à jour',
releaseHistory: 'Historique des versions',
repeatLastN: 'Répéter les N derniers',
repeatPenalty: 'Pénalité de répétition',
retry: 'Réessayer',
run: 'Exécuter',
reVerify: 'Revérifier',
runtimeOptions: 'Options d’exécution',
save: 'Enregistrer',
search: 'Rechercher',
searchEmpty: 'Aucun résultat trouvé',
seed: 'Graine',
seeDocs: 'Voir la documentation',
servers: 'Serveurs',
serverSettingsUpdated:
'La configuration du serveur a été mise à jour et doit être revérifiée dans « Paramètres »',
session: 'Session',
sessions: 'Sessions',
settings: 'Paramètres',
somethingWentWrong: 'Désolé, quelque chose s’est mal passé',
stop: 'Séquence d’arrêt',
stopCompletion: 'Arrêter la complétion',
stopResponse: 'Arrêter la réponse',
success: 'Succès',
system: 'Système',
systemPrompt: 'Invite système',
temperature: 'Température',
tfsZ: 'TFS Z',
topK: 'Top K',
topP: 'Top P',
tryingToConnectNotLocalhost:
'Si vous voulez vous connecter à un serveur Ollama non disponible sur {hostname:string} ou {ip:string}, essayez',
typicalP: 'Typical P',
useMlock: 'Utiliser MLOCK',
useMmap: 'Utiliser MMAP',
useModelsFromThisServer: 'Utiliser les modèles de ce serveur',
verify: 'Vérifier',
version: 'Version',
vocabOnly: 'Vocabulaire uniquement',
writePromptToStart: 'Écrivez une invite pour démarrer une nouvelle session',
you: 'Vous',
copiedNotPrivate: 'Contenu copié, mais votre connexion n’est pas privée',
notCopiedNotPrivate: 'Impossible de copier le contenu. La connexion n’est pas privée'
} satisfies BaseTranslation;

export default fr;
1 change: 1 addition & 0 deletions src/i18n/i18n-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export type Locales =
| 'de'
| 'en'
| 'es'
| 'fr'
| 'ja'
| 'pt-br'
| 'tr'
Expand Down
1 change: 1 addition & 0 deletions src/i18n/i18n-util.async.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const localeTranslationLoaders = {
de: () => import('./de'),
en: () => import('./en'),
es: () => import('./es'),
fr: () => import('./fr'),
ja: () => import('./ja'),
'pt-br': () => import('./pt-br'),
tr: () => import('./tr'),
Expand Down
2 changes: 2 additions & 0 deletions src/i18n/i18n-util.sync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { loadedFormatters, loadedLocales, locales } from './i18n-util'
import de from './de'
import en from './en'
import es from './es'
import fr from './fr'
import ja from './ja'
import pt_br from './pt-br'
import tr from './tr'
Expand All @@ -18,6 +19,7 @@ const localeTranslations = {
de,
en,
es,
fr,
ja,
'pt-br': pt_br,
tr,
Expand Down
1 change: 1 addition & 0 deletions src/i18n/i18n-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export const locales: Locales[] = [
'de',
'en',
'es',
'fr',
'ja',
'pt-br',
'tr',
Expand Down
2 changes: 1 addition & 1 deletion src/routes/+layout.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
if (!$settingsStore.userLanguage)
$settingsStore.userLanguage = detectLocale(
'en',
['en', 'de', 'zh-cn', 'es', 'pt-br', 'ja', 'tr', 'vi'],
['en', 'de', 'zh-cn', 'es', 'fr', 'pt-br', 'ja', 'tr', 'vi'],
navigatorDetector
) as Locales;

Expand Down
5 changes: 2 additions & 3 deletions src/routes/motd/motd.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
`2025-1-26`
`2025-02-12`

### Message of the day

Expand All @@ -8,6 +8,7 @@

- **Reasoning responses** (i.e. [`deepseek-r1`](https://ollama.com/library/deepseek-r1)) are now displayed in a dedicated UI component.
- **Multiple-server support** allows you to connect to one or more Ollama (and/or OpenAI) servers at the same time.
- **Bonjour le monde!** UI is now available in French.

#### Previously, in Hollama

Expand All @@ -34,8 +35,6 @@
We welcome contributions from people familiar with **Svelte**, **TypeScript** and **TailwindCSS**.
If that sparks your interest, read this next: [`CONTRIBUTING.md`](https://github.com/fmaclen/hollama/blob/main/CONTRIBUTING.md)

If you want to contribute in a _less_ technical role, such as UI/UX designers or if you are good at prompt engineering, please [reach out](mailto:[email protected])

#### About

Created by [@fmaclen](https://fernando.is), made with the help of [contributors](https://github.com/fmaclen/hollama/graphs/contributors)
1 change: 1 addition & 0 deletions src/routes/settings/Interface.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
{ value: 'de', label: 'Deutsch' },
{ value: 'zh-cn', label: '中文 (简体)' },
{ value: 'es', label: 'Español' },
{ value: 'fr', label: 'Français' },
{ value: 'pt-br', label: 'Português (Brasil)' },
{ value: 'ja', label: '日本語' },
{ value: 'tr', label: 'Türkçe' },
Expand Down
Binary file modified tests/docs.test.ts-snapshots/motd.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 16 additions & 0 deletions tests/locales.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,4 +112,20 @@ test.describe('Locales', () => {
);
});
});

test.describe('French', () => {
test.use({ locale: 'fr-FR' });
test('default language is French', async ({ page }) => {
await page.goto('/settings');
expect(await page.evaluate(() => navigator.language)).toBe('fr-FR');

await page.evaluate(() => window.localStorage.clear());
await page.reload();
await expect(page.getByText('Servers')).not.toBeVisible();
await expect(page.getByText('Serveurs')).toBeVisible();
expect(await page.evaluate(() => window.localStorage.getItem('hollama-settings'))).toContain(
'"userLanguage":"fr"'
);
});
});
});
Loading