From 2d2fd5852a6bdf9685f5dea1440d34a2b961d179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20H=C3=B6rmann?= Date: Wed, 20 Nov 2024 13:42:08 +0100 Subject: [PATCH 1/7] feat(i18n): add german language support --- src/i18n/de/index.ts | 151 +++++++++++++++++++++++++++ src/i18n/i18n-types.ts | 1 + src/i18n/i18n-util.async.ts | 1 + src/i18n/i18n-util.sync.ts | 2 + src/i18n/i18n-util.ts | 1 + src/routes/+layout.svelte | 2 +- src/routes/settings/Interface.svelte | 1 + tests/settings.test.ts | 16 +++ 8 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 src/i18n/de/index.ts diff --git a/src/i18n/de/index.ts b/src/i18n/de/index.ts new file mode 100644 index 00000000..10b4cbd7 --- /dev/null +++ b/src/i18n/de/index.ts @@ -0,0 +1,151 @@ +import en from '../en'; +import type { BaseTranslation, Translation } from '../i18n-types'; + +const de = { + ...(en as Translation), + 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', + connect: 'Verbinden', + connected: 'Verbunden', + connecting: 'Verbinde...', + 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', + 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', + 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', + 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', + 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', + ollamaLibrary: 'Ollamas Bibliothek', + openaiSyncFailed: + 'Verbindung zu OpenAI fehlgeschlagen. Überprüfen Sie Ihren API-Schlüssel oder die Netzwerkverbindung', + openaiSyncSuccessful: + 'Synchronisation erfolgreich. OpenAI-Modelle sind jetzt in Sitzungen verfügbar', + 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', + runtimeOptions: 'Laufzeitoptionen', + save: 'Speichern', + search: 'Suchen', + searchEmpty: 'Keine Ergebnisse gefunden', + seed: 'Seed', + seeDocs: 'Dokumentation ansehen', + server: 'Server', + 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', + version: 'Version', + vocabOnly: 'Nur Vokabular', + writePromptToStart: 'Schreiben Sie eine Anweisung, um eine neue Sitzung zu starten', + you: 'Sie' +} satisfies BaseTranslation; + +export default de; diff --git a/src/i18n/i18n-types.ts b/src/i18n/i18n-types.ts index a766d552..4eae54e6 100644 --- a/src/i18n/i18n-types.ts +++ b/src/i18n/i18n-types.ts @@ -6,6 +6,7 @@ export type BaseTranslation = BaseTranslationType export type BaseLocale = 'en' export type Locales = + | 'de' | 'en' | 'es' | 'ja' diff --git a/src/i18n/i18n-util.async.ts b/src/i18n/i18n-util.async.ts index 1c72a617..d1ad95ba 100644 --- a/src/i18n/i18n-util.async.ts +++ b/src/i18n/i18n-util.async.ts @@ -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'), diff --git a/src/i18n/i18n-util.sync.ts b/src/i18n/i18n-util.sync.ts index a7d95dd2..3b84db03 100644 --- a/src/i18n/i18n-util.sync.ts +++ b/src/i18n/i18n-util.sync.ts @@ -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' @@ -14,6 +15,7 @@ import vi from './vi' import zh_cn from './zh-cn' const localeTranslations = { + de, en, es, ja, diff --git a/src/i18n/i18n-util.ts b/src/i18n/i18n-util.ts index 5cbeb1ff..7db657b6 100644 --- a/src/i18n/i18n-util.ts +++ b/src/i18n/i18n-util.ts @@ -11,6 +11,7 @@ import type { Formatters, Locales, Translations, TranslationFunctions } from './ export const baseLocale: Locales = 'en' export const locales: Locales[] = [ + 'de', 'en', 'es', 'ja', diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 309c8ba7..d9568871 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -33,7 +33,7 @@ if (!$settingsStore.userLanguage) $settingsStore.userLanguage = detectLocale( 'en', - ['en', 'es', 'ja', 'tr', 'pt-br', 'zh-cn', 'vi'], + ['en', 'es', 'de', 'ja', 'tr', 'pt-br', 'zh-cn', 'vi'], navigatorDetector ) as Locales; diff --git a/src/routes/settings/Interface.svelte b/src/routes/settings/Interface.svelte index dbae7fce..31a87237 100644 --- a/src/routes/settings/Interface.svelte +++ b/src/routes/settings/Interface.svelte @@ -30,6 +30,7 @@ options={[ { value: 'en', label: 'English' }, { value: 'es', label: 'Español' }, + { value: 'de', label: 'Deutsch' }, { value: 'ja', label: '日本語' }, { value: 'tr', label: 'Türkçe' }, { value: 'pt-br', label: 'Português (Brasil)' }, diff --git a/tests/settings.test.ts b/tests/settings.test.ts index 5d27bd0a..ee1b8209 100644 --- a/tests/settings.test.ts +++ b/tests/settings.test.ts @@ -87,4 +87,20 @@ test.describe('Settings', () => { await expect(page.getByText('Servers')).toBeVisible(); await expect(page.getByText('Servidores')).not.toBeVisible(); }); + + 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"' + ); + }); + }); }); From b887435b1608ffde29e3bd001cbc3e4007f0f04b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20H=C3=B6rmann?= Date: Wed, 20 Nov 2024 13:48:32 +0100 Subject: [PATCH 2/7] chore(settings): sort languages By number of worldwide speakers --- src/routes/+layout.svelte | 2 +- src/routes/settings/Interface.svelte | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index d9568871..d494bb37 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -33,7 +33,7 @@ if (!$settingsStore.userLanguage) $settingsStore.userLanguage = detectLocale( 'en', - ['en', 'es', 'de', 'ja', 'tr', 'pt-br', 'zh-cn', 'vi'], + ['en', 'zh-cn', 'es', 'pt-br', 'de', 'ja', 'tr', 'vi'], navigatorDetector ) as Locales; diff --git a/src/routes/settings/Interface.svelte b/src/routes/settings/Interface.svelte index 31a87237..2fabeb2e 100644 --- a/src/routes/settings/Interface.svelte +++ b/src/routes/settings/Interface.svelte @@ -29,12 +29,12 @@ onChange={() => changeLanguage(value)} options={[ { value: 'en', label: 'English' }, + { value: 'zh-cn', label: '中文 (简体)' }, { value: 'es', label: 'Español' }, + { value: 'pt-br', label: 'Português (Brasil)' }, { value: 'de', label: 'Deutsch' }, { 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' } ]} /> From 1376902b36240866f48be370c789321e8eae8b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20H=C3=B6rmann?= Date: Mon, 25 Nov 2024 18:08:20 +0100 Subject: [PATCH 3/7] chore(settings): move german translation up --- src/routes/+layout.svelte | 2 +- src/routes/settings/Interface.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index d494bb37..b684e1f0 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -33,7 +33,7 @@ if (!$settingsStore.userLanguage) $settingsStore.userLanguage = detectLocale( 'en', - ['en', 'zh-cn', 'es', 'pt-br', 'de', 'ja', 'tr', 'vi'], + ['en', 'de', 'zh-cn', 'es', 'pt-br', 'ja', 'tr', 'vi'], navigatorDetector ) as Locales; diff --git a/src/routes/settings/Interface.svelte b/src/routes/settings/Interface.svelte index 2fabeb2e..4b569b0e 100644 --- a/src/routes/settings/Interface.svelte +++ b/src/routes/settings/Interface.svelte @@ -29,10 +29,10 @@ 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: 'de', label: 'Deutsch' }, { value: 'ja', label: '日本語' }, { value: 'tr', label: 'Türkçe' }, { value: 'vi', label: 'Tiếng Việt' } From 5c0f90e3b963e1b84424da026dba0c2928476580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20H=C3=B6rmann?= Date: Mon, 25 Nov 2024 18:14:53 +0100 Subject: [PATCH 4/7] test(locales): move german translation test --- tests/locales.test.ts | 16 ++++++++++++++++ tests/settings.test.ts | 16 ---------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/locales.test.ts b/tests/locales.test.ts index 7ad36679..45f9397e 100644 --- a/tests/locales.test.ts +++ b/tests/locales.test.ts @@ -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"' + ); + }); + }); }); diff --git a/tests/settings.test.ts b/tests/settings.test.ts index ee1b8209..5d27bd0a 100644 --- a/tests/settings.test.ts +++ b/tests/settings.test.ts @@ -87,20 +87,4 @@ test.describe('Settings', () => { await expect(page.getByText('Servers')).toBeVisible(); await expect(page.getByText('Servidores')).not.toBeVisible(); }); - - 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"' - ); - }); - }); }); From 8e343b4a5ef94c2f7cc79ce8e0b57aa57649c114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20H=C3=B6rmann?= Date: Tue, 26 Nov 2024 09:51:36 +0100 Subject: [PATCH 5/7] chore(i18n): adapt german translation to main branch changes --- src/i18n/de/index.ts | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/i18n/de/index.ts b/src/i18n/de/index.ts index 10b4cbd7..5838e777 100644 --- a/src/i18n/de/index.ts +++ b/src/i18n/de/index.ts @@ -3,6 +3,7 @@ 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', @@ -26,9 +27,12 @@ const de = { checkNow: 'Jetzt prüfen', clear: 'Leeren', confirmDeletion: 'Löschen bestätigen', - connect: 'Verbinden', - connected: 'Verbunden', + 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: @@ -44,6 +48,7 @@ const de = { 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', @@ -66,6 +71,7 @@ const de = { isLatestVersion: 'Eine neuere Version ist verfügbar', knowledge: 'Wissen', knowledgeSaved: 'Wissen gespeichert', + label: 'Label', language: 'Sprache', lastUsedModels: 'Zuletzt verwendete Modelle', light: 'Hell', @@ -80,6 +86,8 @@ const de = { 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', @@ -87,6 +95,7 @@ const de = { 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', @@ -96,11 +105,10 @@ const de = { numPredict: 'Anz. vorhersagen', numThread: 'Anzahl der Threads', numa: 'NUMA', + ollama: 'Ollama', ollamaLibrary: 'Ollamas Bibliothek', - openaiSyncFailed: - 'Verbindung zu OpenAI fehlgeschlagen. Überprüfen Sie Ihren API-Schlüssel oder die Netzwerkverbindung', - openaiSyncSuccessful: - 'Synchronisation erfolgreich. OpenAI-Modelle sind jetzt in Sitzungen verfügbar', + openAIOfficialAPI: 'OpenAI: Offizielle API', + openAICompatible: 'OpenAI: Kompatible Server (z. B. llama.cpp)', otherModels: 'Andere Modelle', penalizeNewline: 'Neue Zeilen bestrafen', presencePenalty: 'Präsenzstrafe', @@ -122,7 +130,9 @@ const de = { searchEmpty: 'Keine Ergebnisse gefunden', seed: 'Seed', seeDocs: 'Dokumentation ansehen', - server: 'Server', + servers: 'Server', + serverSettingsUpdated: + 'Die Serverkonfiguration wurde aktualisiert und muss in den "Einstellungen" erneut überprüft werden', session: 'Sitzung', sessions: 'Sitzungen', settings: 'Einstellungen', @@ -142,6 +152,8 @@ const de = { 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', From 2456a984dfec91792fa63f9e423b73a6598c101a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jochen=20H=C3=B6rmann?= Date: Tue, 26 Nov 2024 10:20:02 +0100 Subject: [PATCH 6/7] chore(i18n): add missing key to german translation --- src/i18n/de/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i18n/de/index.ts b/src/i18n/de/index.ts index 5838e777..a0f1fece 100644 --- a/src/i18n/de/index.ts +++ b/src/i18n/de/index.ts @@ -124,6 +124,7 @@ const de = { repeatPenalty: 'Wiederholungsstrafe', retry: 'Erneut versuchen', run: 'Ausführen', + reVerify: 'Erneut überprüfen', runtimeOptions: 'Laufzeitoptionen', save: 'Speichern', search: 'Suchen', From 708b4c013d83e1d9c5551d5907c6a8b078ed445f Mon Sep 17 00:00:00 2001 From: Fernando Maclen Date: Tue, 26 Nov 2024 10:55:47 -0500 Subject: [PATCH 7/7] feat: add release note to MOTD --- src/routes/motd/motd.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/motd/motd.md b/src/routes/motd/motd.md index 8585ec5a..13d1c373 100644 --- a/src/routes/motd/motd.md +++ b/src/routes/motd/motd.md @@ -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