diff --git a/src/i18n/i18n-types.ts b/src/i18n/i18n-types.ts index bc2c13f4..297c3601 100644 --- a/src/i18n/i18n-types.ts +++ b/src/i18n/i18n-types.ts @@ -11,6 +11,7 @@ export type Locales = | 'es' | 'fr' | 'ja' + | 'ka' | 'pt-br' | 'tr' | 'vi' diff --git a/src/i18n/i18n-util.async.ts b/src/i18n/i18n-util.async.ts index 9ac13577..5391362b 100644 --- a/src/i18n/i18n-util.async.ts +++ b/src/i18n/i18n-util.async.ts @@ -11,6 +11,7 @@ const localeTranslationLoaders = { es: () => import('./es'), fr: () => import('./fr'), ja: () => import('./ja'), + ka: () => import('./ka'), 'pt-br': () => import('./pt-br'), tr: () => import('./tr'), vi: () => import('./vi'), diff --git a/src/i18n/i18n-util.sync.ts b/src/i18n/i18n-util.sync.ts index 9fab8dd7..f2986ec4 100644 --- a/src/i18n/i18n-util.sync.ts +++ b/src/i18n/i18n-util.sync.ts @@ -10,6 +10,7 @@ import en from './en' import es from './es' import fr from './fr' import ja from './ja' +import ka from './ka' import pt_br from './pt-br' import tr from './tr' import vi from './vi' @@ -21,6 +22,7 @@ const localeTranslations = { es, fr, ja, + ka, 'pt-br': pt_br, tr, vi, diff --git a/src/i18n/i18n-util.ts b/src/i18n/i18n-util.ts index 4eed55b7..ca384042 100644 --- a/src/i18n/i18n-util.ts +++ b/src/i18n/i18n-util.ts @@ -16,6 +16,7 @@ export const locales: Locales[] = [ 'es', 'fr', 'ja', + 'ka', 'pt-br', 'tr', 'vi', diff --git a/src/i18n/ka/index.ts b/src/i18n/ka/index.ts new file mode 100644 index 00000000..f638f9ad --- /dev/null +++ b/src/i18n/ka/index.ts @@ -0,0 +1,163 @@ +import type { BaseTranslation } from '../i18n-types'; + +const ka = { + addConnection: 'კავშირის დამატება', + allowConnections: 'შეცვალეთ თქვენი სერვერის პარამეტრები, რომ დაუშვათ კავშირი მისამართიდან', + allowMixedContent: 'შერეული შემცველობის დაშვება', + apiKey: 'API-ის გასაღები', + areYouSureYouWantToDeleteAllKnowledge: 'მართლა გნებავთ, ცოდნა მთლიანად წაშალოთ?', + areYouSureYouWantToDeleteAllSessions: 'მართლა გნებავთ, ყველა სესია წაშალოთ?', + areYouSureYouWantToDeleteAllSettings: 'მართლა გნებავთ, ყველა პარამეტრი წაშალოთ?', + areYouSureYouWantToLeave: 'მართლა გნებავთ, გახვიდეთ?\nმიმდინარე პროცესი შეწყდება', + assistant: 'დამხმარე', + automatic: 'ავტო', + automaticallyCheckForUpdates: 'განახლებების ავტომატური შემოწმება', + availableModels: 'ხელმისაწვდომი მოდელები', + baseUrl: 'საბაზისო URL', + browseModels: 'ხელმისაწვდომი მოდელების სიის დათვალიერება', + cancel: 'გაუქმება', + cantConnectToOllamaServer: 'Ollama-ის სერვერთან მიერთება შეუძლებელია', + checkBrowserExtensions: + 'ასევე შეამოწმეთ ბრაუზერის გაფართოებები, რომლებსაც მიერთების დაბლოკვა შეუძლიათ', + checkingForUpdates: 'მიმდინარეობს განახლებების შემოწმება...', + checkNow: 'შემოწმება ახლავე', + clear: 'გასუფთავება', + confirmDeletion: 'წაშლის დადასტურება', + connectionType: 'მიერთების ტიპი', + connectionLabelHelp: 'კავშირის იდენტიფიკატორი მოდელების სიაში', + connecting: 'მიერთება...', + connectionIsVerified: 'კავშირი გადამოწმებულია და მზადაა გამოსაყენებლად', + connectionFailedToVerify: + 'კავშირის გადამოწმება ჩავარდა. შეამოწმეთ კავშირის პარამეტრები და თავიდან სცადეთ', + content: 'შემცველობა', + controls: 'მართვის ელემენტები', + controlsOnlyAvailableForOllama: + 'დამატებითი კონტროლის ელემენტები ამჟამად, მხოლოდ, Ollama-ის მოდელებისთვისაა ხელმისაწვდომი', + copy: 'კოპირება', + couldntCheckForUpdates: 'განახლებების ავტომატური შემოწმება შეუძლებელია', + couldntConnectToOllamaServer: 'Ollama-ის სერვერთან მიერთება შეუძლებელია', + creatingTunnel: 'გვირაბის შექმნა', + currentVersion: 'მიმდინარე ვერსია', + dangerZone: 'სახიფათო ზონა', + dark: 'მუქი', + deleteAllKnowledge: 'ყველა ცოდნის წაშლა', + deleteAllSessions: 'ყველა სესიის წაშლა', + deleteAllSettings: 'ყველა პარამეტრის წაშლა', + deleteKnowledge: 'ცოდნის წაშლა', + deleteServer: 'სერვერის წაშლა', + deleteSession: 'სესიის წაშლა', + disconnected: 'გათიშულია', + dismiss: 'მოცილება', + downloadModel: 'მოდელის გადმოწერა', + edit: 'ჩასწორება', + emptyKnowledge: 'ცოდნის გარეშე', + emptySessions: 'სესიების გარეშე', + error: 'შეცდომა', + f16Kv: 'F16 KV', + frequencyPenalty: 'სიხშირის ჯარიმა', + genericError: 'ვაი. რაღაც არასწორია', + goToDownloads: 'გადმოწერებზე გადასვლა', + goToKnowledge: 'ცოდნაზე გადასვლა', + goToReleases: 'რელიზებზე გადასვლა', + howToObtainOpenAIKey: 'როგორ მივიღო API-ის გასაღები OpenAI-სგან?', + howToUpdateDocker: 'როგორ განვაახლო Docker container?', + interface: 'ინტერფეისი', + internalServerError: 'აღმოჩენილია შიდა შეცდომა. მოგვიანებით სცადეთ', + isCurrentVersionLatest: 'გაქვთ ბოლო ვერსია', + isLatestVersion: 'ხელმისაწვდომია უფრო ახალი ვერსია', + knowledge: 'ცოდნა', + knowledgeSaved: 'ცოდნა შენახულია', + label: 'ჭდე', + language: 'ენა', + lastUsedModels: 'ახლახან გამოყენებული მოდელები', + light: 'ღია', + lowVram: 'მეტისმეტად ცოტა VRAM', + mainGpu: 'მთავარი GPU', + messageOfTheDay: 'დღის შეტყობინება', + messages: 'შეტყობინებები', + minP: 'მინ P', + mirostat: 'Mirostat', + mirostatEta: 'Mirostat ETA', + mirostatTau: 'Mirostat Tau', + modelNotFound: 'მოდელი ვერ ვიპოვე', + modelOptions: 'მოდელის მორგება', + modelWasDownloaded: '{model:string} გადმოწერილია', + modelsFilter: 'მოდელის სახელების ფილტრი', + modelsFilterHelp: 'დამალავს მოდელის სახელებს, რომლებიც ფილტრით არ იწყება', + motd: 'დღის შეტყობინება', + name: 'სახელი', + newKnowledge: 'ახალი ცოდნა', + newSession: 'ახალი სესია', + noApiKey: 'API-ის გასაღების გარეშე', + noKnowledgeChosen: 'შექმენით ახალი ცოდნა ან აირჩიეთ არსებული სიიდან', + noRecentModels: 'ახლახან გამოყენებული მოდელების გარეშე', + noServerConnections: 'სერვერთან მიერთების გარეშე. დასაწყებად ჯერ დაამატეთ', + noSessionChosen: 'შექმენით ახალი სესია ან აირჩიეთ არსებული სიიდან', + notFound: 'გვერდი, რომელსაც ეძებთ, არ არსებობს', + numBatch: 'რიცხვ. პაკეტი', + numCtx: 'კონტექსტის ზომა', + numGpu: 'რიცხვ GPU', + numKeep: 'შენარჩუნების რიცხვ', + numPredict: 'წინასწარ გამოცნ. რიცხვი', + numThread: 'ნაკადების რაოდენობა', + numa: 'NUMA', + ollama: 'Ollama', + ollamaLibrary: 'Ollama-ის ბიბლიოთეკა', + openAIOfficialAPI: 'OpenAI: ოფიციალური API', + openAICompatible: 'OpenAI: თავსებადი სერვერები (მაგ: llama.cpp)', + otherModels: 'სხვა მოდელები', + penalizeNewline: 'ახალი ხაზის სასჯელი', + presencePenalty: 'არსებობის სასჯელი', + prompt: 'მოთხოვნა', + promptPlaceholder: 'დაწერეთ რაც გნებავთ', + pullModel: 'მოდელის გადმოწერა', + pullModelPlaceholder: 'მოდელის ჭდე (მაგ: llama3.1)', + pullingModel: 'მიმდინარეობს მოდელის გადმოწერა', + random: 'შემთხვევითი', + reasoning: 'კამათი', + refreshToUpdate: 'განახლებისთვის ჩატვირთეთ თავიდან', + releaseHistory: 'რელიზების ისტორია', + repeatLastN: 'ბოლო N-ის გამეორება', + repeatPenalty: 'გამეორების სასჯელი', + retry: 'თავიდან ცდა', + run: 'გაშვება', + reVerify: 'თავიდან გადამოწმება', + runtimeOptions: 'გაშვებული პროცესის მორგება', + save: 'შენახვა', + search: 'ძებნა', + searchEmpty: 'შედეგების გარეშე', + seed: 'თესლი', + seeDocs: 'იხილეთ დოკუმენტაცია', + servers: 'სერვერები', + serverSettingsUpdated: + 'სერვერის პარამეტრები განახლდა და საწიროა თავიდან გადაამოწმოთ "პარამეტრებში"', + session: 'სესია', + sessions: 'სესიები', + settings: 'მორგება', + somethingWentWrong: 'უკაცრავად, რაღაც არასწორია', + stop: 'გაჩერების მიმდევრობა', + stopCompletion: 'დასრულების გაჩერება', + stopResponse: 'პასუხის გაჩერება', + success: 'წარმატება', + system: 'სისტემა', + systemPrompt: 'სისტემის მოთხოვნა', + temperature: 'ტემპერატურა', + tfsZ: 'TFS Z', + topK: 'Top K', + topP: 'Top P', + tryingToConnectNotLocalhost: + 'თუ გნებავთ, მიუერთდეთ Ollama-ის სერვერს, რომელიც ხელმისაწვდომი არაა (ჰოსტისსახელი:სტრიქონზე) ან (IP:სტრიქონზე), სცადეთ', + typicalP: 'ტიპიური P', + useMlock: 'MLOCK-ის გამოყენება', + useMmap: 'MMAP-ის გამოყენება', + useModelsFromThisServer: 'მოდელების გამოყენება ამ სერვერიდან', + verify: 'გადამოწმება', + version: 'ვერსია', + vocabOnly: 'მხოლოდ ვოკაბულა', + writePromptToStart: 'დაწერეთ მოთხოვნის ხაზზე ახალი სესიის დასაწყებად', + you: 'თქვენ', + copiedNotPrivate: 'შემცველობა დაკოპირდა, მაგრამ თქვენი მიერთება კონფიდენციალური არაა', + notCopiedNotPrivate: 'შემცველობის დაკოპირება შეუძლებელია, რადგან მიერთება კონფიდენციალური არაა' +} satisfies BaseTranslation; + +export default en; diff --git a/src/routes/settings/Interface.svelte b/src/routes/settings/Interface.svelte index 6cd1deef..ece2b5ac 100644 --- a/src/routes/settings/Interface.svelte +++ b/src/routes/settings/Interface.svelte @@ -36,6 +36,7 @@ { value: 'pt-br', label: 'Português (Brasil)' }, { value: 'ja', label: '日本語' }, { value: 'tr', label: 'Türkçe' }, + { value: 'ka', label: 'ქართული' }, { value: 'vi', label: 'Tiếng Việt' } ]} /> diff --git a/tests/locales.test.ts b/tests/locales.test.ts index dabad1a2..0a92fed0 100644 --- a/tests/locales.test.ts +++ b/tests/locales.test.ts @@ -128,4 +128,19 @@ test.describe('Locales', () => { ); }); }); + test.describe('Georgian', () => { + test.use({ locale: 'ka-GE' }); + test('default language is Georgian', async ({ page }) => { + await page.goto('/settings'); + expect(await page.evaluate(() => navigator.language)).toBe('ka-GE'); + + await page.evaluate(() => window.localStorage.clear()); + await page.reload(); + await expect(page.getByText('Servers')).not.toBeVisible(); + await expect(page.getByText('სერვერები')).toBeVisible(); + expect(await page.evaluate(() => window.localStorage.getItem('hollama-settings'))).toContain( + '"userLanguage":"ka"' + ); + }); + }); });