feat: Add Ukrainian translation

This commit is contained in:
jeffyololo
2026-04-27 10:19:01 +02:00
parent 499097fa3c
commit d096de1730
9 changed files with 2432 additions and 6 deletions
+2 -1
View File
@@ -14,9 +14,10 @@ import ru from '../i18n/translations/ru'
import zh from '../i18n/translations/zh'
import zhTw from '../i18n/translations/zhTw'
import ar from '../i18n/translations/ar'
import ua from '../i18n/translations/ua'
const rateLimitTranslations: Record<string, Record<string, string | unknown>> = {
en, br, de, es, fr, it, nl, pl, cs, hu, ru, zh, 'zh-TW': zhTw, ar,
en, br, de, es, fr, it, nl, pl, cs, hu, ru, zh, 'zh-TW': zhTw, ar, ua,
}
function translateRateLimit(): string {
@@ -246,6 +246,38 @@ const texts: Record<string, DemoTexts> = {
selfHostLink: 'host mandiri',
close: 'Mengerti',
},
ua: {
titleBefore: 'Ласкаво просимо до ',
titleAfter: '',
title: 'Ласкаво просимо до демо-версії TREK',
description: 'Ви можете переглядати, редагувати та створювати поїздки. Всі зміни автоматично скидаються кожну годину.',
resetIn: 'Наступне скидання через',
minutes: 'хвилин(и)',
uploadNote: 'Завантаження файлів (фото, документи, обкладинки) відключено в демонстраційному режимі.',
fullVersionTitle: 'Додатково в повній версії:',
features: [
'Завантаження файлів (фото, документи, обкладинки)',
'Керування API ключами (Google Maps, погода)',
'Керування користувачами та правами доступу',
'Автоматичні резервні копії',
'Керування аддонами (включити/виключити)',
'OIDC / SSO single sign-on',
],
addonsTitle: 'Модульні Аддони (можна виключити в повній версії)',
addons: [
['Vacay', 'Планувальник відпусток з календарем, святами та підтримкою кількох користувачів'],
['Atlas', 'Карта світу з відвіданими країнами та статистикою подорожей'],
['Packing', 'Списки для кожної поїздки'],
['Budget', 'Відстеження витрат для кожної особи'],
['Documents', 'Прикріплення файлів до поїздок'],
['Widgets', 'Конвертер валют та часові пояси'],
],
whatIs: 'Що таке TREK?',
whatIsDesc: 'Планувальник подорожей з підтримкою реального часу, інтерактивними картами, входом через OIDC та темною темою.',
selfHost: 'Відкритий код — ',
selfHostLink: 'за\'self-host\'ь це',
close: 'Зрозуміло',
},
}
const featureIcons = [Upload, Key, Users, Database, Puzzle, Shield]
+3 -2
View File
@@ -15,6 +15,7 @@ import ar from './translations/ar'
import br from './translations/br'
import cs from './translations/cs'
import pl from './translations/pl'
import ua from './translations/ua'
import { SUPPORTED_LANGUAGES, SupportedLanguageCode } from './supportedLanguages'
export { SUPPORTED_LANGUAGES }
@@ -23,7 +24,7 @@ type TranslationStrings = Record<string, string | { name: string; category: stri
// Keyed by SupportedLanguageCode so TypeScript enforces all languages have a translation.
const translations: Record<SupportedLanguageCode, TranslationStrings> = {
de, en, es, fr, hu, it, ru, zh, 'zh-TW': zhTw, nl, id, ar, br, cs, pl,
de, en, es, fr, hu, it, ru, zh, 'zh-TW': zhTw, nl, id, ar, br, cs, pl, ua,
}
// Derived from SUPPORTED_LANGUAGES — add new languages there, not here.
@@ -38,7 +39,7 @@ export function getLocaleForLanguage(language: string): string {
export function getIntlLanguage(language: string): string {
if (language === 'br') return 'pt-BR'
return ['de', 'es', 'fr', 'hu', 'it', 'ru', 'zh', 'zh-TW', 'nl', 'ar', 'cs', 'pl', 'id'].includes(language) ? language : 'en'
return ['de', 'es', 'fr', 'hu', 'it', 'ru', 'zh', 'zh-TW', 'nl', 'ar', 'cs', 'pl', 'id', 'ua'].includes(language) ? language : 'en'
}
export function isRtlLanguage(language: string): boolean {
+1
View File
@@ -14,6 +14,7 @@ export const SUPPORTED_LANGUAGES = [
{ value: 'it', label: 'Italiano', locale: 'it-IT' },
{ value: 'ar', label: 'العربية', locale: 'ar-SA' },
{ value: 'id', label: 'Bahasa Indonesia', locale: 'id-ID' },
{ value: 'ua', label: 'Українська', locale: 'uk-UA' },
] as const
export type SupportedLanguageCode = typeof SUPPORTED_LANGUAGES[number]['value']
File diff suppressed because it is too large Load Diff