Compare commits

...

1 Commits

Author SHA1 Message Date
Luke Parker f9b17d851c feat(app): add global locale coverage 2026-08-07 04:33:06 +00:00
143 changed files with 47929 additions and 334 deletions
+4
View File
@@ -28,6 +28,10 @@
- Prefer complete translated phrases. Do not concatenate grammatical fragments or make call sites assemble sentences. Keep placeholders to irreducible dynamic values such as names, paths, and counts.
- If a translation cannot be expressed by the current API, deepen the shared language/UI i18n module so one typed call owns locale selection, plural resolution, fallback, and interpolation. Do not leak that machinery into product code.
- Do not translate from model knowledge alone. Verify terminology and grammar with Unicode CLDR locale/plural data, Microsoft Localization Style Guides and terminology, Apple localization/style guidance and localized platform UI, Mozilla localization style guides, Mozilla Pontoon, and the Firefox localization corpus at `github.com/mozilla-l10n/firefox-l10n`.
- For developer-facing terminology, prefer the words already used by the target language's developer community over literal dictionary translations. Cross-check maintained localized developer products such as Firefox, KDE, and VS Code; use at least two independent corpora when they are available. If established practice keeps an English loanword or acronym, keep it rather than inventing a translation.
- Translate complete UI phrases in context. A glossary hit is evidence, not permission to translate word-by-word. Check terse labels such as session, prompt, agent, model, fork, shell, terminal, workspace, and worktree in the same grammatical role before choosing a term.
- Before a locale is ready, audit recurring concepts for one consistent translation and review every value that still equals English. Classify retained English as a product name, provider/tool name, URL, code token, keyboard legend, acronym, asset name, or established borrowing; translate unexplained leftovers.
- In translation review notes, name the corpora used and call out uncertain or region-specific terminology so native speakers can focus review where it matters.
- Also use the relevant language authority or official dictionary for the locale (for example RAE/Fundéu, FranceTerme, Duden, TDK, Kotus/Kielitoimiston sanakirja, Språkrådet/Bokmålsordboka, Rada Języka Polskiego/PWN, the Russian and Arabic language academies, the Ukrainian Orthography, Taiwan MOE dictionaries, or the Royal Society of Thailand). Treat the English dictionary as the semantic source of truth and preserve placeholders, code identifiers, product names, and keyboard labels.
## Tool Calling
+51 -88
View File
@@ -8,9 +8,11 @@ import { dict as en } from "@/i18n/en"
import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
import {
createDesktopNativeBundle,
detectDesktopNativeLocale,
DESKTOP_NATIVE_ENGLISH,
DESKTOP_NATIVE_LABELS,
DESKTOP_NATIVE_LOCALES,
DESKTOP_NATIVE_LOCALE_TAGS,
type DesktopNativeBundle,
type DesktopNativeLocale,
} from "@/i18n/desktop-native"
@@ -18,7 +20,7 @@ import {
export type Locale = DesktopNativeLocale
export type Direction = "ltr" | "rtl"
const RTL_LOCALES: ReadonlySet<Locale> = new Set(["ar", "ur", "pa"])
const RTL_LOCALES: ReadonlySet<Locale> = new Set(["ar", "ur", "pa", "fa", "dv"])
function localeDirection(locale: Locale): Direction {
return RTL_LOCALES.has(locale) ? "rtl" : "ltr"
@@ -39,36 +41,7 @@ function cookie(locale: Locale) {
const LOCALES: readonly Locale[] = DESKTOP_NATIVE_LOCALES
const INTL: Record<Locale, string> = {
en: "en",
zh: "zh-Hans",
zht: "zh-Hant",
ko: "ko",
de: "de",
es: "es",
fr: "fr",
da: "da",
ja: "ja",
pl: "pl",
ru: "ru",
uk: "uk",
ar: "ar",
no: "nb-NO",
br: "pt-BR",
th: "th",
bs: "bs",
tr: "tr",
hi: "hi-IN",
nl: "nl-NL",
id: "id-ID",
vi: "vi-VN",
it: "it-IT",
ur: "ur-PK",
pa: "pa-Arab-PK",
az: "az-Latn-AZ",
fi: "fi-FI",
sv: "sv-SE",
}
const INTL = DESKTOP_NATIVE_LOCALE_TAGS
const base = i18n.flatten({ ...en, ...uiEn })
const dicts = new Map<Locale, Dictionary>([["en", base]])
@@ -104,6 +77,40 @@ const loaders: Record<Exclude<Locale, "en">, () => Promise<Dictionary>> = {
az: () => merge(import("@/i18n/az"), import("@opencode-ai/ui/i18n/az")),
fi: () => merge(import("@/i18n/fi"), import("@opencode-ai/ui/i18n/fi")),
sv: () => merge(import("@/i18n/sv"), import("@opencode-ai/ui/i18n/sv")),
am: () => merge(import("@/i18n/am"), import("@opencode-ai/ui/i18n/am")),
bg: () => merge(import("@/i18n/bg"), import("@opencode-ai/ui/i18n/bg")),
bn: () => merge(import("@/i18n/bn"), import("@opencode-ai/ui/i18n/bn")),
ca: () => merge(import("@/i18n/ca"), import("@opencode-ai/ui/i18n/ca")),
cs: () => merge(import("@/i18n/cs"), import("@opencode-ai/ui/i18n/cs")),
dv: () => merge(import("@/i18n/dv"), import("@opencode-ai/ui/i18n/dv")),
dz: () => merge(import("@/i18n/dz"), import("@opencode-ai/ui/i18n/dz")),
el: () => merge(import("@/i18n/el"), import("@opencode-ai/ui/i18n/el")),
et: () => merge(import("@/i18n/et"), import("@opencode-ai/ui/i18n/et")),
fa: () => merge(import("@/i18n/fa"), import("@opencode-ai/ui/i18n/fa")),
fo: () => merge(import("@/i18n/fo"), import("@opencode-ai/ui/i18n/fo")),
hr: () => merge(import("@/i18n/hr"), import("@opencode-ai/ui/i18n/hr")),
hu: () => merge(import("@/i18n/hu"), import("@opencode-ai/ui/i18n/hu")),
hy: () => merge(import("@/i18n/hy"), import("@opencode-ai/ui/i18n/hy")),
is: () => merge(import("@/i18n/is"), import("@opencode-ai/ui/i18n/is")),
ka: () => merge(import("@/i18n/ka"), import("@opencode-ai/ui/i18n/ka")),
km: () => merge(import("@/i18n/km"), import("@opencode-ai/ui/i18n/km")),
lo: () => merge(import("@/i18n/lo"), import("@opencode-ai/ui/i18n/lo")),
lt: () => merge(import("@/i18n/lt"), import("@opencode-ai/ui/i18n/lt")),
lv: () => merge(import("@/i18n/lv"), import("@opencode-ai/ui/i18n/lv")),
mk: () => merge(import("@/i18n/mk"), import("@opencode-ai/ui/i18n/mk")),
mn: () => merge(import("@/i18n/mn"), import("@opencode-ai/ui/i18n/mn")),
ms: () => merge(import("@/i18n/ms"), import("@opencode-ai/ui/i18n/ms")),
my: () => merge(import("@/i18n/my"), import("@opencode-ai/ui/i18n/my")),
ne: () => merge(import("@/i18n/ne"), import("@opencode-ai/ui/i18n/ne")),
ro: () => merge(import("@/i18n/ro"), import("@opencode-ai/ui/i18n/ro")),
si: () => merge(import("@/i18n/si"), import("@opencode-ai/ui/i18n/si")),
sk: () => merge(import("@/i18n/sk"), import("@opencode-ai/ui/i18n/sk")),
sl: () => merge(import("@/i18n/sl"), import("@opencode-ai/ui/i18n/sl")),
sq: () => merge(import("@/i18n/sq"), import("@opencode-ai/ui/i18n/sq")),
sr: () => merge(import("@/i18n/sr"), import("@opencode-ai/ui/i18n/sr")),
tg: () => merge(import("@/i18n/tg"), import("@opencode-ai/ui/i18n/tg")),
tk: () => merge(import("@/i18n/tk"), import("@opencode-ai/ui/i18n/tk")),
uz: () => merge(import("@/i18n/uz"), import("@opencode-ai/ui/i18n/uz")),
}
function loadDict(locale: Locale) {
@@ -121,63 +128,9 @@ export function loadLocaleDict(locale: Locale) {
return loadDict(locale).then(() => undefined)
}
const localeMatchers: Array<{ locale: Locale; match: (language: string) => boolean }> = [
{ locale: "en", match: (language) => language.startsWith("en") },
{
locale: "zht",
match: (language) =>
language.startsWith("zh") &&
(language.includes("hant") || language.includes("-tw") || language.includes("-hk") || language.includes("-mo")),
},
{ locale: "zh", match: (language) => language.startsWith("zh") },
{ locale: "ko", match: (language) => language.startsWith("ko") },
{ locale: "de", match: (language) => language.startsWith("de") },
{ locale: "es", match: (language) => language.startsWith("es") },
{ locale: "fr", match: (language) => language.startsWith("fr") },
{ locale: "da", match: (language) => language.startsWith("da") },
{ locale: "ja", match: (language) => language.startsWith("ja") },
{ locale: "pl", match: (language) => language.startsWith("pl") },
{ locale: "ru", match: (language) => language.startsWith("ru") },
{ locale: "uk", match: (language) => language.startsWith("uk") },
{ locale: "ar", match: (language) => language.startsWith("ar") },
{
locale: "no",
match: (language) => language.startsWith("no") || language.startsWith("nb") || language.startsWith("nn"),
},
{ locale: "br", match: (language) => language.startsWith("pt") },
{ locale: "th", match: (language) => language.startsWith("th") },
{ locale: "bs", match: (language) => language.startsWith("bs") },
{ locale: "tr", match: (language) => language.startsWith("tr") },
{ locale: "hi", match: (language) => language.startsWith("hi") },
{ locale: "nl", match: (language) => language.startsWith("nl") },
{ locale: "id", match: (language) => language.startsWith("id") },
{ locale: "vi", match: (language) => language.startsWith("vi") },
{ locale: "it", match: (language) => language.startsWith("it") },
{ locale: "ur", match: (language) => language.startsWith("ur") },
{
locale: "pa",
match: (language) => language.startsWith("pa") && (language.includes("arab") || language.includes("-pk")),
},
{
locale: "az",
match: (language) => language.startsWith("az") && !language.includes("arab") && !language.includes("cyrl"),
},
{ locale: "fi", match: (language) => language.startsWith("fi") },
{ locale: "sv", match: (language) => language.startsWith("sv") },
]
function detectLocale(): Locale {
if (typeof navigator !== "object") return "en"
const languages = navigator.languages?.length ? navigator.languages : [navigator.language]
for (const language of languages) {
if (!language) continue
const normalized = language.toLowerCase()
const match = localeMatchers.find((entry) => entry.match(normalized))
if (match) return match.locale
}
return "en"
return detectDesktopNativeLocale(navigator.languages?.length ? navigator.languages : [navigator.language])
}
export function normalizeLocale(value: string): Locale {
@@ -198,7 +151,17 @@ function readStoredLocale() {
}
const warm = readStoredLocale() ?? detectLocale()
if (warm !== "en") void loadDict(warm)
const initialLocale =
warm === "en"
? Promise.resolve(warm)
: loadDict(warm).then(
() => warm,
() => "en" as const,
)
export function loadInitialLocale() {
return initialLocale
}
export const { use: useLanguage, provider: LanguageProvider } = createSimpleContext({
name: "Language",
@@ -244,7 +207,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
createEffect(() => {
if (typeof document !== "object") return
const value = locale()
document.documentElement.lang = value
document.documentElement.lang = intl()
document.documentElement.dir = direction()
document.cookie = cookie(value)
})
+28 -25
View File
@@ -3,6 +3,7 @@
import * as Sentry from "@sentry/solid"
import { render } from "solid-js/web"
import { AppBaseProviders, AppInterface } from "@/app"
import { loadInitialLocale } from "@/context/language"
import { type Platform, PlatformProvider } from "@/context/platform"
import { createBrowserDraftStore } from "@/utils/draft-store"
import { dict as en } from "@/i18n/en"
@@ -149,29 +150,31 @@ if (import.meta.env.VITE_SENTRY_DSN) {
}
if (root instanceof HTMLElement) {
const auth = authFromToken(new URLSearchParams(location.search).get("auth_token"))
clearAuthToken()
const server: ServerConnection.Http = {
type: "http",
authToken: !!auth,
http: {
url: getCurrentUrl(),
...auth,
},
}
render(
() => (
<PlatformProvider value={platform}>
<AppBaseProviders>
<AppInterface
defaultServer={ServerConnection.Key.make(getDefaultUrl())}
canonicalLocalServer={ServerConnection.key(server)}
servers={[server]}
disableHealthCheck
/>
</AppBaseProviders>
</PlatformProvider>
),
root,
)
void loadInitialLocale().then((locale) => {
const auth = authFromToken(new URLSearchParams(location.search).get("auth_token"))
clearAuthToken()
const server: ServerConnection.Http = {
type: "http",
authToken: !!auth,
http: {
url: getCurrentUrl(),
...auth,
},
}
render(
() => (
<PlatformProvider value={platform}>
<AppBaseProviders locale={locale}>
<AppInterface
defaultServer={ServerConnection.Key.make(getDefaultUrl())}
canonicalLocalServer={ServerConnection.key(server)}
servers={[server]}
disableHealthCheck
/>
</AppBaseProviders>
</PlatformProvider>
),
root,
)
})
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -5,6 +5,8 @@ import {
DESKTOP_NATIVE_KEYS,
DESKTOP_NATIVE_LABELS,
DESKTOP_NATIVE_LOCALES,
DESKTOP_NATIVE_LOCALE_TAGS,
detectDesktopNativeLocale,
DESKTOP_NATIVE_MAX_PAYLOAD_BYTES,
formatDesktopNativeMessage,
parseDesktopNativeBundle,
@@ -41,6 +43,40 @@ describe("desktop native translations", () => {
"Azərbaycanca",
"Suomi",
"Svenska",
"አማርኛ",
"Български",
"বাংলা",
"Català",
"Čeština",
"ދިވެހި",
"རྫོང་ཁ",
"Ελληνικά",
"Eesti",
"فارسی",
"Føroyskt",
"Hrvatski",
"Magyar",
"Հայերեն",
"Íslenska",
"ქართული",
"ខ្មែរ",
"ລາວ",
"Lietuvių",
"Latviešu",
"Македонски",
"Монгол",
"Bahasa Melayu",
"မြန်မာ",
"नेपाली",
"Română",
"සිංහල",
"Slovenčina",
"Slovenščina",
"Shqip",
"Српски",
"Тоҷикӣ",
"Türkmençe",
"Oʻzbekcha",
])
})
@@ -74,3 +110,42 @@ describe("desktop native translations", () => {
expect(formatDesktopNativeMessage("{{known}} {{unknown}}", { known: "yes" })).toBe("yes {{unknown}}")
})
})
describe("desktop native locale detection", () => {
test("follows preference order and skips invalid or unsupported tags", () => {
expect(detectDesktopNativeLocale(["not_a_locale", "fr-FR"])).toBe("fr")
expect(detectDesktopNativeLocale(["eo", "de-DE"])).toBe("de")
})
test("uses Unicode likely subtags for script-sensitive bundles", () => {
expect(detectDesktopNativeLocale(["zh-TW"])).toBe("zht")
expect(detectDesktopNativeLocale(["zh-SG"])).toBe("zh")
expect(detectDesktopNativeLocale(["pa-PK"])).toBe("pa")
expect(detectDesktopNativeLocale(["pa-IN", "fr"])).toBe("fr")
expect(detectDesktopNativeLocale(["az-Cyrl", "de"])).toBe("de")
expect(detectDesktopNativeLocale(["sr-Cyrl"])).toBe("sr")
expect(detectDesktopNativeLocale(["sr-Latn", "en"])).toBe("en")
expect(detectDesktopNativeLocale(["uz-Latn"])).toBe("uz")
})
test("recognizes Norwegian language tags", () => {
expect(detectDesktopNativeLocale(["no"])).toBe("no")
expect(detectDesktopNativeLocale(["nb-NO"])).toBe("no")
expect(detectDesktopNativeLocale(["nn-NO"])).toBe("no")
})
})
describe("desktop native ICU data", () => {
test("accepts every locale in standard Intl formatters", () => {
for (const locale of DESKTOP_NATIVE_LOCALES) {
const tag = DESKTOP_NATIVE_LOCALE_TAGS[locale]
expect(() => new Intl.Locale(tag), `${locale} locale`).not.toThrow()
expect(() => new Intl.NumberFormat(tag), `${locale} number`).not.toThrow()
expect(() => new Intl.DateTimeFormat(tag), `${locale} date`).not.toThrow()
expect(() => new Intl.PluralRules(tag), `${locale} plural`).not.toThrow()
expect(() => new Intl.ListFormat(tag), `${locale} list`).not.toThrow()
expect(() => new Intl.DisplayNames(tag, { type: "language" }), `${locale} names`).not.toThrow()
expect(() => new Intl.Segmenter(tag), `${locale} segmenter`).not.toThrow()
}
})
})
+159
View File
@@ -27,6 +27,40 @@ export const DESKTOP_NATIVE_LOCALES = [
"az",
"fi",
"sv",
"am",
"bg",
"bn",
"ca",
"cs",
"dv",
"dz",
"el",
"et",
"fa",
"fo",
"hr",
"hu",
"hy",
"is",
"ka",
"km",
"lo",
"lt",
"lv",
"mk",
"mn",
"ms",
"my",
"ne",
"ro",
"si",
"sk",
"sl",
"sq",
"sr",
"tg",
"tk",
"uz",
] as const
export type DesktopNativeLocale = (typeof DESKTOP_NATIVE_LOCALES)[number]
@@ -60,6 +94,131 @@ export const DESKTOP_NATIVE_LABELS: Record<DesktopNativeLocale, string> = {
az: "Azərbaycanca",
fi: "Suomi",
sv: "Svenska",
am: "አማርኛ",
bg: "Български",
bn: "বাংলা",
ca: "Català",
cs: "Čeština",
dv: "ދިވެހި",
dz: "རྫོང་ཁ",
el: "Ελληνικά",
et: "Eesti",
fa: "فارسی",
fo: "Føroyskt",
hr: "Hrvatski",
hu: "Magyar",
hy: "Հայերեն",
is: "Íslenska",
ka: "ქართული",
km: "ខ្មែរ",
lo: "ລາວ",
lt: "Lietuvių",
lv: "Latviešu",
mk: "Македонски",
mn: "Монгол",
ms: "Bahasa Melayu",
my: "မြန်မာ",
ne: "नेपाली",
ro: "Română",
si: "සිංහල",
sk: "Slovenčina",
sl: "Slovenščina",
sq: "Shqip",
sr: "Српски",
tg: "Тоҷикӣ",
tk: "Türkmençe",
uz: "Oʻzbekcha",
}
export const DESKTOP_NATIVE_LOCALE_TAGS: Record<DesktopNativeLocale, string> = {
en: "en",
zh: "zh-Hans",
zht: "zh-Hant",
ko: "ko",
de: "de",
es: "es",
fr: "fr",
da: "da",
ja: "ja",
pl: "pl",
ru: "ru",
uk: "uk",
bs: "bs",
ar: "ar",
no: "nb-NO",
br: "pt-BR",
th: "th",
tr: "tr",
hi: "hi-IN",
nl: "nl-NL",
id: "id-ID",
vi: "vi-VN",
it: "it-IT",
ur: "ur-PK",
pa: "pa-Arab-PK",
az: "az-Latn-AZ",
fi: "fi-FI",
sv: "sv-SE",
am: "am-ET",
bg: "bg-BG",
bn: "bn-BD",
ca: "ca-AD",
cs: "cs-CZ",
dv: "dv-MV",
dz: "dz-BT",
el: "el-GR",
et: "et-EE",
fa: "fa-IR",
fo: "fo-FO",
hr: "hr-HR",
hu: "hu-HU",
hy: "hy-AM",
is: "is-IS",
ka: "ka-GE",
km: "km-KH",
lo: "lo-LA",
lt: "lt-LT",
lv: "lv-LV",
mk: "mk-MK",
mn: "mn-MN",
ms: "ms-MY",
my: "my-MM",
ne: "ne-NP",
ro: "ro-RO",
si: "si-LK",
sk: "sk-SK",
sl: "sl-SI",
sq: "sq-AL",
sr: "sr-Cyrl-RS",
tg: "tg-Cyrl-TJ",
tk: "tk-Latn-TM",
uz: "uz-Latn-UZ",
}
export function detectDesktopNativeLocale(languages: readonly string[]): DesktopNativeLocale {
for (const language of languages) {
const source = locale(language)
if (!source) continue
if (["no", "nb", "nn"].includes(source.language)) return "no"
const match = DESKTOP_NATIVE_LOCALES.find((candidate) => {
const target = locale(DESKTOP_NATIVE_LOCALE_TAGS[candidate])
return target?.language === source.language && target.script === source.script
})
if (match) return match
}
return "en"
}
export function desktopNativePluralCategories(locale: DesktopNativeLocale) {
return new Intl.PluralRules(DESKTOP_NATIVE_LOCALE_TAGS[locale]).resolvedOptions().pluralCategories
}
function locale(value: string) {
try {
return new Intl.Locale(value).maximize()
} catch {
return undefined
}
}
export const DESKTOP_NATIVE_ENGLISH = {
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+48 -15
View File
@@ -1,4 +1,5 @@
import { describe, expect, test } from "bun:test"
import { desktopNativePluralCategories } from "./desktop-native"
const appLocales = [
"ar",
@@ -28,19 +29,51 @@ const appLocales = [
"az",
"fi",
"sv",
"am",
"bg",
"bn",
"ca",
"cs",
"dv",
"dz",
"el",
"et",
"fa",
"fo",
"hr",
"hu",
"hy",
"is",
"ka",
"km",
"lo",
"lt",
"lv",
"mk",
"mn",
"ms",
"my",
"ne",
"ro",
"si",
"sk",
"sl",
"sq",
"sr",
"tg",
"tk",
"uz",
] as const
const desktopLocales = appLocales
const pluralCategories: Partial<Record<(typeof appLocales)[number], readonly string[]>> = {
ar: ["zero", "two", "few", "many"],
br: ["many"],
bs: ["few"],
es: ["many"],
fr: ["many"],
it: ["many"],
pl: ["few", "many"],
ru: ["few", "many"],
uk: ["few", "many"],
}
const pluralCategories = new Map(
appLocales.map(
(locale) =>
[
locale,
desktopNativePluralCategories(locale).filter((category) => category !== "one" && category !== "other"),
] as const,
),
)
const domains = [
{
@@ -74,7 +107,7 @@ describe("i18n parity", () => {
.filter((key) => !Object.hasOwn(source, key))
.sort()
const expected = pluralFamilies(source)
.flatMap((key) => (pluralCategories[locale] ?? []).map((category) => `${key}.${category}`))
.flatMap((key) => (pluralCategories.get(locale) ?? []).map((category) => `${key}.${category}`))
.sort()
expect({ domain: domain.name, locale, missing, extra }).toEqual({
domain: domain.name,
@@ -95,7 +128,7 @@ describe("i18n parity", () => {
(key) => Object.hasOwn(target, key) && placeholders(source[key]).join() !== placeholders(target[key]).join(),
)
const pluralMismatched = pluralFamilies(source).flatMap((key) =>
(pluralCategories[locale] ?? [])
(pluralCategories.get(locale) ?? [])
.map((category) => `${key}.${category}`)
.filter((variant) => placeholders(source[`${key}.other`]).join() !== placeholders(target[variant]).join()),
)
@@ -144,12 +177,12 @@ describe("i18n plural parity", () => {
for (const locale of domain.locales) {
const target = await dictionary(domain.target(locale))
const missing = families.flatMap((key) =>
(pluralCategories[locale] ?? [])
(pluralCategories.get(locale) ?? [])
.map((category) => `${key}.${category}`)
.filter((variant) => !Object.hasOwn(target, variant)),
)
const mismatched = families.flatMap((key) =>
(pluralCategories[locale] ?? [])
(pluralCategories.get(locale) ?? [])
.map((category) => `${key}.${category}`)
.filter(
(variant) =>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3
View File
@@ -8,4 +8,7 @@
- Keep locale and grammar logic in the shared typed i18n layer. Renderer code should resolve copy through the app language API, and the main process should consume typed native-translation bundles through `nativeT(...)`; native menus, dialogs, and IPC handlers must not inspect locales, choose plural categories, or assemble translated sentence fragments.
- Prefer complete translated phrases with only irreducible dynamic placeholders. If native UI needs richer grammar, deepen the shared bundle/API instead of adding locale branches to desktop feature code.
- Do not translate from model knowledge alone. Verify terminology and grammar with Unicode CLDR locale/plural data, Microsoft Localization Style Guides and terminology, Apple localization/style guidance and localized platform UI, Mozilla localization style guides, Mozilla Pontoon, and the Firefox localization corpus at `github.com/mozilla-l10n/firefox-l10n`.
- For developer-facing terminology, prefer established usage in the target language's developer community over literal translations. Cross-check maintained Firefox, KDE, and VS Code localizations, using at least two independent corpora when available. Keep established English loanwords and acronyms instead of inventing unfamiliar terms.
- Translate whole native-menu and dialog phrases in context. Audit recurring concepts for consistency and review every exact-English value; retain it only when it is an intentional product/provider/tool name, URL, code token, keyboard legend, acronym, asset name, or established borrowing.
- Record the corpora used and flag uncertain or regional terminology in review notes.
- Also use the relevant language authority or official dictionary for the locale (for example RAE/Fundéu, FranceTerme, Duden, TDK, Kotus/Kielitoimiston sanakirja, Språkrådet/Bokmålsordboka, Rada Języka Polskiego/PWN, the Russian and Arabic language academies, the Ukrainian Orthography, Taiwan MOE dictionaries, or the Royal Society of Thailand). Treat the English dictionary as the semantic source of truth and preserve placeholders, code identifiers, product names, and keyboard labels.
+26
View File
@@ -0,0 +1,26 @@
export const dict = {
"desktop.menu.checkForUpdates": "ዝማኔዎችን ይመልከቱ...",
"desktop.menu.installCli": "ጫን CLI...",
"desktop.menu.reloadWebview": "ዳግም ጫን Webview",
"desktop.menu.restart": "ዳግም አስጀምር",
"desktop.dialog.chooseFolder": "አቃፊ ምረጥ",
"desktop.dialog.chooseFile": "ፋይል ምረጥ",
"desktop.dialog.saveFile": "ፋይሉን አስቀምጥ",
"desktop.updater.checkFailed.title": "ማዘመን ቼክ አልተሳካም",
"desktop.updater.checkFailed.message": "ዝማኔዎችን ማረጋገጥ አልተሳካም",
"desktop.updater.none.title": "ምንም ማሻሻያ የለም",
"desktop.updater.none.message": "አሁን የቅርብ ጊዜውን የOpenCode ስሪት እየተጠቀሙ ነው",
"desktop.updater.downloadFailed.title": "ዝማኔ አልተሳካም",
"desktop.updater.downloadFailed.message": "ዝማኔን ማውረድ አልተሳካም",
"desktop.updater.downloaded.title": "ዝማኔው ወርዷል",
"desktop.updater.downloaded.prompt": "ስሪት {{version}} ከOpenCode ወርዷል፣ መጫን እና እንደገና ማስጀመር ይፈልጋሉ?",
"desktop.updater.installFailed.title": "ዝማኔ አልተሳካም",
"desktop.updater.installFailed.message": "ዝማኔን መጫን አልተሳካም",
"desktop.cli.installed.title": "CLI ተጭኗል",
"desktop.cli.installed.message": "CLI ወደ {{path}} ተጭኗል\n\nየ'opencode' ትዕዛዝን ለመጠቀም ተርሚናልዎን እንደገና ያስጀምሩት።",
"desktop.cli.failed.title": "መጫኑ አልተሳካም",
"desktop.cli.failed.message": "CLIን መጫን አልተሳካም፦ {{error}}",
"desktop.error.dev.rootNotFound":
"ሥርወ አካል አልተገኘም። ወደ የእርስዎ index.html ማከልን ረስተዋል? ወይም የመታወቂያ ባህሪው የተሳሳተ ፊደል ተጽፎ ሊሆን ይችላል?",
}
+3
View File
@@ -24,4 +24,7 @@ export const dict = {
"desktop.cli.installed.message": "تم تثبيت CLI في {{path}}\n\nأعد تشغيل الطرفية لاستخدام الأمر 'opencode'.",
"desktop.cli.failed.title": "فشل التثبيت",
"desktop.cli.failed.message": "فشل تثبيت CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"لم يتم العثور على العنصر الجذري. هل نسيت إضافته إلى index.html؟ أو ربما تمت كتابة سمة id بشكل خاطئ؟",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"CLI {{path}} ünvanına quraşdırıldı\n\n'opencode' əmrindən istifadə etmək üçün terminalı yenidən başladın.",
"desktop.cli.failed.title": "Quraşdırma uğursuz oldu",
"desktop.cli.failed.message": "CLI quraşdırıla bilmədi: {{error}}",
"desktop.error.dev.rootNotFound":
"Kök element tapılmadı. index.html-ə əlavə etməyi unutmusunuz? Yoxsa id atributu səhv yazılıb?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Проверете за актуализации...",
"desktop.menu.installCli": "Инсталирайте CLI...",
"desktop.menu.reloadWebview": "Презареди Webview",
"desktop.menu.restart": "Рестартирайте",
"desktop.dialog.chooseFolder": "Изберете папка",
"desktop.dialog.chooseFile": "Изберете файл",
"desktop.dialog.saveFile": "Запазете файла",
"desktop.updater.checkFailed.title": "Проверката на актуализацията е неуспешна",
"desktop.updater.checkFailed.message": "Неуспешна проверка за актуализации",
"desktop.updater.none.title": "Няма налична актуализация",
"desktop.updater.none.message": "Вече използвате най-новата версия на OpenCode",
"desktop.updater.downloadFailed.title": "Неуспешна актуализация",
"desktop.updater.downloadFailed.message": "Неуспешно изтегляне на актуализация",
"desktop.updater.downloaded.title": "Актуализацията е изтеглена",
"desktop.updater.downloaded.prompt":
"Версия {{version}} от OpenCode е изтеглена. Искате ли да я инсталирате и рестартирате?",
"desktop.updater.installFailed.title": "Неуспешна актуализация",
"desktop.updater.installFailed.message": "Неуспешно инсталиране на актуализация",
"desktop.cli.installed.title": "CLI е инсталиран",
"desktop.cli.installed.message":
"CLI инсталиран на {{path}}\n\nРестартирайте терминала си, за да използвате командата 'opencode'.",
"desktop.cli.failed.title": "Неуспешно инсталиране",
"desktop.cli.failed.message": "Неуспешно инсталиране на CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Основният елемент не е намерен. Забравихте ли да го добавите към вашия index.html? Или може би атрибутът id е изписан неправилно?",
}
+27
View File
@@ -0,0 +1,27 @@
export const dict: Record<string, string> = {
"desktop.menu.checkForUpdates": "আপডেটের জন্য চেক করুন...",
"desktop.menu.installCli": "CLI ইনস্টল করুন...",
"desktop.menu.reloadWebview": "Webview পুনরায় লোড করুন",
"desktop.menu.restart": "রিস্টার্ট করুন",
"desktop.dialog.chooseFolder": "একটি ফোল্ডার নির্বাচন করুন",
"desktop.dialog.chooseFile": "একটি ফাইল নির্বাচন করুন",
"desktop.dialog.saveFile": "ফাইল সংরক্ষণ করুন",
"desktop.updater.checkFailed.title": "আপডেট চেক ব্যর্থ হয়েছে",
"desktop.updater.checkFailed.message": "আপডেটের জন্য চেক করতে ব্যর্থ",
"desktop.updater.none.title": "কোন আপডেট উপলব্ধ নেই",
"desktop.updater.none.message": "আপনি ইতিমধ্যেই OpenCode এর সর্বশেষ সংস্করণ ব্যবহার করছেন৷",
"desktop.updater.downloadFailed.title": "আপডেট ব্যর্থ হয়েছে৷",
"desktop.updater.downloadFailed.message": "আপডেট ডাউনলোড করতে ব্যর্থ হয়েছে",
"desktop.updater.downloaded.title": "আপডেট ডাউনলোড হয়েছে",
"desktop.updater.downloaded.prompt":
"OpenCode-এর {{version}} সংস্করণ ডাউনলোড করা হয়েছে, আপনি কি এটি ইনস্টল করে পুনরায় চালু করতে চান?",
"desktop.updater.installFailed.title": "আপডেট ব্যর্থ হয়েছে৷",
"desktop.updater.installFailed.message": "আপডেট ইনস্টল করতে ব্যর্থ হয়েছে",
"desktop.cli.installed.title": "CLI ইনস্টল করা হয়েছে",
"desktop.cli.installed.message": "CLI {{path}}\n\n'ওপেনকোড' কমান্ড ব্যবহার করতে আপনার টার্মিনাল পুনরায় চালু করুন।",
"desktop.cli.failed.title": "ইনস্টলেশন ব্যর্থ হয়েছে",
"desktop.cli.failed.message": "CLI ইনস্টল করতে ব্যর্থ: {{error}}",
"desktop.error.dev.rootNotFound":
"মূল উপাদান পাওয়া যায়নি. আপনি কি আপনার index.html এ যোগ করতে ভুলে গেছেন? অথবা হয়তো আইডি অ্যাট্রিবিউট ভুল বানান হয়েছে?",
}
+3
View File
@@ -24,4 +24,7 @@ export const dict = {
"desktop.cli.installed.message": "CLI instalada em {{path}}\n\nReinicie seu terminal para usar o comando 'opencode'.",
"desktop.cli.failed.title": "Falha na instalação",
"desktop.cli.failed.message": "Falha ao instalar a CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Elemento raiz não encontrado. Você esqueceu de adicioná-lo ao seu index.html? Ou talvez o atributo id foi escrito incorretamente?",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"CLI je instaliran u {{path}}\n\nPonovo pokreni terminal da bi koristio komandu 'opencode'.",
"desktop.cli.failed.title": "Instalacija nije uspjela",
"desktop.cli.failed.message": "Neuspjela instalacija CLI-a: {{error}}",
"desktop.error.dev.rootNotFound":
"Korijenski element nije pronađen. Da li si zaboravio da ga dodaš u index.html? Ili je možda id atribut pogrešno napisan?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Comproveu si hi ha actualitzacions...",
"desktop.menu.installCli": "Instal·la CLI...",
"desktop.menu.reloadWebview": "Torna a carregar Webview",
"desktop.menu.restart": "Reinicia",
"desktop.dialog.chooseFolder": "Trieu una carpeta",
"desktop.dialog.chooseFile": "Trieu un fitxer",
"desktop.dialog.saveFile": "Desa el fitxer",
"desktop.updater.checkFailed.title": "La comprovació d'actualització ha fallat",
"desktop.updater.checkFailed.message": "No s'ha pogut comprovar si hi ha actualitzacions",
"desktop.updater.none.title": "No hi ha cap actualització disponible",
"desktop.updater.none.message": "Ja utilitzeu la versió més recent d'OpenCode",
"desktop.updater.downloadFailed.title": "L'actualització ha fallat",
"desktop.updater.downloadFailed.message": "No s'ha pogut descarregar l'actualització",
"desktop.updater.downloaded.title": "Actualització baixada",
"desktop.updater.downloaded.prompt":
"S'ha baixat la versió {{version}} d'OpenCode. Voleu instal·lar-la i reiniciar l'aplicació?",
"desktop.updater.installFailed.title": "L'actualització ha fallat",
"desktop.updater.installFailed.message": "No s'ha pogut instal·lar l'actualització",
"desktop.cli.installed.title": "CLI instal·lada",
"desktop.cli.installed.message":
"CLI instal·lada a {{path}}\n\nReinicieu el terminal per utilitzar l'ordre 'opencode'.",
"desktop.cli.failed.title": "La instal·lació ha fallat",
"desktop.cli.failed.message": "No s'ha pogut instal·lar CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"No s'ha trobat l'element arrel. T'has oblidat d'afegir-lo al teu index.html? O potser l'atribut id s'ha escrit malament?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Zkontrolovat aktualizace...",
"desktop.menu.installCli": "Instalovat CLI...",
"desktop.menu.reloadWebview": "Znovu načíst Webview",
"desktop.menu.restart": "Restartovat",
"desktop.dialog.chooseFolder": "Vyberte složku",
"desktop.dialog.chooseFile": "Vyberte soubor",
"desktop.dialog.saveFile": "Uložit soubor",
"desktop.updater.checkFailed.title": "Kontrola aktualizace se nezdařila",
"desktop.updater.checkFailed.message": "Kontrola aktualizací se nezdařila",
"desktop.updater.none.title": "Není k dispozici žádná aktualizace",
"desktop.updater.none.message": "Již používáte nejnovější verzi OpenCode",
"desktop.updater.downloadFailed.title": "Aktualizace se nezdařila",
"desktop.updater.downloadFailed.message": "Stažení aktualizace se nezdařilo",
"desktop.updater.downloaded.title": "Aktualizace stažena",
"desktop.updater.downloaded.prompt":
"Byla stažena verze {{version}} aplikace OpenCode. Chcete ji nainstalovat a aplikaci znovu spustit?",
"desktop.updater.installFailed.title": "Aktualizace se nezdařila",
"desktop.updater.installFailed.message": "Aktualizaci se nepodařilo nainstalovat",
"desktop.cli.installed.title": "CLI nainstalováno",
"desktop.cli.installed.message":
"CLI nainstalováno do {{path}}\n\nRestartujte svůj terminál, abyste mohli použít příkaz 'opencode'.",
"desktop.cli.failed.title": "Instalace se nezdařila",
"desktop.cli.failed.message": "Instalace CLI se nezdařila: {{error}}",
"desktop.error.dev.rootNotFound":
"Kořenový prvek nenalezen. Zapomněli jste to přidat do index.html? Nebo je možná chyba v atributu id?",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"CLI installeret i {{path}}\n\nGenstart din terminal for at bruge 'opencode'-kommandoen.",
"desktop.cli.failed.title": "Installation mislykkedes",
"desktop.cli.failed.message": "Kunne ikke installere CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Rodelement ikke fundet. Har du glemt at tilføje det til din index.html? Eller måske er id-attributten stavet forkert?",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"CLI wurde in {{path}} installiert\n\nStarten Sie Ihr Terminal neu, um den Befehl 'opencode' zu verwenden.",
"desktop.cli.failed.title": "Installation fehlgeschlagen",
"desktop.cli.failed.message": "CLI konnte nicht installiert werden: {{error}}",
"desktop.error.dev.rootNotFound":
"Wurzelelement nicht gefunden. Haben Sie vergessen, es in Ihre index.html aufzunehmen? Oder wurde das ID-Attribut falsch geschrieben?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "އަޕްޑޭޓްސް އަށް ޗެކް ކޮށްލައްވާ...",
"desktop.menu.installCli": "CLI އިންސްޓޯލް ކުރާށެވެ...",
"desktop.menu.reloadWebview": "ވެބްވިއު ރީލޯޑް ކުރާށެވެ",
"desktop.menu.restart": "އަލުން ފަށާށެވެ",
"desktop.dialog.chooseFolder": "ފޯލްޑަރެއް ހޮވާށެވެ",
"desktop.dialog.chooseFile": "ފައިލެއް ހޮވާށެވެ",
"desktop.dialog.saveFile": "ފައިލް ސޭވްކުރުން",
"desktop.updater.checkFailed.title": "އަޕްޑޭޓް ޗެކް ފެއިލްވެއްޖެ",
"desktop.updater.checkFailed.message": "އަޕްޑޭޓްތައް ޗެކް ނުކުރެވުނެވެ",
"desktop.updater.none.title": "އެއްވެސް އަޕްޑޭޓެއް ނުލިބެއެވެ",
"desktop.updater.none.message": "މިހާރުވެސް ބޭނުން ކުރަމުންދަނީ OpenCode ގެ އެންމެ ފަހުގެ ވަރޝަން އެވެ",
"desktop.updater.downloadFailed.title": "އަޕްޑޭޓް ފެއިލްވެއްޖެ",
"desktop.updater.downloadFailed.message": "އަޕްޑޭޓް ޑައުންލޯޑް ނުކުރެވުނެވެ",
"desktop.updater.downloaded.title": "އަޕްޑޭޓް ޑައުންލޯޑް ކުރެވިއްޖެއެވެ",
"desktop.updater.downloaded.prompt":
"OpenCode ގެ ވަރޝަން {{version}} ޑައުންލޯޑް ކުރެވިއްޖެ، އިންސްޓޯލްކޮށް އަލުން ލޯންޗް ކުރަން ބޭނުން ހެއްޔެވެ؟",
"desktop.updater.installFailed.title": "އަޕްޑޭޓް ފެއިލްވެއްޖެ",
"desktop.updater.installFailed.message": "އަޕްޑޭޓް އިންސްޓޯލް ކުރަން ނާކާމިޔާބުވިއެވެ",
"desktop.cli.installed.title": "CLI އިންސްޓޯލް ކުރެވިއްޖެއެވެ",
"desktop.cli.installed.message":
"CLI އިންސްޓޯލްކޮށްފައިވަނީ {{path}} އަށެވެ\n\n'opencode' ކޮމާންޑް ބޭނުން ކުރުމަށް ޓާމިނަލް އަލުން ސްޓާޓް ކުރާށެވެ.",
"desktop.cli.failed.title": "އިންސްޓޯލް ކުރުން ފެއިލްވެއްޖެ",
"desktop.cli.failed.message": "CLI: {{error}} އިންސްޓޯލް ކުރަން ނާކާމިޔާބު",
"desktop.error.dev.rootNotFound":
"ރޫޓް އެލިމެންޓް ނުފެނެއެވެ. ތިބާގެ index.html އަށް އެޑް ކުރަން ހަނދާން ނެތުނީ ހެއްޔެވެ؟ ނުވަތަ id އެޓްރިބިއުޓް ގޯސްކޮށް އިމްތިހާނު ވެދާނެ ހެއްޔެވެ؟",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict: Record<string, string> = {
"desktop.menu.checkForUpdates": "དུས་མཐུན་ཚུ་གི་དོན་ལུ་ཞིབ་དཔྱད་འབད།",
"desktop.menu.installCli": "CLI...",
"desktop.menu.reloadWebview": "ཡང་བསྐྱར་མངོན་གསལ་ Webview།",
"desktop.menu.restart": "ལོག་འགོ་བཙུགས།",
"desktop.dialog.chooseFolder": "སྣོད་འཛིན་ཅིག་གདམ་ཁ་རྐྱབས།",
"desktop.dialog.chooseFile": "ཡིག་སྣོད་གདམ་ཁ་རྐྱབས།",
"desktop.dialog.saveFile": "ཡིག་སྣོད་སྲུངས།",
"desktop.updater.checkFailed.title": "དུས་མཐུན་ཞིབ་དཔྱད་འཐུས་ཤོར་འབྱུང་ཡོདཔ།",
"desktop.updater.checkFailed.message": "དུས་མཐུན་བཟོ་ནིའི་དོན་ལུ་ ཞིབ་དཔྱད་འབད་ནི་ལུ་འཐུས་ཤོར་འབྱུང་ཡོདཔ།",
"desktop.updater.none.title": "དུས་མཐུན་བཟོ་མི་ཚུགས།",
"desktop.updater.none.message": "ཁྱོད་ཀྱིས་ཧེ་མ་ལས་ OpenCodeགི་ཐོན་རིམ་གསརཔ་འདི་ལག་ལེན་འཐབ་དོ།",
"desktop.updater.downloadFailed.title": "དུས་མཐུན་འཐུས་ཤོར་འབྱུང་ཡོདཔ།",
"desktop.updater.downloadFailed.message": "དུས་མཐུན་ཕབ་ལེན་འབད་ནི་ལུ་འཐུས་ཤོར་འབྱུང་ཡོདཔ།",
"desktop.updater.downloaded.title": "དུས་མཐུན་ཕབ་ལེན་འབད་ཡོདཔ།",
"desktop.updater.downloaded.prompt":
"OpenCode གི་ཐོན་རིམ་ {{version}} ཕབ་ལེན་འབད་ཡོདཔ་ལས་ གཞི་བཙུགས་འབད་དེ་ ལོག་འགོ་བཙུགས་ནི་ཨིན་ན?",
"desktop.updater.installFailed.title": "དུས་མཐུན་འཐུས་ཤོར་འབྱུང་ཡོདཔ།",
"desktop.updater.installFailed.message": "དུས་མཐུན་གཞི་བཙུགས་འབད་ནི་ལུ་འཐུས་ཤོར་འབྱུང་ཡོདཔ།",
"desktop.cli.installed.title": "CLI བཙུགས་ཡོདཔ།",
"desktop.cli.installed.message":
"CLI {{path}}\n\nལུ་གཞི་བཙུགས་འབད་ནུག 'opencode' བརྡ་བཀོད་ལག་ལེན་འཐབ་ནིའི་དོན་ལུ་ ཁྱོད་རའི་ཊར་མི་ནཱལ་དེ་ལོག་འགོ་བཙུགས།",
"desktop.cli.failed.title": "གཞི་བཙུགས་འཐུས་ཤོར་འབྱུང་ཡོདཔ།",
"desktop.cli.failed.message": "CLI: {{error}} གཞི་བཙུགས་འབད་ནི་ལུ་འཐུས་ཤོར་འབྱུང་ཡོདཔ།",
"desktop.error.dev.rootNotFound":
"རྩ་བའི་ཆ་ཤས་འཚོལ་མ་ཐོབ། ཁྱོད་ཀྱི་ index.html ལུ་ཁ་སྐོང་འབད་ནི་བརྗེད་སོང་ག? ཡང་ན་ id ཁྱད་ཆོས་འདི་ཡིག་སྡེབ་འཛོལ་བ་འོང་ག?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Έλεγχος για ενημερώσεις...",
"desktop.menu.installCli": "Εγκατάσταση CLI...",
"desktop.menu.reloadWebview": "Επανάληψη φόρτωσης Webview",
"desktop.menu.restart": "Επανεκκίνηση",
"desktop.dialog.chooseFolder": "Επιλογή φακέλου",
"desktop.dialog.chooseFile": "Επιλογή αρχείου",
"desktop.dialog.saveFile": "Αποθήκευση αρχείου",
"desktop.updater.checkFailed.title": "Ο έλεγχος ενημέρωσης απέτυχε",
"desktop.updater.checkFailed.message": "Απέτυχε ο έλεγχος για ενημερώσεις",
"desktop.updater.none.title": "Δεν υπάρχει διαθέσιμη ενημέρωση",
"desktop.updater.none.message": "Χρησιμοποιείτε ήδη την πιο πρόσφατη έκδοση του OpenCode",
"desktop.updater.downloadFailed.title": "Η ενημέρωση απέτυχε",
"desktop.updater.downloadFailed.message": "Απέτυχε η λήψη της ενημέρωσης",
"desktop.updater.downloaded.title": "Η ενημέρωση λήφθηκε",
"desktop.updater.downloaded.prompt":
"Έχει γίνει λήψη της έκδοσης {{version}} του OpenCode. Θέλετε να την εγκαταστήσετε και να επανεκκινήσετε την εφαρμογή;",
"desktop.updater.installFailed.title": "Η ενημέρωση απέτυχε",
"desktop.updater.installFailed.message": "Αποτυχία εγκατάστασης ενημέρωσης",
"desktop.cli.installed.title": "Το CLI εγκαταστάθηκε",
"desktop.cli.installed.message":
"CLI εγκατεστημένο στο {{path}}\n\nΕπανεκκινήστε το τερματικό σας για να χρησιμοποιήσετε την εντολή 'opencode'.",
"desktop.cli.failed.title": "Η εγκατάσταση απέτυχε",
"desktop.cli.failed.message": "Απέτυχε η εγκατάσταση του CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Το στοιχείο ρίζας δεν βρέθηκε. Ξεχάσατε να το προσθέσετε στο index.html; Ή μήπως το χαρακτηριστικό id γράφτηκε λάθος;",
}
+3
View File
@@ -24,4 +24,7 @@ export const dict = {
"desktop.cli.installed.message": "CLI installed to {{path}}\n\nRestart your terminal to use the 'opencode' command.",
"desktop.cli.failed.title": "Installation Failed",
"desktop.cli.failed.message": "Failed to install CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?",
}
+3
View File
@@ -24,4 +24,7 @@ export const dict = {
"desktop.cli.installed.message": "CLI instalada en {{path}}\n\nReinicia tu terminal para usar el comando 'opencode'.",
"desktop.cli.failed.title": "Instalación fallida",
"desktop.cli.failed.message": "No se pudo instalar la CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Elemento raíz no encontrado. ¿Olvidaste añadirlo a tu index.html? ¿O tal vez el atributo id está mal escrito?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Kontrolli värskendusi...",
"desktop.menu.installCli": "Installi CLI...",
"desktop.menu.reloadWebview": "Laadi veebivaade uuesti",
"desktop.menu.restart": "Taaskäivita",
"desktop.dialog.chooseFolder": "Valige kaust",
"desktop.dialog.chooseFile": "Valige fail",
"desktop.dialog.saveFile": "Salvesta fail",
"desktop.updater.checkFailed.title": "Värskenduskontroll ebaõnnestus",
"desktop.updater.checkFailed.message": "Värskenduste kontrollimine ebaõnnestus",
"desktop.updater.none.title": "Värskendus pole saadaval",
"desktop.updater.none.message": "Kasutate juba rakenduse OpenCode uusimat versiooni",
"desktop.updater.downloadFailed.title": "Värskendus ebaõnnestus",
"desktop.updater.downloadFailed.message": "Värskenduse allalaadimine ebaõnnestus",
"desktop.updater.downloaded.title": "Värskendus alla laaditud",
"desktop.updater.downloaded.prompt":
"OpenCode'i versioon {{version}} on alla laaditud. Kas soovite selle installida ja rakenduse taaskäivitada?",
"desktop.updater.installFailed.title": "Värskendus ebaõnnestus",
"desktop.updater.installFailed.message": "Värskenduse installimine ebaõnnestus",
"desktop.cli.installed.title": "CLI installitud",
"desktop.cli.installed.message":
"CLI installitud asukohta {{path}}\n\nKäsu „opencode” kasutamiseks taaskäivitage terminal.",
"desktop.cli.failed.title": "Installimine ebaõnnestus",
"desktop.cli.failed.message": "CLI installimine ebaõnnestus: {{error}}",
"desktop.error.dev.rootNotFound":
"Juurelementi ei leitud. Kas unustasite selle lisada oma loendisse index.html? Või äkki on id-atribuut valesti kirjutatud?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "بررسی به روز رسانی...",
"desktop.menu.installCli": "نصب CLI...",
"desktop.menu.reloadWebview": "بارگذاری مجدد Webview",
"desktop.menu.restart": "راه اندازی مجدد",
"desktop.dialog.chooseFolder": "یک پوشه را انتخاب کنید",
"desktop.dialog.chooseFile": "یک فایل را انتخاب کنید",
"desktop.dialog.saveFile": "ذخیره فایل",
"desktop.updater.checkFailed.title": "بررسی به‌روزرسانی انجام نشد",
"desktop.updater.checkFailed.message": "بررسی به‌روزرسانی‌ها انجام نشد",
"desktop.updater.none.title": "به روز رسانی موجود نیست",
"desktop.updater.none.message": "شما در حال حاضر از آخرین نسخه OpenCode استفاده می کنید",
"desktop.updater.downloadFailed.title": "به روز رسانی انجام نشد",
"desktop.updater.downloadFailed.message": "به روز رسانی دانلود نشد",
"desktop.updater.downloaded.title": "به روز رسانی دانلود شد",
"desktop.updater.downloaded.prompt":
"نسخه {{version}} OpenCode دانلود شده است، آیا می خواهید آن را نصب کنید و دوباره راه اندازی کنید؟",
"desktop.updater.installFailed.title": "به روز رسانی انجام نشد",
"desktop.updater.installFailed.message": "به روز رسانی نصب نشد",
"desktop.cli.installed.title": "CLI نصب شده است",
"desktop.cli.installed.message":
"CLI روی {{path}} نصب شد\n\nترمینال خود را مجددا راه اندازی کنید تا از دستور 'opencode' استفاده کنید.",
"desktop.cli.failed.title": "نصب ناموفق بود",
"desktop.cli.failed.message": "CLI نصب نشد: {{error}}",
"desktop.error.dev.rootNotFound":
"عنصر ریشه یافت نشد. آیا فراموش کرده اید که آن را به index.html خود اضافه کنید؟ یا شاید ویژگی id اشتباه املایی داشته باشد؟",
}
+3
View File
@@ -22,4 +22,7 @@ export const dict = {
"CLI on asennettu polkuun {{path}}\n\nKäynnistä terminaali uudelleen, jotta voit käyttää 'opencode'-komentoa.",
"desktop.cli.failed.title": "Asennus epäonnistui",
"desktop.cli.failed.message": "CLI:n asennus epäonnistui: {{error}}",
"desktop.error.dev.rootNotFound":
"Juurielementtiä ei löydy. Unohditko lisätä sen index.html-tiedostoosi? Tai ehkä id-attribuutti on kirjoitettu väärin?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Kanna fyri dagføringum...",
"desktop.menu.installCli": "Set upp CLI...",
"desktop.menu.reloadWebview": "Endurlesa vevvísing",
"desktop.menu.restart": "Endurbyrja",
"desktop.dialog.chooseFolder": "Vel eina mappu",
"desktop.dialog.chooseFile": "Vel eina fílu",
"desktop.dialog.saveFile": "Goym fílu",
"desktop.updater.checkFailed.title": "Dagføringarkanningin miseydnaðist",
"desktop.updater.checkFailed.message": "Tað eydnaðist ikki at kanna fyri dagføringum",
"desktop.updater.none.title": "Eingin dagføring er tøk",
"desktop.updater.none.message": "Tú brúkar longu nýggjastu útgávuna av OpenCode.",
"desktop.updater.downloadFailed.title": "Dagføring miseydnaðist",
"desktop.updater.downloadFailed.message": "Tað eydnaðist ikki at heinta dagføring",
"desktop.updater.downloaded.title": "Dagføring heintað",
"desktop.updater.downloaded.prompt":
"Útgáva {{version}} av OpenCode er heintað, vilt tú seta hana upp og seta hana í gongd aftur?",
"desktop.updater.installFailed.title": "Dagføring miseydnaðist",
"desktop.updater.installFailed.message": "Tað eydnaðist ikki at seta upp dagføring",
"desktop.cli.installed.title": "CLI Sett upp",
"desktop.cli.installed.message":
"CLI sett upp í {{path}}\n\nEndurbyrja terminalin fyri at brúka skipanina 'opencode'.",
"desktop.cli.failed.title": "Innleggingin miseydnaðist",
"desktop.cli.failed.message": "Tað eydnaðist ikki at seta upp CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Rótarevni ikki funnið. Gloymdi tú at leggja tað til títt index.html? Ella kanska fekk id eginleikin skeivt stavað?",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"Interface en ligne de commande installée dans {{path}}\n\nRedémarrez votre terminal pour utiliser la commande 'opencode'.",
"desktop.cli.failed.title": "Échec de l'installation",
"desktop.cli.failed.message": "Impossible d'installer l'interface en ligne de commande : {{error}}",
"desktop.error.dev.rootNotFound":
"Élément racine introuvable. Avez-vous oublié de l'ajouter à votre index.html ? Ou peut-être que l'attribut id est mal orthographié ?",
}
+3
View File
@@ -22,4 +22,7 @@ export const dict = {
"CLI को {{path}} पर इंस्टॉल किया गया\n\n'opencode' कमांड का उपयोग करने के लिए अपना टर्मिनल पुनः आरंभ करें।",
"desktop.cli.failed.title": "स्थापना विफल",
"desktop.cli.failed.message": "CLI इंस्टॉल करने में विफल: {{error}}",
"desktop.error.dev.rootNotFound":
"मूल तत्व नहीं मिला. क्या आप इसे अपने index.html में जोड़ना भूल गए? या हो सकता है कि आईडी विशेषता गलत वर्तनी हो गई हो?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Provjeri ažuriranja...",
"desktop.menu.installCli": "Instaliraj CLI...",
"desktop.menu.reloadWebview": "Ponovno učitaj Webview",
"desktop.menu.restart": "Ponovno pokreni",
"desktop.dialog.chooseFolder": "Odaberite mapu",
"desktop.dialog.chooseFile": "Odaberite datoteku",
"desktop.dialog.saveFile": "Spremi datoteku",
"desktop.updater.checkFailed.title": "Provjera ažuriranja nije uspjela",
"desktop.updater.checkFailed.message": "Provjera ažuriranja nije uspjela",
"desktop.updater.none.title": "Nema dostupnih ažuriranja",
"desktop.updater.none.message": "Već koristite najnoviju verziju OpenCode",
"desktop.updater.downloadFailed.title": "Ažuriranje nije uspjelo",
"desktop.updater.downloadFailed.message": "Preuzimanje ažuriranja nije uspjelo",
"desktop.updater.downloaded.title": "Ažuriranje preuzeto",
"desktop.updater.downloaded.prompt":
"Preuzeta je verzija {{version}} aplikacije OpenCode. Želite li je instalirati i ponovno pokrenuti aplikaciju?",
"desktop.updater.installFailed.title": "Ažuriranje nije uspjelo",
"desktop.updater.installFailed.message": "Instalacija ažuriranja nije uspjela",
"desktop.cli.installed.title": "CLI je instaliran",
"desktop.cli.installed.message":
"CLI instaliran na {{path}}\n\nPonovno pokrenite terminal da biste koristili naredbu 'opencode'.",
"desktop.cli.failed.title": "Instalacija nije uspjela",
"desktop.cli.failed.message": "Instalacija CLI nije uspjela: {{error}}",
"desktop.error.dev.rootNotFound":
"Korijenski element nije pronađen. Jeste li ga zaboravili dodati u svoj index.html? Ili je možda atribut id-a pogrešno napisan?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Frissítések keresése...",
"desktop.menu.installCli": "CLI telepítése...",
"desktop.menu.reloadWebview": "A Webview újratöltése",
"desktop.menu.restart": "Újraindítás",
"desktop.dialog.chooseFolder": "Válasszon egy mappát",
"desktop.dialog.chooseFile": "Válasszon egy fájlt",
"desktop.dialog.saveFile": "Fájl mentése",
"desktop.updater.checkFailed.title": "Frissítés ellenőrzése sikertelen",
"desktop.updater.checkFailed.message": "Nem sikerült ellenőrizni a frissítéseket",
"desktop.updater.none.title": "Nem érhető el frissítés",
"desktop.updater.none.message": "Már az OpenCode legújabb verzióját használja",
"desktop.updater.downloadFailed.title": "Frissítés sikertelen",
"desktop.updater.downloadFailed.message": "Nem sikerült letölteni a frissítést",
"desktop.updater.downloaded.title": "Frissítés letöltve",
"desktop.updater.downloaded.prompt":
"Az OpenCode {{version}} verziója letöltődött. Szeretné telepíteni és újraindítani az alkalmazást?",
"desktop.updater.installFailed.title": "Frissítés sikertelen",
"desktop.updater.installFailed.message": "Nem sikerült telepíteni a frissítést",
"desktop.cli.installed.title": "CLI telepítve",
"desktop.cli.installed.message":
"A CLI telepítési helye: {{path}}\n\nIndítsa újra a terminált az 'opencode' parancs használatához.",
"desktop.cli.failed.title": "A telepítés sikertelen",
"desktop.cli.failed.message": "A CLI telepítése sikertelen: {{error}}",
"desktop.error.dev.rootNotFound":
"A gyökérelem nem található. Elfelejtette hozzáadni az index.html-hez? Vagy lehet, hogy az id attribútumot rosszul írták?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Ստուգեք թարմացումների համար...",
"desktop.menu.installCli": "Տեղադրեք CLI...",
"desktop.menu.reloadWebview": "Վերբեռնել Webview",
"desktop.menu.restart": "Վերագործարկեք",
"desktop.dialog.chooseFolder": "Ընտրեք թղթապանակ",
"desktop.dialog.chooseFile": "Ընտրեք ֆայլ",
"desktop.dialog.saveFile": "Պահպանել ֆայլը",
"desktop.updater.checkFailed.title": "Թարմացման ստուգումը ձախողվեց",
"desktop.updater.checkFailed.message": "Չհաջողվեց ստուգել թարմացումների առկայությունը",
"desktop.updater.none.title": "Թարմացում չկա",
"desktop.updater.none.message": "Դուք արդեն օգտագործում եք OpenCode-ի վերջին տարբերակը",
"desktop.updater.downloadFailed.title": "Թարմացումը ձախողվեց",
"desktop.updater.downloadFailed.message": "Չհաջողվեց ներբեռնել թարմացումը",
"desktop.updater.downloaded.title": "Թարմացումը ներբեռնված է",
"desktop.updater.downloaded.prompt":
"OpenCode-ի {{version}} տարբերակը ներբեռնվել է: Ցանկանու՞մ եք տեղադրել այն և վերագործարկել:",
"desktop.updater.installFailed.title": "Թարմացումը ձախողվեց",
"desktop.updater.installFailed.message": "Չհաջողվեց տեղադրել թարմացումը",
"desktop.cli.installed.title": "CLI-ն տեղադրված է",
"desktop.cli.installed.message":
"CLI-ն տեղադրված է {{path}}-ում\n\nՎերագործարկեք ձեր տերմինալը՝ «opencode» հրամանն օգտագործելու համար:",
"desktop.cli.failed.title": "Տեղադրումը ձախողվեց",
"desktop.cli.failed.message": "Չհաջողվեց տեղադրել CLI՝ {{error}}",
"desktop.error.dev.rootNotFound":
"Արմատային տարրը չի գտնվել։ Մոռացե՞լ եք այն ավելացնել ձեր index.html-ում: Կամ գուցե id հատկանիշը սխալ է գրվել:",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"CLI terinstal di {{path}}\n\nMulai ulang terminal Anda untuk menggunakan perintah 'opencode'.",
"desktop.cli.failed.title": "Instalasi gagal",
"desktop.cli.failed.message": "Gagal menginstal CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Elemen root tidak ditemukan. Apakah Anda lupa menambahkannya ke index.html? Atau mungkin atribut id salah eja?",
}
+105 -175
View File
@@ -1,4 +1,9 @@
import * as i18n from "@solid-primitives/i18n"
import {
DESKTOP_NATIVE_LOCALES,
detectDesktopNativeLocale,
type DesktopNativeLocale,
} from "../../../../app/src/i18n/desktop-native"
import { dict as desktopEn } from "./en"
import { dict as desktopZh } from "./zh"
@@ -29,164 +34,55 @@ import { dict as desktopFi } from "./fi"
import { dict as desktopSv } from "./sv"
import { dict as desktopTh } from "./th"
import { dict as appEn } from "../../../../app/src/i18n/en"
import { dict as appZh } from "../../../../app/src/i18n/zh"
import { dict as appZht } from "../../../../app/src/i18n/zht"
import { dict as appKo } from "../../../../app/src/i18n/ko"
import { dict as appDe } from "../../../../app/src/i18n/de"
import { dict as appEs } from "../../../../app/src/i18n/es"
import { dict as appFr } from "../../../../app/src/i18n/fr"
import { dict as appDa } from "../../../../app/src/i18n/da"
import { dict as appJa } from "../../../../app/src/i18n/ja"
import { dict as appPl } from "../../../../app/src/i18n/pl"
import { dict as appRu } from "../../../../app/src/i18n/ru"
import { dict as appUk } from "../../../../app/src/i18n/uk"
import { dict as appAr } from "../../../../app/src/i18n/ar"
import { dict as appNo } from "../../../../app/src/i18n/no"
import { dict as appBr } from "../../../../app/src/i18n/br"
import { dict as appBs } from "../../../../app/src/i18n/bs"
import { dict as appTr } from "../../../../app/src/i18n/tr"
import { dict as appHi } from "../../../../app/src/i18n/hi"
import { dict as appNl } from "../../../../app/src/i18n/nl"
import { dict as appId } from "../../../../app/src/i18n/id"
import { dict as appVi } from "../../../../app/src/i18n/vi"
import { dict as appIt } from "../../../../app/src/i18n/it"
import { dict as appUr } from "../../../../app/src/i18n/ur"
import { dict as appPa } from "../../../../app/src/i18n/pa"
import { dict as appAz } from "../../../../app/src/i18n/az"
import { dict as appFi } from "../../../../app/src/i18n/fi"
import { dict as appSv } from "../../../../app/src/i18n/sv"
import { dict as appTh } from "../../../../app/src/i18n/th"
import { dict as desktopAm } from "./am"
import { dict as desktopBg } from "./bg"
import { dict as desktopBn } from "./bn"
import { dict as desktopCa } from "./ca"
import { dict as desktopCs } from "./cs"
import { dict as desktopDv } from "./dv"
import { dict as desktopDz } from "./dz"
import { dict as desktopEl } from "./el"
import { dict as desktopEt } from "./et"
import { dict as desktopFa } from "./fa"
import { dict as desktopFo } from "./fo"
import { dict as desktopHr } from "./hr"
import { dict as desktopHu } from "./hu"
import { dict as desktopHy } from "./hy"
import { dict as desktopIs } from "./is"
import { dict as desktopKa } from "./ka"
import { dict as desktopKm } from "./km"
import { dict as desktopLo } from "./lo"
import { dict as desktopLt } from "./lt"
import { dict as desktopLv } from "./lv"
import { dict as desktopMk } from "./mk"
import { dict as desktopMn } from "./mn"
import { dict as desktopMs } from "./ms"
import { dict as desktopMy } from "./my"
import { dict as desktopNe } from "./ne"
import { dict as desktopRo } from "./ro"
import { dict as desktopSi } from "./si"
import { dict as desktopSk } from "./sk"
import { dict as desktopSl } from "./sl"
import { dict as desktopSq } from "./sq"
import { dict as desktopSr } from "./sr"
import { dict as desktopTg } from "./tg"
import { dict as desktopTk } from "./tk"
import { dict as desktopUz } from "./uz"
export type Locale =
| "en"
| "zh"
| "zht"
| "ko"
| "de"
| "es"
| "fr"
| "da"
| "ja"
| "pl"
| "ru"
| "uk"
| "ar"
| "no"
| "br"
| "bs"
| "tr"
| "hi"
| "nl"
| "id"
| "vi"
| "it"
| "ur"
| "pa"
| "az"
| "fi"
| "sv"
| "th"
export type Locale = DesktopNativeLocale
type RawDictionary = typeof appEn & typeof desktopEn
type RawDictionary = typeof desktopEn
type Dictionary = Record<keyof i18n.Flatten<RawDictionary>, string>
const LOCALES: readonly Locale[] = [
"en",
"zh",
"zht",
"ko",
"de",
"es",
"fr",
"da",
"ja",
"pl",
"ru",
"uk",
"bs",
"ar",
"no",
"br",
"tr",
"hi",
"nl",
"id",
"vi",
"it",
"ur",
"pa",
"az",
"fi",
"sv",
"th",
]
function detectLocale(): Locale {
if (typeof navigator !== "object") return "en"
const languages = navigator.languages?.length ? navigator.languages : [navigator.language]
for (const language of languages) {
if (!language) continue
if (language.toLowerCase().startsWith("en")) return "en"
if (language.toLowerCase().startsWith("zh")) {
if (
language.toLowerCase().includes("hant") ||
language.toLowerCase().includes("-tw") ||
language.toLowerCase().includes("-hk") ||
language.toLowerCase().includes("-mo")
)
return "zht"
return "zh"
}
if (language.toLowerCase().startsWith("ko")) return "ko"
if (language.toLowerCase().startsWith("de")) return "de"
if (language.toLowerCase().startsWith("es")) return "es"
if (language.toLowerCase().startsWith("fr")) return "fr"
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"
if (language.toLowerCase().startsWith("uk")) return "uk"
if (language.toLowerCase().startsWith("ar")) return "ar"
if (
language.toLowerCase().startsWith("no") ||
language.toLowerCase().startsWith("nb") ||
language.toLowerCase().startsWith("nn")
)
return "no"
if (language.toLowerCase().startsWith("pt")) return "br"
if (language.toLowerCase().startsWith("bs")) return "bs"
if (language.toLowerCase().startsWith("tr")) return "tr"
if (language.toLowerCase().startsWith("hi")) return "hi"
if (language.toLowerCase().startsWith("nl")) return "nl"
if (language.toLowerCase().startsWith("id")) return "id"
if (language.toLowerCase().startsWith("vi")) return "vi"
if (language.toLowerCase().startsWith("it")) return "it"
if (language.toLowerCase().startsWith("ur")) return "ur"
if (
language.toLowerCase().startsWith("pa") &&
(language.toLowerCase().includes("arab") || language.toLowerCase().includes("-pk"))
)
return "pa"
if (
language.toLowerCase().startsWith("az") &&
!language.toLowerCase().includes("arab") &&
!language.toLowerCase().includes("cyrl")
)
return "az"
if (language.toLowerCase().startsWith("fi")) return "fi"
if (language.toLowerCase().startsWith("sv")) return "sv"
if (language.toLowerCase().startsWith("th")) return "th"
}
return "en"
return detectDesktopNativeLocale(navigator.languages?.length ? navigator.languages : [navigator.language])
}
function parseLocale(value: unknown): Locale | null {
if (!value) return null
if (typeof value !== "string") return null
if ((LOCALES as readonly string[]).includes(value)) return value as Locale
if ((DESKTOP_NATIVE_LOCALES as readonly string[]).includes(value)) return value as Locale
return null
}
@@ -215,37 +111,71 @@ function pickLocale(value: unknown): Locale | null {
return parseLocale(record.locale)
}
const base = i18n.flatten({ ...appEn, ...desktopEn })
const base = i18n.flatten(desktopEn)
function build(locale: Locale): Dictionary {
if (locale === "en") return base
if (locale === "zh") return { ...base, ...i18n.flatten(appZh), ...i18n.flatten(desktopZh) }
if (locale === "zht") return { ...base, ...i18n.flatten(appZht), ...i18n.flatten(desktopZht) }
if (locale === "de") return { ...base, ...i18n.flatten(appDe), ...i18n.flatten(desktopDe) }
if (locale === "es") return { ...base, ...i18n.flatten(appEs), ...i18n.flatten(desktopEs) }
if (locale === "fr") return { ...base, ...i18n.flatten(appFr), ...i18n.flatten(desktopFr) }
if (locale === "da") return { ...base, ...i18n.flatten(appDa), ...i18n.flatten(desktopDa) }
if (locale === "ja") return { ...base, ...i18n.flatten(appJa), ...i18n.flatten(desktopJa) }
if (locale === "pl") return { ...base, ...i18n.flatten(appPl), ...i18n.flatten(desktopPl) }
if (locale === "ru") return { ...base, ...i18n.flatten(appRu), ...i18n.flatten(desktopRu) }
if (locale === "uk") return { ...base, ...i18n.flatten(appUk), ...i18n.flatten(desktopUk) }
if (locale === "ar") return { ...base, ...i18n.flatten(appAr), ...i18n.flatten(desktopAr) }
if (locale === "no") return { ...base, ...i18n.flatten(appNo), ...i18n.flatten(desktopNo) }
if (locale === "br") return { ...base, ...i18n.flatten(appBr), ...i18n.flatten(desktopBr) }
if (locale === "bs") return { ...base, ...i18n.flatten(appBs), ...i18n.flatten(desktopBs) }
if (locale === "tr") return { ...base, ...i18n.flatten(appTr), ...i18n.flatten(desktopTr) }
if (locale === "hi") return { ...base, ...i18n.flatten(appHi), ...i18n.flatten(desktopHi) }
if (locale === "nl") return { ...base, ...i18n.flatten(appNl), ...i18n.flatten(desktopNl) }
if (locale === "id") return { ...base, ...i18n.flatten(appId), ...i18n.flatten(desktopId) }
if (locale === "vi") return { ...base, ...i18n.flatten(appVi), ...i18n.flatten(desktopVi) }
if (locale === "it") return { ...base, ...i18n.flatten(appIt), ...i18n.flatten(desktopIt) }
if (locale === "ur") return { ...base, ...i18n.flatten(appUr), ...i18n.flatten(desktopUr) }
if (locale === "pa") return { ...base, ...i18n.flatten(appPa), ...i18n.flatten(desktopPa) }
if (locale === "az") return { ...base, ...i18n.flatten(appAz), ...i18n.flatten(desktopAz) }
if (locale === "fi") return { ...base, ...i18n.flatten(appFi), ...i18n.flatten(desktopFi) }
if (locale === "sv") return { ...base, ...i18n.flatten(appSv), ...i18n.flatten(desktopSv) }
if (locale === "th") return { ...base, ...i18n.flatten(appTh), ...i18n.flatten(desktopTh) }
return { ...base, ...i18n.flatten(appKo), ...i18n.flatten(desktopKo) }
if (locale === "zh") return { ...base, ...i18n.flatten(desktopZh) }
if (locale === "zht") return { ...base, ...i18n.flatten(desktopZht) }
if (locale === "de") return { ...base, ...i18n.flatten(desktopDe) }
if (locale === "es") return { ...base, ...i18n.flatten(desktopEs) }
if (locale === "fr") return { ...base, ...i18n.flatten(desktopFr) }
if (locale === "da") return { ...base, ...i18n.flatten(desktopDa) }
if (locale === "ja") return { ...base, ...i18n.flatten(desktopJa) }
if (locale === "pl") return { ...base, ...i18n.flatten(desktopPl) }
if (locale === "ru") return { ...base, ...i18n.flatten(desktopRu) }
if (locale === "uk") return { ...base, ...i18n.flatten(desktopUk) }
if (locale === "ar") return { ...base, ...i18n.flatten(desktopAr) }
if (locale === "no") return { ...base, ...i18n.flatten(desktopNo) }
if (locale === "br") return { ...base, ...i18n.flatten(desktopBr) }
if (locale === "bs") return { ...base, ...i18n.flatten(desktopBs) }
if (locale === "tr") return { ...base, ...i18n.flatten(desktopTr) }
if (locale === "hi") return { ...base, ...i18n.flatten(desktopHi) }
if (locale === "nl") return { ...base, ...i18n.flatten(desktopNl) }
if (locale === "id") return { ...base, ...i18n.flatten(desktopId) }
if (locale === "vi") return { ...base, ...i18n.flatten(desktopVi) }
if (locale === "it") return { ...base, ...i18n.flatten(desktopIt) }
if (locale === "ur") return { ...base, ...i18n.flatten(desktopUr) }
if (locale === "pa") return { ...base, ...i18n.flatten(desktopPa) }
if (locale === "az") return { ...base, ...i18n.flatten(desktopAz) }
if (locale === "fi") return { ...base, ...i18n.flatten(desktopFi) }
if (locale === "sv") return { ...base, ...i18n.flatten(desktopSv) }
if (locale === "th") return { ...base, ...i18n.flatten(desktopTh) }
if (locale === "am") return { ...base, ...i18n.flatten(desktopAm) }
if (locale === "bg") return { ...base, ...i18n.flatten(desktopBg) }
if (locale === "bn") return { ...base, ...i18n.flatten(desktopBn) }
if (locale === "ca") return { ...base, ...i18n.flatten(desktopCa) }
if (locale === "cs") return { ...base, ...i18n.flatten(desktopCs) }
if (locale === "dv") return { ...base, ...i18n.flatten(desktopDv) }
if (locale === "dz") return { ...base, ...i18n.flatten(desktopDz) }
if (locale === "el") return { ...base, ...i18n.flatten(desktopEl) }
if (locale === "et") return { ...base, ...i18n.flatten(desktopEt) }
if (locale === "fa") return { ...base, ...i18n.flatten(desktopFa) }
if (locale === "fo") return { ...base, ...i18n.flatten(desktopFo) }
if (locale === "hr") return { ...base, ...i18n.flatten(desktopHr) }
if (locale === "hu") return { ...base, ...i18n.flatten(desktopHu) }
if (locale === "hy") return { ...base, ...i18n.flatten(desktopHy) }
if (locale === "is") return { ...base, ...i18n.flatten(desktopIs) }
if (locale === "ka") return { ...base, ...i18n.flatten(desktopKa) }
if (locale === "km") return { ...base, ...i18n.flatten(desktopKm) }
if (locale === "lo") return { ...base, ...i18n.flatten(desktopLo) }
if (locale === "lt") return { ...base, ...i18n.flatten(desktopLt) }
if (locale === "lv") return { ...base, ...i18n.flatten(desktopLv) }
if (locale === "mk") return { ...base, ...i18n.flatten(desktopMk) }
if (locale === "mn") return { ...base, ...i18n.flatten(desktopMn) }
if (locale === "ms") return { ...base, ...i18n.flatten(desktopMs) }
if (locale === "my") return { ...base, ...i18n.flatten(desktopMy) }
if (locale === "ne") return { ...base, ...i18n.flatten(desktopNe) }
if (locale === "ro") return { ...base, ...i18n.flatten(desktopRo) }
if (locale === "si") return { ...base, ...i18n.flatten(desktopSi) }
if (locale === "sk") return { ...base, ...i18n.flatten(desktopSk) }
if (locale === "sl") return { ...base, ...i18n.flatten(desktopSl) }
if (locale === "sq") return { ...base, ...i18n.flatten(desktopSq) }
if (locale === "sr") return { ...base, ...i18n.flatten(desktopSr) }
if (locale === "tg") return { ...base, ...i18n.flatten(desktopTg) }
if (locale === "tk") return { ...base, ...i18n.flatten(desktopTk) }
if (locale === "uz") return { ...base, ...i18n.flatten(desktopUz) }
return { ...base, ...i18n.flatten(desktopKo) }
}
const state = {
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Leita að uppfærslum...",
"desktop.menu.installCli": "Setja upp CLI...",
"desktop.menu.reloadWebview": "Endurhlaða Webview",
"desktop.menu.restart": "Endurræsa",
"desktop.dialog.chooseFolder": "Veldu möppu",
"desktop.dialog.chooseFile": "Veldu skrá",
"desktop.dialog.saveFile": "Vista skrá",
"desktop.updater.checkFailed.title": "Uppfærsluathugun mistókst",
"desktop.updater.checkFailed.message": "Mistókst að leita að uppfærslum",
"desktop.updater.none.title": "Engin uppfærsla í boði",
"desktop.updater.none.message": "Þú ert nú þegar að nota nýjustu útgáfuna af OpenCode",
"desktop.updater.downloadFailed.title": "Uppfærsla mistókst",
"desktop.updater.downloadFailed.message": "Mistókst að hlaða niður uppfærslu",
"desktop.updater.downloaded.title": "Uppfærslu hlaðið niður",
"desktop.updater.downloaded.prompt":
"Útgáfu {{version}} af OpenCode hefur verið hlaðið niður. Viltu setja hana upp og endurræsa?",
"desktop.updater.installFailed.title": "Uppfærsla mistókst",
"desktop.updater.installFailed.message": "Mistókst að setja upp uppfærslu",
"desktop.cli.installed.title": "CLI uppsett",
"desktop.cli.installed.message":
"CLI sett upp í {{path}}\n\nEndurræstu skjáherminn til að nota 'opencode' skipunina.",
"desktop.cli.failed.title": "Uppsetning mistókst",
"desktop.cli.failed.message": "Mistókst að setja upp CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Rótarþáttur fannst ekki. Gleymdirðu að bæta því við index.html þinn? Eða er id eigindin kannski rangt stafsett?",
}
+3
View File
@@ -22,4 +22,7 @@ export const dict = {
"CLI installata in {{path}}\n\nRiavvia il terminale per utilizzare il comando 'opencode'.",
"desktop.cli.failed.title": "Installazione non riuscita",
"desktop.cli.failed.message": "Impossibile installare la CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Elemento radice non trovato. Hai dimenticato di aggiungerlo al tuo index.html? O forse l'attributo id è stato scritto in modo errato?",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"CLI を {{path}} にインストールしました\n\nターミナルを再起動して 'opencode' コマンドを使用してください。",
"desktop.cli.failed.title": "インストールに失敗しました",
"desktop.cli.failed.message": "CLI のインストールに失敗しました: {{error}}",
"desktop.error.dev.rootNotFound":
"ルート要素が見つかりません。index.htmlに追加するのを忘れていませんか?またはid属性のスペルが間違っていませんか?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "შეამოწმეთ განახლებები...",
"desktop.menu.installCli": "დააინსტალირეთ CLI...",
"desktop.menu.reloadWebview": "გადატვირთვა Webview",
"desktop.menu.restart": "გადატვირთვა",
"desktop.dialog.chooseFolder": "აირჩიე საქაღალდე",
"desktop.dialog.chooseFile": "აირჩიე ფაილი",
"desktop.dialog.saveFile": "ფაილის შენახვა",
"desktop.updater.checkFailed.title": "განახლების შემოწმება ვერ მოხერხდა",
"desktop.updater.checkFailed.message": "განახლებების შემოწმება ვერ მოხერხდა",
"desktop.updater.none.title": "განახლება არ არის ხელმისაწვდომი",
"desktop.updater.none.message": "თქვენ უკვე იყენებთ OpenCode-ის უახლეს ვერსიას",
"desktop.updater.downloadFailed.title": "განახლება ვერ მოხერხდა",
"desktop.updater.downloadFailed.message": "განახლების ჩამოტვირთვა ვერ მოხერხდა",
"desktop.updater.downloaded.title": "განახლება ჩამოიტვირთა",
"desktop.updater.downloaded.prompt":
"OpenCode-ის {{version}} ვერსია ჩამოტვირთულია, გსურთ მისი ინსტალაცია და ხელახლა გაშვება?",
"desktop.updater.installFailed.title": "განახლება ვერ მოხერხდა",
"desktop.updater.installFailed.message": "განახლების დაყენება ვერ მოხერხდა",
"desktop.cli.installed.title": "CLI დაინსტალირებულია",
"desktop.cli.installed.message":
"CLI დაინსტალირებულია {{path}}-ზე\n\nგადატვირთეთ ტერმინალი „opencode“ ბრძანების გამოსაყენებლად.",
"desktop.cli.failed.title": "ინსტალაცია ვერ მოხერხდა",
"desktop.cli.failed.message": "ვერ დაინსტალირდა CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"ძირის ელემენტი ვერ მოიძებნა. დაგავიწყდათ მისი დამატება თქვენს index.html-ში? ან იქნებ id ატრიბუტი არასწორად არის დაწერილი?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "ពិនិត្យមើលបច្ចុប្បន្នភាព...",
"desktop.menu.installCli": "ដំឡើង CLI...",
"desktop.menu.reloadWebview": "ផ្ទុក Webview ឡើងវិញ",
"desktop.menu.restart": "ចាប់ផ្ដើមឡើងវិញ",
"desktop.dialog.chooseFolder": "ជ្រើសរើសថតឯកសារ",
"desktop.dialog.chooseFile": "ជ្រើសរើសឯកសារ",
"desktop.dialog.saveFile": "រក្សាទុកឯកសារ",
"desktop.updater.checkFailed.title": "ធីកអាប់ដេតបានបរាជ័យ",
"desktop.updater.checkFailed.message": "បានបរាជ័យក្នុងការពិនិត្យរកមើលបច្ចុប្បន្នភាព",
"desktop.updater.none.title": "មិនមានការអាប់ដេតទេ។",
"desktop.updater.none.message": "អ្នកកំពុងប្រើកំណែចុងក្រោយនៃ OpenCode រួចហើយ",
"desktop.updater.downloadFailed.title": "បរាជ័យក្នុងការអាប់ដេត",
"desktop.updater.downloadFailed.message": "បានបរាជ័យក្នុងការទាញយកបច្ចុប្បន្នភាព",
"desktop.updater.downloaded.title": "បានទាញយកបច្ចុប្បន្នភាព",
"desktop.updater.downloaded.prompt":
"កំណែ {{version}} នៃ OpenCode ត្រូវបានទាញយក តើអ្នកចង់ដំឡើងវា ហើយចាប់ផ្ដើមឡើងវិញទេ?",
"desktop.updater.installFailed.title": "ការអាប់ដេតបានបរាជ័យ",
"desktop.updater.installFailed.message": "បានបរាជ័យក្នុងការដំឡើងបច្ចុប្បន្នភាព",
"desktop.cli.installed.title": "CLI បានដំឡើង",
"desktop.cli.installed.message":
"CLI បានដំឡើងទៅ {{path}}\n\nចាប់ផ្តើមស្ថានីយរបស់អ្នកឡើងវិញ ដើម្បីប្រើពាក្យបញ្ជា 'opencode' ។",
"desktop.cli.failed.title": "ការដំឡើងបរាជ័យ",
"desktop.cli.failed.message": "បរាជ័យក្នុងការដំឡើង CLI៖ {{error}}",
"desktop.error.dev.rootNotFound":
"រកមិនឃើញធាតុឫសទេ។ តើអ្នកភ្លេចបន្ថែមវាទៅ index.html របស់អ្នកទេ? ឬប្រហែលជាគុណលក្ខណៈលេខសម្គាល់ត្រូវបានសរសេរខុស?",
}
+3
View File
@@ -24,4 +24,7 @@ export const dict = {
"CLI가 {{path}}에 설치되었습니다\n\n터미널을 다시 시작하여 'opencode' 명령을 사용하세요.",
"desktop.cli.failed.title": "설치 실패",
"desktop.cli.failed.message": "CLI 설치 실패: {{error}}",
"desktop.error.dev.rootNotFound":
"루트 요소를 찾을 수 없습니다. index.html에 추가하는 것을 잊으셨나요? 또는 id 속성의 철자가 틀렸을 수 있습니다.",
}
+27
View File
@@ -0,0 +1,27 @@
export const dict = {
"desktop.menu.checkForUpdates": "ກວດເບິ່ງການອັບເດດ...",
"desktop.menu.installCli": "ຕິດຕັ້ງ CLI...",
"desktop.menu.reloadWebview": "ໂຫຼດ Webview ຄືນໃໝ່",
"desktop.menu.restart": "ຣີສະຕາດ",
"desktop.dialog.chooseFolder": "ເລືອກໂຟນເດີ",
"desktop.dialog.chooseFile": "ເລືອກໄຟລ໌",
"desktop.dialog.saveFile": "ບັນທຶກໄຟລ໌",
"desktop.updater.checkFailed.title": "ກວດສອບການອັບເດດບໍ່ສຳເລັດ",
"desktop.updater.checkFailed.message": "ລົ້ມເຫລວໃນການກວດສອບການອັບເດດ",
"desktop.updater.none.title": "ບໍ່ມີການອັບເດດ",
"desktop.updater.none.message": "ທ່ານກຳລັງໃຊ້ OpenCode ເວີຊັນຫຼ້າສຸດຢູ່ແລ້ວ",
"desktop.updater.downloadFailed.title": "ການອັບເດດລົ້ມເຫລວ",
"desktop.updater.downloadFailed.message": "ລົ້ມເຫລວໃນການດາວໂຫຼດອັບເດດ",
"desktop.updater.downloaded.title": "ດາວໂຫຼດອັບເດດແລ້ວ",
"desktop.updater.downloaded.prompt":
"ເວີຊັນ {{version}} ຂອງ OpenCode ໄດ້ຖືກດາວໂຫຼດແລ້ວ, ທ່ານຕ້ອງການຕິດຕັ້ງມັນ ແລະເປີດຄືນໃໝ່ບໍ?",
"desktop.updater.installFailed.title": "ການອັບເດດລົ້ມເຫລວ",
"desktop.updater.installFailed.message": "ລົ້ມເຫລວໃນການຕິດຕັ້ງອັບເດດ",
"desktop.cli.installed.title": "CLI ຕິດຕັ້ງ",
"desktop.cli.installed.message": "ຕິດຕັ້ງ CLI ໄວ້ທີ່ {{path}}\n\nຣີສະຕາດເທີມິນອນເພື່ອໃຊ້ຄຳສັ່ງ 'opencode'.",
"desktop.cli.failed.title": "ການຕິດຕັ້ງລົ້ມເຫລວ",
"desktop.cli.failed.message": "ລົ້ມເຫລວໃນການຕິດຕັ້ງ CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"ບໍ່ພົບອົງປະກອບຮາກ. ທ່ານລືມເພີ່ມມັນໃສ່ index.html ຂອງທ່ານບໍ? ຫຼືບາງທີຄຸນສົມບັດ id ມີການສະກົດຜິດ?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Tikrinti, ar yra naujinimų...",
"desktop.menu.installCli": "Įdiegti CLI...",
"desktop.menu.reloadWebview": "Iš naujo įkelti Webview",
"desktop.menu.restart": "Paleisti iš naujo",
"desktop.dialog.chooseFolder": "Pasirinkite aplanką",
"desktop.dialog.chooseFile": "Pasirinkite failą",
"desktop.dialog.saveFile": "Išsaugoti failą",
"desktop.updater.checkFailed.title": "Naujinių patikrinti nepavyko",
"desktop.updater.checkFailed.message": "Nepavyko patikrinti, ar nėra naujinimų",
"desktop.updater.none.title": "Naujinių nėra",
"desktop.updater.none.message": "Jau naudojate naujausią OpenCode versiją",
"desktop.updater.downloadFailed.title": "Nepavyko atnaujinti",
"desktop.updater.downloadFailed.message": "Nepavyko atsisiųsti naujinimo",
"desktop.updater.downloaded.title": "Naujinimas parsiųstas",
"desktop.updater.downloaded.prompt":
"OpenCode versija {{version}} atsisiųsta, ar norėtumėte ją įdiegti ir paleisti iš naujo?",
"desktop.updater.installFailed.title": "Nepavyko atnaujinti",
"desktop.updater.installFailed.message": "Nepavyko įdiegti naujinimo",
"desktop.cli.installed.title": "CLI įdiegtas",
"desktop.cli.installed.message":
"CLI įdiegtas į {{path}}\n\nIš naujo paleiskite terminalą, kad galėtumėte naudoti komandą 'opencode'.",
"desktop.cli.failed.title": "Diegimas nepavyko",
"desktop.cli.failed.message": "Nepavyko įdiegti CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Šakninis elementas nerastas. Ar pamiršote jį įtraukti į index.html? O gal id atributas buvo neteisingai parašytas?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Pārbaudīt atjauninājumus...",
"desktop.menu.installCli": "Instalēt CLI...",
"desktop.menu.reloadWebview": "Pārlādēt tīmekļa skatu",
"desktop.menu.restart": "Restartēt",
"desktop.dialog.chooseFolder": "Izvēlieties mapi",
"desktop.dialog.chooseFile": "Izvēlieties failu",
"desktop.dialog.saveFile": "Saglabāt failu",
"desktop.updater.checkFailed.title": "Atjauninājumu pārbaude neizdevās",
"desktop.updater.checkFailed.message": "Neizdevās pārbaudīt atjauninājumus",
"desktop.updater.none.title": "Atjauninājumu nav",
"desktop.updater.none.message": "Jūs jau izmantojat jaunāko OpenCode versiju",
"desktop.updater.downloadFailed.title": "Atjaunināšana neizdevās",
"desktop.updater.downloadFailed.message": "Neizdevās lejupielādēt atjauninājumu",
"desktop.updater.downloaded.title": "Atjauninājums lejupielādēts",
"desktop.updater.downloaded.prompt":
"OpenCode versija {{version}} ir lejupielādēta. Vai vēlaties to instalēt un palaist no jauna?",
"desktop.updater.installFailed.title": "Atjaunināšana neizdevās",
"desktop.updater.installFailed.message": "Neizdevās instalēt atjauninājumu",
"desktop.cli.installed.title": "CLI instalēts",
"desktop.cli.installed.message":
"CLI instalēts uz {{path}}\n\nRestartējiet termināli, lai izmantotu komandu 'opencode'.",
"desktop.cli.failed.title": "Instalēšana neizdevās",
"desktop.cli.failed.message": "Neizdevās instalēt CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Saknes elements nav atrasts. Vai aizmirsāt to pievienot index.html? Vai arī id atribūts ir kļūdaini uzrakstīts?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Проверете дали има ажурирања...",
"desktop.menu.installCli": "Инсталирајте CLI...",
"desktop.menu.reloadWebview": "Вчитај повторно Webview",
"desktop.menu.restart": "Рестартирајте",
"desktop.dialog.chooseFolder": "Изберете папка",
"desktop.dialog.chooseFile": "Изберете датотека",
"desktop.dialog.saveFile": "Зачувај датотека",
"desktop.updater.checkFailed.title": "Проверката за ажурирање не успеа",
"desktop.updater.checkFailed.message": "Не успеа да се провери дали има ажурирања",
"desktop.updater.none.title": "Нема достапно ажурирање",
"desktop.updater.none.message": "Веќе ја користите најновата верзија на OpenCode",
"desktop.updater.downloadFailed.title": "Ажурирањето не успеа",
"desktop.updater.downloadFailed.message": "Не успеа да се преземе ажурирањето",
"desktop.updater.downloaded.title": "Ажурирањето е преземено",
"desktop.updater.downloaded.prompt":
"Верзијата {{version}} од OpenCode е преземена, дали сакате да ја инсталирате и повторно да ја стартувате?",
"desktop.updater.installFailed.title": "Ажурирањето не успеа",
"desktop.updater.installFailed.message": "Не успеа да се инсталира ажурирањето",
"desktop.cli.installed.title": "CLI Инсталиран",
"desktop.cli.installed.message":
"CLI инсталиран на {{path}}\n\nРестартирајте го терминалот за да ја користите командата „opencode“.",
"desktop.cli.failed.title": "Инсталирањето не успеа",
"desktop.cli.failed.message": "Не успеа да се инсталира CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Не е пронајден корен елемент. Дали заборавивте да го додадете во вашата index.html? Или можеби атрибутот id е погрешно напишан?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Шинэчлэлтүүдийг шалгана уу...",
"desktop.menu.installCli": "Суулгах CLI...",
"desktop.menu.reloadWebview": "Дахин ачаалах Webview",
"desktop.menu.restart": "Дахин эхлүүлэх",
"desktop.dialog.chooseFolder": "Фолдер сонгоно уу",
"desktop.dialog.chooseFile": "Файл сонгоно уу",
"desktop.dialog.saveFile": "Файлыг хадгалах",
"desktop.updater.checkFailed.title": "Шинэчлэх шалгалт амжилтгүй боллоо",
"desktop.updater.checkFailed.message": "Шинэчлэлтүүдийг шалгаж чадсангүй",
"desktop.updater.none.title": "Шинэчлэлт байхгүй",
"desktop.updater.none.message": "Та OpenCode-н хамгийн сүүлийн хувилбарыг аль хэдийн ашиглаж байна",
"desktop.updater.downloadFailed.title": "Шинэчилж чадсангүй",
"desktop.updater.downloadFailed.message": "Шинэчлэлтийг татаж авч чадсангүй",
"desktop.updater.downloaded.title": "Шинэчлэлтийг татаж авсан",
"desktop.updater.downloaded.prompt":
"OpenCode-ийн {{version}} хувилбарыг татаж авсан тул та үүнийг суулгаад дахин эхлүүлэхийг хүсэж байна уу?",
"desktop.updater.installFailed.title": "Шинэчилж чадсангүй",
"desktop.updater.installFailed.message": "Шинэчлэлтийг суулгаж чадсангүй",
"desktop.cli.installed.title": "CLI Суулгасан",
"desktop.cli.installed.message":
"CLI {{path}}-д суулгасан\n\n'opencode' командыг ашиглахын тулд терминалаа дахин эхлүүлнэ үү.",
"desktop.cli.failed.title": "Суулгалт амжилтгүй боллоо",
"desktop.cli.failed.message": "CLI суулгаж чадсангүй: {{error}}",
"desktop.error.dev.rootNotFound":
"Үндэс элемент олдсонгүй. Та үүнийг index.html дээрээ нэмэхээ мартсан уу? Эсвэл id атрибутыг буруу бичсэн байж магадгүй юм уу?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Semak Kemas Kini...",
"desktop.menu.installCli": "Pasang CLI...",
"desktop.menu.reloadWebview": "Muat Semula Paparan Web",
"desktop.menu.restart": "Mulakan Semula",
"desktop.dialog.chooseFolder": "Pilih folder",
"desktop.dialog.chooseFile": "Pilih fail",
"desktop.dialog.saveFile": "Simpan fail",
"desktop.updater.checkFailed.title": "Semakan Kemas Kini Gagal",
"desktop.updater.checkFailed.message": "Gagal menyemak kemas kini",
"desktop.updater.none.title": "Tiada Kemas Kini Tersedia",
"desktop.updater.none.message": "Anda sudah menggunakan versi terkini OpenCode",
"desktop.updater.downloadFailed.title": "Kemas Kini Gagal",
"desktop.updater.downloadFailed.message": "Gagal memuat turun kemas kini",
"desktop.updater.downloaded.title": "Kemas Kini Dimuat Turun",
"desktop.updater.downloaded.prompt":
"Versi {{version}} OpenCode telah dimuat turun, adakah anda ingin memasangnya dan melancarkan semula?",
"desktop.updater.installFailed.title": "Kemas Kini Gagal",
"desktop.updater.installFailed.message": "Gagal memasang kemas kini",
"desktop.cli.installed.title": "CLI Dipasang",
"desktop.cli.installed.message":
"CLI telah dipasang ke {{path}}\n\nMulakan semula terminal anda untuk menggunakan arahan 'opencode'.",
"desktop.cli.failed.title": "Pemasangan Gagal",
"desktop.cli.failed.message": "Gagal memasang CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Elemen root tidak ditemui. Adakah anda terlupa menambahnya ke index.html anda? Atau mungkin atribut id telah tersalah eja?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "အပ်ဒိတ်များအတွက် စစ်ဆေးပါ...",
"desktop.menu.installCli": "CLI ကို ထည့်သွင်းပါ...",
"desktop.menu.reloadWebview": "Webview ကို ပြန်လည်စတင်ပါ။",
"desktop.menu.restart": "ပြန်လည်စတင်ပါ။",
"desktop.dialog.chooseFolder": "ဖိုင်တွဲတစ်ခုကို ရွေးပါ။",
"desktop.dialog.chooseFile": "ဖိုင်တစ်ခုကို ရွေးပါ။",
"desktop.dialog.saveFile": "ဖိုင်ကို သိမ်းဆည်းပါ။",
"desktop.updater.checkFailed.title": "အပ်ဒိတ်စစ်ဆေးမှု မအောင်မြင်ပါ။",
"desktop.updater.checkFailed.message": "အပ်ဒိတ်များကို စစ်ဆေးရန် မအောင်မြင်ပါ။",
"desktop.updater.none.title": "အပ်ဒိတ် မရနိုင်ပါ။",
"desktop.updater.none.message": "သင်သည် OpenCode ၏နောက်ဆုံးထွက်ဗားရှင်းကို အသုံးပြုနေပြီဖြစ်သည်။",
"desktop.updater.downloadFailed.title": "အပ်ဒိတ် မအောင်မြင်ပါ။",
"desktop.updater.downloadFailed.message": "အပ်ဒိတ်ကို ဒေါင်းလုဒ်လုပ်ရန် မအောင်မြင်ပါ။",
"desktop.updater.downloaded.title": "အပ်ဒိတ်ကို ဒေါင်းလုဒ်လုပ်ထားသည်။",
"desktop.updater.downloaded.prompt":
"OpenCode ၏ {{version}} ဗားရှင်းကို ဒေါင်းလုဒ်လုပ်ပြီးပြီ၊ ၎င်းကို ထည့်သွင်းပြီး ပြန်လည်စတင်လိုပါသလား။",
"desktop.updater.installFailed.title": "အပ်ဒိတ် မအောင်မြင်ပါ။",
"desktop.updater.installFailed.message": "အပ်ဒိတ်ကို ထည့်သွင်းရန် မအောင်မြင်ပါ။",
"desktop.cli.installed.title": "CLI ထည့်သွင်းထားသည်။",
"desktop.cli.installed.message":
"CLI ကို {{path}} တွင် ထည့်သွင်းထားသည်။\n\n'opencode' ကွန်မန်းကို အသုံးပြုရန် Terminal ကို ပြန်လည်စတင်ပါ။",
"desktop.cli.failed.title": "ထည့်သွင်းခြင်း မအောင်မြင်ပါ။",
"desktop.cli.failed.message": "CLI- {{error}} ကို ထည့်သွင်းရန် မအောင်မြင်ပါ။",
"desktop.error.dev.rootNotFound":
"အမြစ်ဒြပ်စင်ကို ရှာမတွေ့ပါ။ ၎င်းကို သင်၏ index.html တွင် ထည့်ရန် မေ့သွားပါသလား။ ဒါမှမဟုတ် id attribute က စာလုံးပေါင်းမှားနေသလား။",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict: Record<string, string> = {
"desktop.menu.checkForUpdates": "अपडेटहरूको लागि जाँच गर्नुहोस्...",
"desktop.menu.installCli": "स्थापना गर्नुहोस् CLI...",
"desktop.menu.reloadWebview": "Webview पुन: लोड गर्नुहोस्",
"desktop.menu.restart": "पुन: सुरु गर्नुहोस्",
"desktop.dialog.chooseFolder": "एउटा फोल्डर छान्नुहोस्",
"desktop.dialog.chooseFile": "एउटा फाइल छान्नुहोस्",
"desktop.dialog.saveFile": "फाइल बचत गर्नुहोस्",
"desktop.updater.checkFailed.title": "अपडेट जाँच असफल भयो",
"desktop.updater.checkFailed.message": "अद्यावधिकहरूको लागि जाँच गर्न असफल भयो",
"desktop.updater.none.title": "कुनै अद्यावधिक उपलब्ध छैन",
"desktop.updater.none.message": "तपाईंले पहिले नै OpenCode को नवीनतम संस्करण प्रयोग गरिरहनुभएको छ",
"desktop.updater.downloadFailed.title": "अपडेट गर्न सकिएन",
"desktop.updater.downloadFailed.message": "अपडेट डाउनलोड गर्न असफल भयो",
"desktop.updater.downloaded.title": "अपडेट डाउनलोड गरियो",
"desktop.updater.downloaded.prompt":
"OpenCode को संस्करण {{version}} डाउनलोड गरिएको छ, के तपाइँ यसलाई स्थापना गरेर पुन: लन्च गर्न चाहनुहुन्छ?",
"desktop.updater.installFailed.title": "अपडेट गर्न सकिएन",
"desktop.updater.installFailed.message": "अद्यावधिक स्थापना गर्न असफल भयो",
"desktop.cli.installed.title": "CLI स्थापना गरियो",
"desktop.cli.installed.message":
"CLI {{path}} मा स्थापना गरियो\n\n'opencode' आदेश प्रयोग गर्न आफ्नो टर्मिनल पुन: सुरु गर्नुहोस्।",
"desktop.cli.failed.title": "स्थापना असफल भयो",
"desktop.cli.failed.message": "CLI स्थापना गर्न असफल: {{error}}",
"desktop.error.dev.rootNotFound":
"मूल तत्व फेला परेन। के तपाईंले यसलाई आफ्नो index.html मा थप्न बिर्सनुभयो? वा हुनसक्छ आईडी विशेषता गलत हिज्जे भयो?",
}
+3
View File
@@ -22,4 +22,7 @@ export const dict = {
"CLI geïnstalleerd op {{path}}\n\nStart je terminal opnieuw om de opdracht 'opencode' te gebruiken.",
"desktop.cli.failed.title": "Installatie mislukt",
"desktop.cli.failed.message": "Installeren van CLI is mislukt: {{error}}",
"desktop.error.dev.rootNotFound":
"Root-element niet gevonden. Ben je vergeten het toe te voegen aan je index.html? Of is het id-attribuut misschien verkeerd gespeld?",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"CLI installert i {{path}}\n\nStart terminalen på nytt for å bruke 'opencode'-kommandoen.",
"desktop.cli.failed.title": "Installasjon mislyktes",
"desktop.cli.failed.message": "Kunne ikke installere CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Rotelement ikke funnet. Glemte du å legge det til i index.html? Eller kanskje id-attributtet er feilstavet?",
}
+3
View File
@@ -22,4 +22,7 @@ export const dict = {
"CLI {{path}} تے انسٹال کیتا گیا\n\n'opencode' کمانڈ ورتن لئی اپنے ٹرمینل نوں دوبارہ شروع کرو۔",
"desktop.cli.failed.title": "تنصیب ناکام ہو گئی",
"desktop.cli.failed.message": "CLI انسٹال نئیں ہو سکی: {{error}}",
"desktop.error.dev.rootNotFound":
"عنصر نئیں لبیا۔ کی تسی ایہنوں اپنے index.html چ شامل کرنا بھل گئے او؟ یا شاید id وصف غلط ہجے ہو گیا اے؟",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"Interfejs CLI zainstalowano w {{path}}\n\nUruchom ponownie terminal, aby użyć polecenia „opencode”.",
"desktop.cli.failed.title": "Instalacja nie powiodła się",
"desktop.cli.failed.message": "Nie udało się zainstalować CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Nie znaleziono elementu głównego. Czy zapomniałeś dodać go do swojego index.html? A może atrybut id został błędnie wpisany?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Caută actualizări...",
"desktop.menu.installCli": "Instalează CLI...",
"desktop.menu.reloadWebview": "Reîncarcă webview",
"desktop.menu.restart": "Repornește",
"desktop.dialog.chooseFolder": "Alege un folder",
"desktop.dialog.chooseFile": "Alege un fișier",
"desktop.dialog.saveFile": "Salvează fișierul",
"desktop.updater.checkFailed.title": "Verificarea actualizărilor a eșuat",
"desktop.updater.checkFailed.message": "Nu s-au putut verifica actualizările",
"desktop.updater.none.title": "Nicio actualizare disponibilă",
"desktop.updater.none.message": "Folosești deja cea mai recentă versiune OpenCode",
"desktop.updater.downloadFailed.title": "Actualizarea a eșuat",
"desktop.updater.downloadFailed.message": "Nu s-a putut descărca actualizarea",
"desktop.updater.downloaded.title": "Actualizare descărcată",
"desktop.updater.downloaded.prompt":
"Versiunea {{version}} OpenCode a fost descărcată. Vrei să o instalezi și să repornești?",
"desktop.updater.installFailed.title": "Actualizarea a eșuat",
"desktop.updater.installFailed.message": "Nu s-a putut instala actualizarea",
"desktop.cli.installed.title": "CLI instalat",
"desktop.cli.installed.message":
"CLI a fost instalat în {{path}}\n\nRepornește terminalul pentru a folosi comanda 'opencode'.",
"desktop.cli.failed.title": "Instalarea a eșuat",
"desktop.cli.failed.message": "Nu s-a putut instala CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Elementul root nu a fost găsit. L-ai adăugat în index.html? Sau poate atributul id este scris greșit?",
}
+3
View File
@@ -24,4 +24,7 @@ export const dict = {
"CLI установлен в {{path}}\n\nПерезапустите терминал, чтобы использовать команду 'opencode'.",
"desktop.cli.failed.title": "Ошибка установки",
"desktop.cli.failed.message": "Не удалось установить CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Корневой элемент не найден. Вы забыли добавить его в index.html? Или, может быть, атрибут id был написан неправильно?",
}
+27
View File
@@ -0,0 +1,27 @@
export const dict: Record<string, string> = {
"desktop.menu.checkForUpdates": "යාවත්කාලීන සඳහා පරීක්ෂා කරන්න...",
"desktop.menu.installCli": "CLI ස්ථාපනය කරන්න...",
"desktop.menu.reloadWebview": "Webview නැවත පූරණය කරන්න",
"desktop.menu.restart": "යළි අරඹන්න",
"desktop.dialog.chooseFolder": "ෆෝල්ඩරයක් තෝරන්න",
"desktop.dialog.chooseFile": "ගොනුවක් තෝරන්න",
"desktop.dialog.saveFile": "ගොනුව සුරකින්න",
"desktop.updater.checkFailed.title": "යාවත්කාලීන පරීක්ෂාව අසාර්ථක විය",
"desktop.updater.checkFailed.message": "යාවත්කාලීන සඳහා පරීක්ෂා කිරීමට අසමත් විය",
"desktop.updater.none.title": "යාවත්කාලීනයක් නොමැත",
"desktop.updater.none.message": "ඔබ දැනටමත් OpenCode හි නවතම අනුවාදය භාවිතා කරයි",
"desktop.updater.downloadFailed.title": "යාවත්කාලීන කිරීම අසාර්ථක විය",
"desktop.updater.downloadFailed.message": "යාවත්කාලීන බාගැනීම අසාර්ථක විය",
"desktop.updater.downloaded.title": "යාවත්කාලීනය බාගත කර ඇත",
"desktop.updater.downloaded.prompt":
"OpenCode හි {{version}} අනුවාදය බාගෙන ඇත, ඔබ එය ස්ථාපනය කර නැවත දියත් කිරීමට කැමතිද?",
"desktop.updater.installFailed.title": "යාවත්කාලීන කිරීම අසාර්ථක විය",
"desktop.updater.installFailed.message": "යාවත්කාලීන ස්ථාපනය කිරීමට අසමත් විය",
"desktop.cli.installed.title": "CLI ස්ථාපනය කර ඇත",
"desktop.cli.installed.message": "CLI {{path}}\n\n'opencode' විධානය භාවිතා කිරීමට ඔබගේ ටර්මිනලය නැවත ආරම්භ කරන්න.",
"desktop.cli.failed.title": "ස්ථාපනය අසාර්ථක විය",
"desktop.cli.failed.message": "CLI ස්ථාපනය කිරීමට අසමත් විය: {{error}}",
"desktop.error.dev.rootNotFound":
"මූල මූලද්රව්යය හමු නොවීය. ඔබට එය ඔබගේ index.html වෙත එක් කිරීමට අමතකද? එසේත් නැතිනම් හැඳුනුම්පත වැරදි ලෙස සටහන් වී තිබේද?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Skontrolovať aktualizácie...",
"desktop.menu.installCli": "Inštalovať CLI...",
"desktop.menu.reloadWebview": "Obnoviť webové zobrazenie",
"desktop.menu.restart": "Reštartovať",
"desktop.dialog.chooseFolder": "Vybrať priečinok",
"desktop.dialog.chooseFile": "Vybrať súbor",
"desktop.dialog.saveFile": "Uložiť súbor",
"desktop.updater.checkFailed.title": "Kontrola aktualizácií zlyhala",
"desktop.updater.checkFailed.message": "Nepodarilo sa skontrolovať aktualizácie",
"desktop.updater.none.title": "Žiadna aktualizácia nie je k dispozícii",
"desktop.updater.none.message": "Používate najnovšiu verziu OpenCode",
"desktop.updater.downloadFailed.title": "Aktualizácia zlyhala",
"desktop.updater.downloadFailed.message": "Nepodarilo sa stiahnuť aktualizáciu",
"desktop.updater.downloaded.title": "Aktualizácia stiahnutá",
"desktop.updater.downloaded.prompt":
"Verzia {{version}} OpenCode bola stiahnutá. Chcete ju nainštalovať a reštartovať?",
"desktop.updater.installFailed.title": "Aktualizácia zlyhala",
"desktop.updater.installFailed.message": "Nepodarilo sa nainštalovať aktualizáciu",
"desktop.cli.installed.title": "CLI nainštalované",
"desktop.cli.installed.message":
"CLI bolo nainštalované do {{path}}\n\nReštartujte terminál, aby ste mohli používať príkaz 'opencode'.",
"desktop.cli.failed.title": "Inštalácia zlyhala",
"desktop.cli.failed.message": "Nepodarilo sa nainštalovať CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Koreňový prvok sa nenašiel. Pridali ste ho do index.html? Alebo je atribút id napísaný nesprávne?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Preverite posodobitve ...",
"desktop.menu.installCli": "Namestite CLI...",
"desktop.menu.reloadWebview": "Ponovno naloži Webview",
"desktop.menu.restart": "Znova zaženite",
"desktop.dialog.chooseFolder": "Izberite mapo",
"desktop.dialog.chooseFile": "Izberite datoteko",
"desktop.dialog.saveFile": "Shrani datoteko",
"desktop.updater.checkFailed.title": "Preverjanje posodobitve ni uspelo",
"desktop.updater.checkFailed.message": "Preverjanje posodobitev ni uspelo",
"desktop.updater.none.title": "Posodobitev ni na voljo",
"desktop.updater.none.message": "Že uporabljate najnovejšo različico OpenCode",
"desktop.updater.downloadFailed.title": "Posodobitev ni uspela",
"desktop.updater.downloadFailed.message": "Prenos posodobitve ni uspel",
"desktop.updater.downloaded.title": "Posodobitev prenesena",
"desktop.updater.downloaded.prompt":
"Različica {{version}} OpenCode je bila prenesena, jo želite namestiti in znova zagnati?",
"desktop.updater.installFailed.title": "Posodobitev ni uspela",
"desktop.updater.installFailed.message": "Namestitev posodobitve ni uspela",
"desktop.cli.installed.title": "CLI je nameščen",
"desktop.cli.installed.message":
"CLI je nameščen v {{path}}\n\nZnova zaženite terminal, da lahko uporabite ukaz 'opencode'.",
"desktop.cli.failed.title": "Namestitev ni uspela",
"desktop.cli.failed.message": "Namestitev CLI ni uspela: {{error}}",
"desktop.error.dev.rootNotFound":
"Korenski element ni bil najden. Ste ga pozabili dodati v svoj index.html? Ali pa je morda atribut id narobe črkovan?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Kontrollo për përditësime...",
"desktop.menu.installCli": "Instalo CLI...",
"desktop.menu.reloadWebview": "Rifresko pamjen e internetit",
"desktop.menu.restart": "Rinis",
"desktop.dialog.chooseFolder": "Zgjidhni një dosje",
"desktop.dialog.chooseFile": "Zgjidhni një skedar",
"desktop.dialog.saveFile": "Ruaj skedarin",
"desktop.updater.checkFailed.title": "Kontrolli i përditësimit dështoi",
"desktop.updater.checkFailed.message": "Kontrolli për përditësime dështoi",
"desktop.updater.none.title": "Nuk ka përditësim të disponueshëm",
"desktop.updater.none.message": "Ju tashmë po përdorni versionin më të fundit të OpenCode",
"desktop.updater.downloadFailed.title": "Përditësimi dështoi",
"desktop.updater.downloadFailed.message": "Shkarkimi i përditësimit dështoi",
"desktop.updater.downloaded.title": "Përditësimi u shkarkua",
"desktop.updater.downloaded.prompt":
"Versioni {{version}} i OpenCode është shkarkuar, dëshironi ta instaloni dhe rinisni?",
"desktop.updater.installFailed.title": "Përditësimi dështoi",
"desktop.updater.installFailed.message": "Instalimi i përditësimit dështoi",
"desktop.cli.installed.title": "CLI i instaluar",
"desktop.cli.installed.message":
"CLI është instaluar në {{path}}\n\nRinisni terminalin tuaj për të përdorur komandën 'opencode'.",
"desktop.cli.failed.title": "Instalimi dështoi",
"desktop.cli.failed.message": "Instalimi i CLI dështoi: {{error}}",
"desktop.error.dev.rootNotFound":
"Elementi rrënjë nuk u gjet. A keni harruar ta shtoni atë në index.html tuaj? Apo ndoshta atributi id është shkruar gabim?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Проверите да ли постоје ажурирања...",
"desktop.menu.installCli": "Инсталирај CLI...",
"desktop.menu.reloadWebview": "Поново учитај Webview",
"desktop.menu.restart": "Поново покрените",
"desktop.dialog.chooseFolder": "Изаберите фасциклу",
"desktop.dialog.chooseFile": "Изаберите датотеку",
"desktop.dialog.saveFile": "Сачувај датотеку",
"desktop.updater.checkFailed.title": "Провера ажурирања није успела",
"desktop.updater.checkFailed.message": "Провера ажурирања није успела",
"desktop.updater.none.title": "Ажурирање није доступно",
"desktop.updater.none.message": "Већ користите најновију верзију OpenCode",
"desktop.updater.downloadFailed.title": "Ажурирање није успело",
"desktop.updater.downloadFailed.message": "Преузимање ажурирања није успело",
"desktop.updater.downloaded.title": "Преузето ажурирање",
"desktop.updater.downloaded.prompt":
"Верзија {{version}} од OpenCode је преузета, да ли желите да је инсталирате и поново покренете?",
"desktop.updater.installFailed.title": "Ажурирање није успело",
"desktop.updater.installFailed.message": "Инсталација ажурирања није успела",
"desktop.cli.installed.title": "CLI Инсталиран",
"desktop.cli.installed.message":
"CLI инсталиран на {{path}}\n\nПоново покрените терминал да бисте користили команду 'opencode'.",
"desktop.cli.failed.title": "Инсталација није успела",
"desktop.cli.failed.message": "Инсталација CLI-ја није успела: {{error}}",
"desktop.error.dev.rootNotFound":
"Основни елемент није пронађен. Да ли сте заборавили да га додате у свој index.html? Или је можда атрибут ид погрешно написан?",
}
+3
View File
@@ -22,4 +22,7 @@ export const dict = {
"CLI installerat i {{path}}\n\nStarta om terminalen för att använda kommandot 'opencode'.",
"desktop.cli.failed.title": "Installationen misslyckades",
"desktop.cli.failed.message": "Det gick inte att installera CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Rotelementet hittades inte. Har du glömt att lägga till det i din index.html? Eller kanske id-attributet är felstavat?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Навсозиро санҷед...",
"desktop.menu.installCli": "Насб кунед CLI...",
"desktop.menu.reloadWebview": "Аз нав бор кунед Webview",
"desktop.menu.restart": "Оғози дубора",
"desktop.dialog.chooseFolder": "Папкаро интихоб кунед",
"desktop.dialog.chooseFile": "Файлро интихоб кунед",
"desktop.dialog.saveFile": "Файлро захира кунед",
"desktop.updater.checkFailed.title": "Санҷиши навсозӣ иҷро нашуд",
"desktop.updater.checkFailed.message": "Санҷиши навсозиҳо муяссар нашуд",
"desktop.updater.none.title": "Навсозии дастрас нест",
"desktop.updater.none.message": "Шумо аллакай версияи охирини OpenCode-ро истифода мебаред",
"desktop.updater.downloadFailed.title": "Навсозӣ ноком шуд",
"desktop.updater.downloadFailed.message": "Боргирии навсозӣ муваффақ нашуд",
"desktop.updater.downloaded.title": "Навсозии зеркашӣ",
"desktop.updater.downloaded.prompt":
"Версияи {{version}} аз OpenCode зеркашӣ карда шуд, оё шумо мехоҳед онро насб кунед ва аз нав оғоз кунед?",
"desktop.updater.installFailed.title": "Навсозӣ ноком шуд",
"desktop.updater.installFailed.message": "Навсозӣ насб карда нашуд",
"desktop.cli.installed.title": "CLI насб карда шуд",
"desktop.cli.installed.message":
"CLI ба {{path}} насб карда шудааст\n\nБарои истифодаи фармони 'opencode' терминали худро аз нав оғоз кунед.",
"desktop.cli.failed.title": "Насб карда нашуд",
"desktop.cli.failed.message": "Насб карда нашуд CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Элементи решавӣ ёфт нашуд. Оё шумо онро ба index.html илова карданро фаромӯш кардаед? Ё шояд атрибути id хато навишта шудааст?",
}
+2
View File
@@ -24,4 +24,6 @@ export const dict = {
"desktop.cli.installed.message": "ติดตั้ง CLI ที่ {{path}} แล้ว\n\nเริ่มเทอร์มินัลใหม่เพื่อใช้คำสั่ง 'opencode'",
"desktop.cli.failed.title": "การติดตั้งล้มเหลว",
"desktop.cli.failed.message": "ไม่สามารถติดตั้ง CLI ได้: {{error}}",
"desktop.error.dev.rootNotFound": "ไม่พบองค์ประกอบรูท คุณลืมเพิ่มใน index.html หรือบางทีแอตทริบิวต์ id อาจสะกดผิด?",
}
+28
View File
@@ -0,0 +1,28 @@
export const dict = {
"desktop.menu.checkForUpdates": "Täzelenmeleri barlaň ...",
"desktop.menu.installCli": "CLI guruň ...",
"desktop.menu.reloadWebview": "Web sahypasyny täzeden ýükläň",
"desktop.menu.restart": "Gaýtadan açyň",
"desktop.dialog.chooseFolder": "Papka saýlaň",
"desktop.dialog.chooseFile": "Faýl saýlaň",
"desktop.dialog.saveFile": "Faýly ýazdyryň",
"desktop.updater.checkFailed.title": "Täzelenme şowsuz",
"desktop.updater.checkFailed.message": "Täzelenmeleri barlap bilmedi",
"desktop.updater.none.title": "Täzelenme ýok",
"desktop.updater.none.message": "OpenCode-iň iň soňky wersiýasyny eýýäm ulanýarsyňyz",
"desktop.updater.downloadFailed.title": "Täzelenme şowsuz",
"desktop.updater.downloadFailed.message": "Täzelenmäni göçürip alyp bilmedi",
"desktop.updater.downloaded.title": "Täzelenme ýüklendi",
"desktop.updater.downloaded.prompt":
"OpenCode-iň {{version}} wersiýasy göçürildi, ony gurup täzeden işletmek isleýärsiňizmi?",
"desktop.updater.installFailed.title": "Täzelenme şowsuz",
"desktop.updater.installFailed.message": "Täzelenmäni gurup bilmedi",
"desktop.cli.installed.title": "CLI Guruldy",
"desktop.cli.installed.message":
"CLI {{path}} salgysyna guruldy\n\n'opencode' buýrugyny ulanmak üçin terminalyňyzy täzeden açyň.",
"desktop.cli.failed.title": "Gurmak şowsuz",
"desktop.cli.failed.message": "CLI gurup bilmedi: {{error}}",
"desktop.error.dev.rootNotFound":
"Kök elementi tapylmady index.html-e goşmagy ýatdan çykardyňyzmy? Ora-da id atributynyň ýalňyş ýazylan bolmagy mümkin?",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"CLI {{path}} konumuna yüklendi\n\n'opencode' komutunu kullanmak için terminalinizi yeniden başlatın.",
"desktop.cli.failed.title": "Yükleme başarısız oldu",
"desktop.cli.failed.message": "CLI yüklenemedi: {{error}}",
"desktop.error.dev.rootNotFound":
"Kök eleman bulunamadı. index.html dosyanıza eklemeyi unuttunuz mu? Ya da id özelliği yanlış mı yazıldı?",
}
+3
View File
@@ -25,4 +25,7 @@ export const dict = {
"CLI встановлено за шляхом {{path}}\n\nПерезапустіть термінал, щоб використовувати команду 'opencode'.",
"desktop.cli.failed.title": "Не вдалося встановити",
"desktop.cli.failed.message": "Не вдалося встановити CLI: {{error}}",
"desktop.error.dev.rootNotFound":
"Кореневий елемент не знайдено. Ви забули додати його до index.html? Або, можливо, атрибут id було написано з помилкою?",
}
+3
View File
@@ -22,4 +22,7 @@ export const dict = {
"CLI کو {{path}} پر انسٹال کر دیا گیا۔\n\n'opencode' کمانڈ استعمال کرنے کے لیے اپنا ٹرمینل دوبارہ شروع کریں۔",
"desktop.cli.failed.title": "تنصیب ناکام ہو گئی۔",
"desktop.cli.failed.message": "CLI انسٹال کرنے میں ناکام: {{error}}",
"desktop.error.dev.rootNotFound":
"روٹ عنصر نہیں ملا۔ کیا آپ اسے اپنے index.html میں شامل کرنا بھول گئے؟ یا ہو سکتا ہے کہ آئی ڈی وصف کی ہجے غلط ہو گئی ہو؟",
}

Some files were not shown because too many files have changed in this diff Show More