From 873e45c295270c5d4ee31d94cc041258df8c1cbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Hu=E1=BB=B3nh=20Nguy=C3=AAn?= Date: Sat, 26 Oct 2024 09:13:39 +0700 Subject: [PATCH] Add language support for Vietnamese language (#224) This PR follows the issue #223 --- 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/i18n/vi/index.ts | 112 +++++++++++++++++++++++++++ src/routes/+layout.svelte | 2 +- src/routes/settings/Interface.svelte | 3 +- tests/settings.test.ts | 16 ++++ 8 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 src/i18n/vi/index.ts diff --git a/src/i18n/i18n-types.ts b/src/i18n/i18n-types.ts index c962c27..b37c3ea 100644 --- a/src/i18n/i18n-types.ts +++ b/src/i18n/i18n-types.ts @@ -11,6 +11,7 @@ export type Locales = | 'ja' | 'pt-br' | 'tr' + | 'vi' | 'zh-cn' export type Translation = RootTranslation diff --git a/src/i18n/i18n-util.async.ts b/src/i18n/i18n-util.async.ts index c51e671..1c72a61 100644 --- a/src/i18n/i18n-util.async.ts +++ b/src/i18n/i18n-util.async.ts @@ -11,6 +11,7 @@ const localeTranslationLoaders = { ja: () => import('./ja'), 'pt-br': () => import('./pt-br'), tr: () => import('./tr'), + vi: () => import('./vi'), 'zh-cn': () => import('./zh-cn'), } diff --git a/src/i18n/i18n-util.sync.ts b/src/i18n/i18n-util.sync.ts index 1d7fc0a..a7d95dd 100644 --- a/src/i18n/i18n-util.sync.ts +++ b/src/i18n/i18n-util.sync.ts @@ -10,6 +10,7 @@ import es from './es' import ja from './ja' import pt_br from './pt-br' import tr from './tr' +import vi from './vi' import zh_cn from './zh-cn' const localeTranslations = { @@ -18,6 +19,7 @@ const localeTranslations = { ja, 'pt-br': pt_br, tr, + vi, 'zh-cn': zh_cn, } diff --git a/src/i18n/i18n-util.ts b/src/i18n/i18n-util.ts index ba47b50..5cbeb1f 100644 --- a/src/i18n/i18n-util.ts +++ b/src/i18n/i18n-util.ts @@ -16,6 +16,7 @@ export const locales: Locales[] = [ 'ja', 'pt-br', 'tr', + 'vi', 'zh-cn' ] diff --git a/src/i18n/vi/index.ts b/src/i18n/vi/index.ts new file mode 100644 index 0000000..d5f97e4 --- /dev/null +++ b/src/i18n/vi/index.ts @@ -0,0 +1,112 @@ +import en from '../en'; +import type { BaseTranslation, Translation } from '../i18n-types'; + +const vi = { + ...(en as Translation), + allowConnections: 'Thay đổi cài đặt máy chủ của bạn để cho phép kết nối từ', + allowMixedContent: 'Cho phép nội dung hỗn hợp', + areYouSureYouWantToDeleteAllKnowledge: 'Bạn có chắc chắn muốn xóa toàn bộ kiến thức không?', + areYouSureYouWantToDeleteAllSessions: 'Bạn có chắc chắn muốn xóa toàn bộ phiên không?', + areYouSureYouWantToDeleteAllSettings: 'Bạn có chắc chắn muốn xóa toàn bộ cài đặt không?', + areYouSureYouWantToLeave: 'Bạn có chắc chắn muốn rời đi?\nQuá trình đang thực hiện sẽ dừng lại', + assistant: 'Trợ lý', + automatic: 'Tự động', + automaticallyCheckForUpdates: 'Tự động kiểm tra cập nhật', + availableModels: 'Các mô hình có sẵn', + browseModels: 'Xem danh sách các mô hình có sẵn', + cancel: 'Hủy', + cantConnectToOllamaServer: 'Không thể kết nối với máy chủ Ollama', + checkBrowserExtensions: + 'Cũng kiểm tra xem có tiện ích mở rộng trình duyệt nào chặn kết nối không', + checkingForUpdates: 'Đang kiểm tra cập nhật...', + checkNow: 'Kiểm tra ngay', + clear: 'Xóa', + confirmDeletion: 'Xác nhận xóa', + connected: 'Đã kết nối', + content: 'Nội dung', + controls: 'Điều khiển', + copy: 'Sao chép', + couldntCheckForUpdates: 'Không thể tự động kiểm tra cập nhật', + couldntConnectToOllamaServer: 'Không thể kết nối với máy chủ Ollama', + creatingTunnel: 'Đang tạo đường hầm', + currentVersion: 'Phiên bản hiện tại', + dangerZone: 'Vùng nguy hiểm', + dark: 'Giao diện Tối', + deleteAllKnowledge: 'Xóa toàn bộ kiến thức', + deleteAllSessions: 'Xóa toàn bộ phiên', + deleteAllSettings: 'Xóa toàn bộ cài đặt', + deleteKnowledge: 'Xóa kiến thức', + deleteSession: 'Xóa phiên', + disconnected: 'Đã ngắt kết nối', + dismiss: 'Bỏ qua', + downloadModel: 'Tải xuống mô hình', + edit: 'Chỉnh sửa', + emptyKnowledge: 'Không có kiến thức', + emptySessions: 'Không có phiên', + error: 'Lỗi', + genericError: 'Xin lỗi, đã xảy ra sự cố', + goToDownloads: 'Đi đến mục tải xuống', + goToKnowledge: 'Đi đến kiến thức', + goToReleases: 'Đi đến bản phát hành', + howToUpdateDocker: 'Cách cập nhật Docker container?', + interface: 'Giao diện', + internalServerError: 'Đã xảy ra lỗi máy chủ nội bộ, vui lòng thử lại sau', + isCurrentVersionLatest: 'Bạn đang sử dụng phiên bản mới nhất', + isLatestVersion: 'Có phiên bản mới hơn', + knowledge: 'Kiến thức', + knowledgeSaved: 'Đã lưu kiến thức', + language: 'Ngôn ngữ', + lastUsedModels: 'Các mô hình đã sử dụng gần đây', + light: 'Giao diện Sáng', + lowVram: 'VRAM thấp', + mainGpu: 'GPU chính', + messages: 'Tin nhắn', + modelOptions: 'Tùy chọn mô hình', + modelWasDownloaded: '{model:string} đã được tải xuống', + motd: 'Motd', + name: 'Tên', + newKnowledge: 'Kiến thức mới', + newSession: 'Phiên mới', + noKnowledgeChosen: 'Tạo kiến thức mới hoặc chọn từ danh sách', + noRecentModels: 'Không có mô hình nào sử dụng gần đây', + noSessionChosen: 'Tạo phiên mới hoặc chọn một phiên hiện có từ danh sách', + notFound: 'Trang bạn đang tìm kiếm không tồn tại', + ollamaLibrary: 'Thư viện Ollama', + otherModels: 'Các mô hình khác', + prompt: 'Câu hỏi', + promptPlaceholder: 'Viết bất cứ điều gì', + pullModel: 'Tải về mô hình', + pullModelPlaceholder: 'Thẻ mô hình (ví dụ: llama3.1)', + pullingModel: 'Đang tải về mô hình', + random: 'Ngẫu nhiên', + refreshToUpdate: 'Làm mới để cập nhật', + releaseHistory: 'Lịch sử phát hành', + retry: 'Thử lại', + run: 'Chạy', + runtimeOptions: 'Tùy chọn runtime', + save: 'Lưu', + search: 'Tìm kiếm', + searchEmpty: 'Không tìm thấy kết quả', + seed: 'Seed', + seeDocs: 'Xem tài liệu', + server: 'Máy chủ', + session: 'Phiên', + sessions: 'Các phiên', + settings: 'Cài đặt', + somethingWentWrong: 'Xin lỗi, đã xảy ra sự cố', + stopResponse: 'Dừng phản hồi', + success: 'Thành công', + system: 'Hệ thống', + systemPrompt: 'Câu hỏi hệ thống', + tryingToConnectNotLocalhost: + 'Nếu bạn muốn kết nối với máy chủ Ollama không có sẵn trên {hostname:string} hoặc {ip:string}, hãy thử', + typicalP: 'Typical P', + useMlock: 'Sử dụng MLOCK', + useMmap: 'Sử dụng MMAP', + version: 'Phiên bản', + vocabOnly: 'Chỉ từ vựng', + writePromptToStart: 'Viết một câu hỏi để bắt đầu phiên mới', + you: 'Bạn' +} satisfies BaseTranslation; + +export default vi; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index fbdc60a..1def88e 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -31,7 +31,7 @@ if (!$settingsStore.userLanguage) $settingsStore.userLanguage = detectLocale( 'en', - ['en', 'es', 'ja', 'tr', 'pt-br', 'zh-cn'], + ['en', 'es', '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 55fe32b..dbae7fc 100644 --- a/src/routes/settings/Interface.svelte +++ b/src/routes/settings/Interface.svelte @@ -33,7 +33,8 @@ { value: 'ja', label: '日本語' }, { value: 'tr', label: 'Türkçe' }, { value: 'pt-br', label: 'Português (Brasil)' }, - { value: 'zh-cn', label: '中文 (简体)' } + { value: 'zh-cn', label: '中文 (简体)' }, + { value: 'vi', label: 'Tiếng Việt' } ]} /> diff --git a/tests/settings.test.ts b/tests/settings.test.ts index 991aab2..798ec59 100644 --- a/tests/settings.test.ts +++ b/tests/settings.test.ts @@ -264,4 +264,20 @@ test.describe('Locales', () => { ); }); }); + + test.describe('Vietnamese', () => { + test.use({ locale: 'vi' }); + test('default language is vietnamese', async ({ page }) => { + await page.goto('/settings'); + expect(await page.evaluate(() => navigator.language)).toBe('vi'); + + await page.evaluate(() => window.localStorage.clear()); + await page.reload(); + await expect(page.getByText('Server')).not.toBeVisible(); + await expect(page.getByText('Máy chủ')).toBeVisible(); + expect(await page.evaluate(() => window.localStorage.getItem('hollama-settings'))).toContain( + '"userLanguage":"vi"' + ); + }); + }); });