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 German language support #241

Merged
merged 7 commits into from
Nov 26, 2024
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/de/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
import en from '../en';
import type { BaseTranslation, Translation } from '../i18n-types';

const de = {
...(en as Translation),
addConnection: 'Verbindung hinzufügen',
allowConnections: 'Um Verbindungen zuzulassen, ändern Sie Ihre Servereinstellungen von',
allowMixedContent: 'Gemischte Inhalte zulassen',
apiKey: 'API-Schlüssel',
areYouSureYouWantToDeleteAllKnowledge: 'Sind Sie sicher, dass Sie alles Wissen löschen möchten?',
areYouSureYouWantToDeleteAllSessions: 'Sind Sie sicher, dass Sie alle Sitzungen löschen möchten?',
areYouSureYouWantToDeleteAllSettings:
'Sind Sie sicher, dass Sie alle Einstellungen löschen möchten?',
areYouSureYouWantToLeave:
'Sind Sie sicher, dass Sie die Seite verlassen möchten?\nDie laufende Ausführung wird gestoppt',
assistant: 'Assistent',
automatic: 'Automatisch',
automaticallyCheckForUpdates: 'Automatisch auf Updates prüfen',
availableModels: 'Verfügbare Modelle',
baseUrl: 'Basis-URL',
browseModels: 'Liste der verfügbaren Modelle durchsuchen',
cancel: 'Abbrechen',
cantConnectToOllamaServer: 'Kann keine Verbindung zum Ollama-Server herstellen',
checkBrowserExtensions:
'Überprüfen Sie auch, ob keine Browser-Erweiterungen die Verbindung blockieren',
checkingForUpdates: 'Prüfe auf Updates...',
checkNow: 'Jetzt prüfen',
clear: 'Leeren',
confirmDeletion: 'Löschen bestätigen',
connectionType: 'Verbindungstyp',
connectionLabelHelp: 'Bestimmt die Verbindung in der Modellliste',
connecting: 'Verbinde...',
connectionIsVerified: 'Die Verbindung wurde überprüft und ist einsatzbereit',
connectionFailedToVerify:
'Die Verbindung konnte nicht überprüft werden. Überprüfen Sie die Verbindungseinstellungen und versuchen Sie es erneut',
content: 'Inhalt',
controls: 'Steuerungen',
controlsOnlyAvailableForOllama:
'Erweiterte Steuerungen sind derzeit nur für Ollama-Modelle verfügbar',
copy: 'Kopieren',
couldntCheckForUpdates: 'Konnte nicht automatisch auf Updates prüfen',
couldntConnectToOllamaServer: 'Konnte keine Verbindung zum Ollama-Server herstellen',
creatingTunnel: 'Erstelle Tunnel',
currentVersion: 'Aktuelle Version',
dangerZone: 'Gefahrenzone',
dark: 'Dunkel',
deleteAllKnowledge: 'Alles Wissen löschen',
deleteAllSessions: 'Alle Sitzungen löschen',
deleteAllSettings: 'Alle Einstellungen löschen',
deleteKnowledge: 'Wissen löschen',
deleteServer: 'Server löschen',
deleteSession: 'Sitzung löschen',
disconnected: 'Getrennt',
dismiss: 'Verwerfen',
downloadModel: 'Modell herunterladen',
edit: 'Bearbeiten',
emptyKnowledge: 'Kein Wissen',
emptySessions: 'Keine Sitzungen',
error: 'Fehler',
f16Kv: 'F16 KV',
frequencyPenalty: 'Frequenzstrafe',
genericError: 'Entschuldigung, etwas ist schiefgelaufen',
goToDownloads: 'Zu Downloads gehen',
goToKnowledge: 'Zum Wissen gehen',
goToReleases: 'Zu Veröffentlichungen gehen',
howToObtainOpenAIKey: 'Wie erhält man einen API-Schlüssel von OpenAI?',
howToUpdateDocker: 'Wie aktualisiert man den Docker-Container?',
interface: 'Oberfläche',
internalServerError: 'Es gab einen internen Serverfehler. Bitte versuchen Sie es später erneut',
isCurrentVersionLatest: 'Sie verwenden die neueste Version',
isLatestVersion: 'Eine neuere Version ist verfügbar',
knowledge: 'Wissen',
knowledgeSaved: 'Wissen gespeichert',
label: 'Label',
language: 'Sprache',
lastUsedModels: 'Zuletzt verwendete Modelle',
light: 'Hell',
lowVram: 'Niedriger VRAM',
mainGpu: 'Haupt-GPU',
messageOfTheDay: 'Nachricht des Tages',
messages: 'Nachrichten',
minP: 'Min P',
mirostat: 'Mirostat',
mirostatEta: 'Mirostat ETA',
mirostatTau: 'Mirostat Tau',
modelNotFound: 'Modell nicht gefunden',
modelOptions: 'Modelloptionen',
modelWasDownloaded: '{model:string} wurde heruntergeladen',
modelsFilter: 'Modellnamen-Filter',
modelsFilterHelp: 'Blendet Modellnamen aus, die nicht mit dem Filter beginnen',
motd: 'Nachricht des Tages',
name: 'Name',
newKnowledge: 'Neues Wissen',
newSession: 'Neue Sitzung',
noApiKey: 'Kein API-Schlüssel',
noKnowledgeChosen: 'Erstellen Sie neues Wissen oder wählen Sie eines aus der Liste',
noRecentModels: 'Keine zuletzt verwendeten Modelle',
noServerConnections: 'Keine Serververbindungen, fügen Sie eine hinzu, um zu beginnen',
noSessionChosen: 'Erstellen Sie eine neue Sitzung oder wählen Sie eine aus der Liste',
notFound: 'Die Seite, die Sie suchen, existiert nicht',
numBatch: 'Anz. Bündel',
numCtx: 'Kontextgröße',
numGpu: 'Anz. GPU',
numKeep: 'Anz. behalten',
numPredict: 'Anz. vorhersagen',
numThread: 'Anzahl der Threads',
numa: 'NUMA',
ollama: 'Ollama',
ollamaLibrary: 'Ollamas Bibliothek',
openAIOfficialAPI: 'OpenAI: Offizielle API',
openAICompatible: 'OpenAI: Kompatible Server (z. B. llama.cpp)',
otherModels: 'Andere Modelle',
penalizeNewline: 'Neue Zeilen bestrafen',
presencePenalty: 'Präsenzstrafe',
prompt: 'Anweisung',
promptPlaceholder: 'Schreiben Sie buchstäblich alles',
pullModel: 'Modell abrufen',
pullModelPlaceholder: 'Modell-Tag (z.B. llama3.1)',
pullingModel: 'Modell wird abgerufen',
random: 'Zufällig',
refreshToUpdate: 'Neu laden, um zu aktualisieren',
releaseHistory: 'Versionsverlauf',
repeatLastN: 'Letzte N wiederholen',
repeatPenalty: 'Wiederholungsstrafe',
retry: 'Erneut versuchen',
run: 'Ausführen',
reVerify: 'Erneut überprüfen',
runtimeOptions: 'Laufzeitoptionen',
save: 'Speichern',
search: 'Suchen',
searchEmpty: 'Keine Ergebnisse gefunden',
seed: 'Seed',
seeDocs: 'Dokumentation ansehen',
servers: 'Server',
serverSettingsUpdated:
'Die Serverkonfiguration wurde aktualisiert und muss in den "Einstellungen" erneut überprüft werden',
session: 'Sitzung',
sessions: 'Sitzungen',
settings: 'Einstellungen',
somethingWentWrong: 'Entschuldigung, etwas ist schiefgelaufen',
stop: 'Stop-Sequenz',
stopCompletion: 'Ausführung stoppen',
stopResponse: 'Antwort stoppen',
success: 'Erfolg',
system: 'System',
systemPrompt: 'System-Anweisung',
temperature: 'Temperatur',
tfsZ: 'TFS Z',
topK: 'Top K',
topP: 'Top P',
tryingToConnectNotLocalhost:
'Wenn Sie versuchen, eine Verbindung zu einem Ollama-Server herzustellen, der nicht unter {hostname:string} oder {ip:string} verfügbar ist, versuchen Sie',
typicalP: 'Typisches P',
useMlock: 'MLOCK verwenden',
useMmap: 'MMAP verwenden',
useModelsFromThisServer: 'Modelle von diesem Server verwenden',
verify: 'Überprüfen',
version: 'Version',
vocabOnly: 'Nur Vokabular',
writePromptToStart: 'Schreiben Sie eine Anweisung, um eine neue Sitzung zu starten',
you: 'Sie'
} satisfies BaseTranslation;

export default de;
1 change: 1 addition & 0 deletions src/i18n/i18n-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export type BaseTranslation = BaseTranslationType
export type BaseLocale = 'en'

export type Locales =
| 'de'
| 'en'
| 'es'
| 'ja'
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 @@ -6,6 +6,7 @@ import type { Locales, Translations } from './i18n-types'
import { loadedFormatters, loadedLocales, locales } from './i18n-util'

const localeTranslationLoaders = {
de: () => import('./de'),
en: () => import('./en'),
es: () => import('./es'),
ja: () => import('./ja'),
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 @@ -5,6 +5,7 @@ import { initFormatters } from './formatters'
import type { Locales, Translations } from './i18n-types'
import { loadedFormatters, loadedLocales, locales } from './i18n-util'

import de from './de'
import en from './en'
import es from './es'
import ja from './ja'
Expand All @@ -14,6 +15,7 @@ import vi from './vi'
import zh_cn from './zh-cn'

const localeTranslations = {
de,
en,
es,
ja,
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 @@ -11,6 +11,7 @@ import type { Formatters, Locales, Translations, TranslationFunctions } from './
export const baseLocale: Locales = 'en'

export const locales: Locales[] = [
'de',
'en',
'es',
'ja',
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', 'es', 'ja', 'tr', 'pt-br', 'zh-cn', 'vi'],
['en', 'de', 'zh-cn', 'es', 'pt-br', 'ja', 'tr', 'vi'],
navigatorDetector
) as Locales;

Expand Down
1 change: 1 addition & 0 deletions src/routes/motd/motd.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
- **Multiple-server support** allows you to connect to one or more Ollama (and/or OpenAI) servers at the same time.
- **Models list can be filtered** by keyword for each server.
- **Servers can be labeled** to help you identify them in the models list.
- **Hallo Welt!** UI is now available in German.

#### Previously, in Hollama

Expand Down
5 changes: 3 additions & 2 deletions src/routes/settings/Interface.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,12 @@
onChange={() => changeLanguage(value)}
options={[
{ value: 'en', label: 'English' },
{ value: 'de', label: 'Deutsch' },
{ value: 'zh-cn', label: '中文 (简体)' },
{ value: 'es', label: 'Español' },
{ value: 'pt-br', label: 'Português (Brasil)' },
{ value: 'ja', label: '日本語' },
{ value: 'tr', label: 'Türkçe' },
{ value: 'pt-br', label: 'Português (Brasil)' },
{ value: 'zh-cn', label: '中文 (简体)' },
{ value: 'vi', label: 'Tiếng Việt' }
]}
/>
Expand Down
16 changes: 16 additions & 0 deletions tests/locales.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,20 @@ test.describe('Locales', () => {
);
});
});

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

await page.evaluate(() => window.localStorage.clear());
await page.reload();
await expect(page.getByText('Current version')).not.toBeVisible();
await expect(page.getByText('Aktuelle Version')).toBeVisible();
expect(await page.evaluate(() => window.localStorage.getItem('hollama-settings'))).toContain(
'"userLanguage":"de"'
);
});
});
});
Loading