Skip to content
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
12 changes: 9 additions & 3 deletions packages/app/src/context/language.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import { dict as es } from "@/i18n/es"
import { dict as fr } from "@/i18n/fr"
import { dict as da } from "@/i18n/da"
import { dict as ja } from "@/i18n/ja"
import { dict as pl } from "@/i18n/pl"
import { dict as ru } from "@/i18n/ru"
import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
import { dict as uiZh } from "@opencode-ai/ui/i18n/zh"
import { dict as uiKo } from "@opencode-ai/ui/i18n/ko"
Expand All @@ -19,15 +21,15 @@ import { dict as uiEs } from "@opencode-ai/ui/i18n/es"
import { dict as uiFr } from "@opencode-ai/ui/i18n/fr"
import { dict as uiDa } from "@opencode-ai/ui/i18n/da"
import { dict as uiJa } from "@opencode-ai/ui/i18n/ja"
import { dict as pl } from "@/i18n/pl"
import { dict as uiPl } from "@opencode-ai/ui/i18n/pl"
import { dict as uiRu } from "@opencode-ai/ui/i18n/ru"

export type Locale = "en" | "zh" | "ko" | "de" | "es" | "fr" | "da" | "ja" | "pl"
export type Locale = "en" | "zh" | "ko" | "de" | "es" | "fr" | "da" | "ja" | "pl" | "ru"

type RawDictionary = typeof en & typeof uiEn
type Dictionary = i18n.Flatten<RawDictionary>

const LOCALES: readonly Locale[] = ["en", "zh", "ko", "de", "es", "fr", "da", "ja", "pl"]
const LOCALES: readonly Locale[] = ["en", "zh", "ko", "de", "es", "fr", "da", "ja", "pl", "ru"]

function detectLocale(): Locale {
if (typeof navigator !== "object") return "en"
Expand All @@ -43,6 +45,7 @@ function detectLocale(): Locale {
if (language.toLowerCase().startsWith("da")) return "da"
if (language.toLowerCase().startsWith("ja")) return "ja"
if (language.toLowerCase().startsWith("pl")) return "pl"
if (language.toLowerCase().startsWith("ru")) return "ru"
}

return "en"
Expand All @@ -67,6 +70,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
if (store.locale === "da") return "da"
if (store.locale === "ja") return "ja"
if (store.locale === "pl") return "pl"
if (store.locale === "ru") return "ru"
return "en"
})

Expand All @@ -86,6 +90,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
if (locale() === "da") return { ...base, ...i18n.flatten({ ...da, ...uiDa }) }
if (locale() === "ja") return { ...base, ...i18n.flatten({ ...ja, ...uiJa }) }
if (locale() === "pl") return { ...base, ...i18n.flatten({ ...pl, ...uiPl }) }
if (locale() === "ru") return { ...base, ...i18n.flatten({ ...ru, ...uiRu }) }
return { ...base, ...i18n.flatten({ ...ko, ...uiKo }) }
})

Expand All @@ -101,6 +106,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
da: "language.da",
ja: "language.ja",
pl: "language.pl",
ru: "language.ru",
}

const label = (value: Locale) => t(labelKey[value])
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/i18n/da.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ export const dict = {
"language.fr": "Fransk",
"language.ja": "Japansk",
"language.da": "Dansk",
"language.ru": "Russisk",
"language.pl": "Polsk",

"toast.language.title": "Sprog",
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@ export const dict = {
"language.fr": "Französisch",
"language.ja": "Japanisch",
"language.da": "Dänisch",
"language.ru": "Russisch",
"language.pl": "Polnisch",

"toast.language.title": "Sprache",
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,7 @@ export const dict = {
"language.fr": "French",
"language.ja": "Japanese",
"language.da": "Danish",
"language.ru": "Russian",
"language.pl": "Polish",

"toast.language.title": "Language",
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/i18n/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ export const dict = {
"language.fr": "Francés",
"language.ja": "Japonés",
"language.da": "Danés",
"language.ru": "Ruso",
"language.pl": "Polaco",

"toast.language.title": "Idioma",
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ export const dict = {
"language.fr": "Français",
"language.ja": "Japonais",
"language.da": "Danois",
"language.ru": "Russe",
"language.pl": "Polonais",

"toast.language.title": "Langue",
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/i18n/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@ export const dict = {
"language.fr": "フランス語",
"language.ja": "日本語",
"language.da": "デンマーク語",
"language.ru": "ロシア語",
"language.pl": "ポーランド語",

"toast.language.title": "言語",
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/i18n/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ export const dict = {
"language.fr": "프랑스어",
"language.ja": "일본어",
"language.da": "덴마크어",
"language.ru": "러시아어",
"language.pl": "폴란드어",

"toast.language.title": "언어",
Expand Down
642 changes: 642 additions & 0 deletions packages/app/src/i18n/ru.ts

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions packages/app/src/i18n/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@ export const dict = {
"language.fr": "法语",
"language.ja": "日语",
"language.da": "丹麦语",
"language.ru": "俄语",
"language.pl": "波兰语",

"toast.language.title": "语言",
Expand Down
90 changes: 90 additions & 0 deletions packages/ui/src/i18n/ru.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
export const dict = {
"ui.sessionReview.title": "Изменения сессии",
"ui.sessionReview.diffStyle.unified": "Объединённый",
"ui.sessionReview.diffStyle.split": "Разделённый",
"ui.sessionReview.expandAll": "Развернуть всё",
"ui.sessionReview.collapseAll": "Свернуть всё",

"ui.sessionTurn.steps.show": "Показать шаги",
"ui.sessionTurn.steps.hide": "Скрыть шаги",
"ui.sessionTurn.summary.response": "Ответ",
"ui.sessionTurn.diff.showMore": "Показать ещё изменений ({{count}})",

"ui.sessionTurn.retry.retrying": "повтор",
"ui.sessionTurn.retry.inSeconds": "через {{seconds}}с",

"ui.sessionTurn.status.delegating": "Делегирование работы",
"ui.sessionTurn.status.planning": "Планирование следующих шагов",
"ui.sessionTurn.status.gatheringContext": "Сбор контекста",
"ui.sessionTurn.status.searchingCodebase": "Поиск в кодовой базе",
"ui.sessionTurn.status.searchingWeb": "Поиск в интернете",
"ui.sessionTurn.status.makingEdits": "Внесение изменений",
"ui.sessionTurn.status.runningCommands": "Выполнение команд",
"ui.sessionTurn.status.thinking": "Размышление",
"ui.sessionTurn.status.thinkingWithTopic": "Размышление - {{topic}}",
"ui.sessionTurn.status.gatheringThoughts": "Сбор мыслей",
"ui.sessionTurn.status.consideringNextSteps": "Рассмотрение следующих шагов",

"ui.messagePart.diagnostic.error": "Ошибка",
"ui.messagePart.title.edit": "Редактировать",
"ui.messagePart.title.write": "Написать",
"ui.messagePart.option.typeOwnAnswer": "Введите свой ответ",
"ui.messagePart.review.title": "Проверьте ваши ответы",

"ui.list.loading": "Загрузка",
"ui.list.empty": "Нет результатов",
"ui.list.emptyWithFilter.prefix": "Нет результатов для",
"ui.list.emptyWithFilter.suffix": "",

"ui.messageNav.newMessage": "Новое сообщение",

"ui.textField.copyToClipboard": "Копировать в буфер обмена",
"ui.textField.copied": "Скопировано",

"ui.imagePreview.alt": "Предпросмотр изображения",

"ui.tool.read": "Чтение",
"ui.tool.list": "Список",
"ui.tool.glob": "Glob",
"ui.tool.grep": "Grep",
"ui.tool.webfetch": "Webfetch",
"ui.tool.shell": "Оболочка",
"ui.tool.patch": "Патч",
"ui.tool.todos": "Задачи",
"ui.tool.todos.read": "Читать задачи",
"ui.tool.questions": "Вопросы",
"ui.tool.agent": "Агент {{type}}",

"ui.common.file.one": "файл",
"ui.common.file.other": "файлов",
"ui.common.question.one": "вопрос",
"ui.common.question.other": "вопросов",

"ui.common.add": "Добавить",
"ui.common.cancel": "Отмена",
"ui.common.confirm": "Подтвердить",
"ui.common.dismiss": "Закрыть",
"ui.common.next": "Далее",
"ui.common.submit": "Отправить",

"ui.permission.deny": "Запретить",
"ui.permission.allowAlways": "Разрешить всегда",
"ui.permission.allowOnce": "Разрешить один раз",

"ui.message.expand": "Развернуть сообщение",
"ui.message.collapse": "Свернуть сообщение",
"ui.message.copy": "Копировать",
"ui.message.copied": "Скопировано!",
"ui.message.attachment.alt": "вложение",

"ui.patch.action.deleted": "Удалено",
"ui.patch.action.created": "Создано",
"ui.patch.action.moved": "Перемещено",
"ui.patch.action.patched": "Изменено",

"ui.question.subtitle.answered": "{{count}} отвечено",
"ui.question.answer.none": "(нет ответа)",
"ui.question.review.notAnswered": "(не отвечено)",
"ui.question.multiHint": "(выберите все подходящие)",
"ui.question.custom.placeholder": "Введите ваш ответ...",
}