From 6490fb01489bfa5644349d650f978c80d0ab7365 Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Sun, 8 Feb 2026 16:21:59 -0600 Subject: [PATCH] fix(console): zen workspace translation cleanup --- packages/console/app/src/i18n/ar.ts | 64 +++++++------- packages/console/app/src/i18n/da.ts | 66 +++++++------- packages/console/app/src/i18n/de.ts | 68 +++++++------- packages/console/app/src/i18n/it.ts | 50 +++++------ packages/console/app/src/i18n/zh.ts | 94 ++++++++++---------- packages/console/app/src/i18n/zht.ts | 94 ++++++++++---------- specs/19-workspace-i18n-audit-overview.md | 76 ++++++++++++++++ specs/20-workspace-i18n-audit-ar.md | 99 +++++++++++++++++++++ specs/21-workspace-i18n-audit-da.md | 103 ++++++++++++++++++++++ specs/22-workspace-i18n-audit-de.md | 95 ++++++++++++++++++++ specs/23-workspace-i18n-audit-it.md | 86 ++++++++++++++++++ 11 files changed, 677 insertions(+), 218 deletions(-) create mode 100644 specs/19-workspace-i18n-audit-overview.md create mode 100644 specs/20-workspace-i18n-audit-ar.md create mode 100644 specs/21-workspace-i18n-audit-da.md create mode 100644 specs/22-workspace-i18n-audit-de.md create mode 100644 specs/23-workspace-i18n-audit-it.md diff --git a/packages/console/app/src/i18n/ar.ts b/packages/console/app/src/i18n/ar.ts index 8ba7c37e2..4e3206715 100644 --- a/packages/console/app/src/i18n/ar.ts +++ b/packages/console/app/src/i18n/ar.ts @@ -351,8 +351,8 @@ export const dict = { "changelog.empty": "\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0623\u064a \u0625\u062f\u062e\u0627\u0644\u0627\u062a \u0641\u064a \u0633\u062c\u0644 \u0627\u0644\u062a\u063a\u064a\u064a\u0631\u0627\u062a.", "changelog.viewJson": "\u0639\u0631\u0636 JSON", - "workspace.nav.zen": "زين", - "workspace.nav.apiKeys": "API المفاتيح", + "workspace.nav.zen": "Zen", + "workspace.nav.apiKeys": "مفاتيح API", "workspace.nav.members": "أعضاء", "workspace.nav.billing": "الفواتير", "workspace.nav.settings": "إعدادات", @@ -365,14 +365,14 @@ export const dict = { "workspace.newUser.feature.quality.title": "أعلى جودة", "workspace.newUser.feature.quality.body": "الوصول إلى النماذج التي تم تكوينها لتحقيق الأداء الأمثل - لا يوجد تخفيضات أو توجيه إلى موفري الخدمة الأرخص.", - "workspace.newUser.feature.lockin.title": "لا يوجد قفل", + "workspace.newUser.feature.lockin.title": "بدون احتجاز بمزوّد واحد", "workspace.newUser.feature.lockin.body": "استخدم Zen مع أي وكيل ترميز، واستمر في استخدام موفري الخدمات الآخرين مع opencode وقتما تشاء.", "workspace.newUser.copyApiKey": "انسخ مفتاح API", "workspace.newUser.copyKey": "نسخ المفتاح", "workspace.newUser.copied": "منسوخ!", "workspace.newUser.step.enableBilling": "تمكين الفوترة", - "workspace.newUser.step.login.before": "يجري", + "workspace.newUser.step.login.before": "شغّل", "workspace.newUser.step.login.after": "وحدد opencode", "workspace.newUser.step.pasteKey": "الصق مفتاح API الخاص بك", "workspace.newUser.step.models.before": "ابدأ opencode ثم قم بالتشغيل", @@ -390,7 +390,7 @@ export const dict = { "workspace.providers.saving": "توفير...", "workspace.providers.save": "يحفظ", "workspace.providers.table.provider": "مزود", - "workspace.providers.table.apiKey": "API المفتاح", + "workspace.providers.table.apiKey": "مفتاح API", "workspace.usage.title": "تاريخ الاستخدام", "workspace.usage.subtitle": "استخدام وتكاليف API الأخيرة.", "workspace.usage.empty": "قم بإجراء أول مكالمة API للبدء.", @@ -398,25 +398,25 @@ export const dict = { "workspace.usage.table.model": "نموذج", "workspace.usage.table.input": "مدخل", "workspace.usage.table.output": "الإخراج", - "workspace.usage.table.cost": "يكلف", + "workspace.usage.table.cost": "التكلفة", "workspace.usage.breakdown.input": "مدخل", "workspace.usage.breakdown.cacheRead": "قراءة ذاكرة التخزين المؤقت", "workspace.usage.breakdown.cacheWrite": "كتابة ذاكرة التخزين المؤقت", "workspace.usage.breakdown.output": "الإخراج", "workspace.usage.breakdown.reasoning": "المنطق", "workspace.usage.subscription": "الاشتراك (${{amount}})", - "workspace.cost.title": "يكلف", + "workspace.cost.title": "التكلفة", "workspace.cost.subtitle": "تكاليف الاستخدام مقسمة حسب النموذج.", - "workspace.cost.allModels": "جميع الموديلات", + "workspace.cost.allModels": "جميع النماذج", "workspace.cost.allKeys": "جميع المفاتيح", "workspace.cost.deletedSuffix": "(محذوف)", "workspace.cost.empty": "لا توجد بيانات استخدام متاحة للفترة المحددة.", - "workspace.cost.subscriptionShort": "الفرعية", - "workspace.keys.title": "API المفاتيح", + "workspace.cost.subscriptionShort": "اشتراك", + "workspace.keys.title": "مفاتيح API", "workspace.keys.subtitle": "إدارة مفاتيح API الخاصة بك للوصول إلى خدمات opencode.", "workspace.keys.create": "قم بإنشاء مفتاح API", "workspace.keys.placeholder": "أدخل اسم المفتاح", - "workspace.keys.empty": "قم بإنشاء مفتاح opencode للبوابة API", + "workspace.keys.empty": "أنشئ مفتاح API لبوابة opencode", "workspace.keys.table.name": "اسم", "workspace.keys.table.key": "مفتاح", "workspace.keys.table.createdBy": "تم الإنشاء بواسطة", @@ -442,14 +442,14 @@ export const dict = { "workspace.members.table.email": "بريد إلكتروني", "workspace.members.table.role": "دور", "workspace.members.table.monthLimit": "حد الشهر", - "workspace.members.role.admin": "مسؤل", + "workspace.members.role.admin": "مسؤول", "workspace.members.role.adminDescription": "يمكن إدارة النماذج، والأعضاء، والفواتير", "workspace.members.role.member": "عضو", "workspace.members.role.memberDescription": "يمكنهم فقط إنشاء مفاتيح API لأنفسهم", "workspace.settings.title": "إعدادات", "workspace.settings.subtitle": "قم بتحديث اسم مساحة العمل الخاصة بك وتفضيلاتك.", "workspace.settings.workspaceName": "اسم مساحة العمل", - "workspace.settings.defaultName": "تقصير", + "workspace.settings.defaultName": "الافتراضي", "workspace.settings.updating": "جارٍ التحديث...", "workspace.settings.save": "يحفظ", "workspace.settings.edit": "يحرر", @@ -461,37 +461,37 @@ export const dict = { "workspace.billing.add": "أضف $", "workspace.billing.enterAmount": "أدخل المبلغ", "workspace.billing.loading": "تحميل...", - "workspace.billing.addAction": "يضيف", + "workspace.billing.addAction": "إضافة", "workspace.billing.addBalance": "إضافة الرصيد", - "workspace.billing.linkedToStripe": "مرتبطة بالشريط", - "workspace.billing.manage": "يدير", + "workspace.billing.linkedToStripe": "مرتبط بـ Stripe", + "workspace.billing.manage": "إدارة", "workspace.billing.enable": "تمكين الفوترة", "workspace.monthlyLimit.title": "الحد الشهري", "workspace.monthlyLimit.subtitle": "قم بتعيين حد الاستخدام الشهري لحسابك.", "workspace.monthlyLimit.placeholder": "50", - "workspace.monthlyLimit.setting": "جلسة...", + "workspace.monthlyLimit.setting": "جارٍ التعيين...", "workspace.monthlyLimit.set": "تعيين", "workspace.monthlyLimit.edit": "تحرير الحد", "workspace.monthlyLimit.noLimit": "لم يتم تعيين حد الاستخدام.", "workspace.monthlyLimit.currentUsage.beforeMonth": "الاستخدام الحالي ل", "workspace.monthlyLimit.currentUsage.beforeAmount": "هو $", - "workspace.reload.title": "إعادة التحميل التلقائي", - "workspace.reload.disabled.before": "إعادة التحميل التلقائي هو", - "workspace.reload.disabled.state": "عاجز", - "workspace.reload.disabled.after": "تمكين إعادة التحميل تلقائيًا عندما يكون الرصيد منخفضًا.", - "workspace.reload.enabled.before": "إعادة التحميل التلقائي هو", + "workspace.reload.title": "إعادة الشحن التلقائي", + "workspace.reload.disabled.before": "إعادة الشحن التلقائي", + "workspace.reload.disabled.state": "معطّل", + "workspace.reload.disabled.after": "فعّلها لإعادة شحن الرصيد تلقائيًا عندما يكون منخفضًا.", + "workspace.reload.enabled.before": "إعادة الشحن التلقائي", "workspace.reload.enabled.state": "ممكّن", - "workspace.reload.enabled.middle": "سنقوم بإعادة التحميل", + "workspace.reload.enabled.middle": "سنعيد شحن رصيدك بمبلغ", "workspace.reload.processingFee": "رسوم المعالجة", - "workspace.reload.enabled.after": "عندما يصل التوازن", + "workspace.reload.enabled.after": "عندما يصل الرصيد إلى", "workspace.reload.edit": "يحرر", - "workspace.reload.enable": "يُمكَِن", - "workspace.reload.enableAutoReload": "تمكين إعادة التحميل التلقائي", - "workspace.reload.reloadAmount": "إعادة تحميل $", + "workspace.reload.enable": "تفعيل", + "workspace.reload.enableAutoReload": "تفعيل إعادة الشحن التلقائي", + "workspace.reload.reloadAmount": "مبلغ إعادة الشحن $", "workspace.reload.whenBalanceReaches": "عندما يصل الرصيد إلى $", "workspace.reload.saving": "توفير...", "workspace.reload.save": "يحفظ", - "workspace.reload.failedAt": "فشلت عملية إعادة التحميل عند", + "workspace.reload.failedAt": "فشلت إعادة الشحن في", "workspace.reload.reason": "سبب:", "workspace.reload.updatePaymentMethod": "يرجى تحديث طريقة الدفع الخاصة بك والمحاولة مرة أخرى.", "workspace.reload.retrying": "جارٍ إعادة المحاولة...", @@ -500,11 +500,11 @@ export const dict = { "workspace.payments.subtitle": "معاملات الدفع الأخيرة.", "workspace.payments.table.date": "تاريخ", "workspace.payments.table.paymentId": "معرف الدفع", - "workspace.payments.table.amount": "كمية", + "workspace.payments.table.amount": "المبلغ", "workspace.payments.table.receipt": "إيصال", "workspace.payments.type.credit": "ائتمان", "workspace.payments.type.subscription": "الاشتراك", - "workspace.payments.view": "منظر", + "workspace.payments.view": "عرض", "workspace.black.loading": "تحميل...", "workspace.black.time.day": "يوم", "workspace.black.time.days": "أيام", @@ -521,8 +521,8 @@ export const dict = { "workspace.black.subscription.resetsIn": "إعادة تعيين في", "workspace.black.subscription.useBalance": "استخدم رصيدك المتوفر بعد الوصول إلى حدود الاستخدام", "workspace.black.waitlist.title": "قائمة الانتظار", - "workspace.black.waitlist.joined": "أنت على قائمة الانتظار للخطة السوداء {{plan}} دولار شهريًا OpenCode.", - "workspace.black.waitlist.ready": "نحن على استعداد لتسجيلك في خطة Black {{plan}} الشهرية OpenCode.", + "workspace.black.waitlist.joined": "أنت على قائمة الانتظار لخطة OpenCode Black بقيمة ${{plan}} شهريًا.", + "workspace.black.waitlist.ready": "نحن مستعدون لتسجيلك في خطة OpenCode Black بقيمة ${{plan}} شهريًا.", "workspace.black.waitlist.leave": "ترك قائمة الانتظار", "workspace.black.waitlist.leaving": "مغادرة...", "workspace.black.waitlist.left": "غادر", diff --git a/packages/console/app/src/i18n/da.ts b/packages/console/app/src/i18n/da.ts index 908d4b605..719c2b961 100644 --- a/packages/console/app/src/i18n/da.ts +++ b/packages/console/app/src/i18n/da.ts @@ -294,18 +294,18 @@ export const dict = { "workspace.home.billing.currentBalance": "Nuværende saldo", "workspace.newUser.feature.tested.title": "Testede og verificerede modeller", "workspace.newUser.feature.tested.body": - "Vi har benchmarket og testet modeller specifikt til kodningsmidler for at sikre den bedste ydeevne.", + "Vi har benchmarket og testet modeller specifikt til kodningsagenter for at sikre den bedste ydeevne.", "workspace.newUser.feature.quality.title": "Højeste kvalitet", "workspace.newUser.feature.quality.body": "Få adgang til modeller konfigureret til optimal ydeevne - ingen nedgraderinger eller routing til billigere udbydere.", "workspace.newUser.feature.lockin.title": "Ingen indlåsning", "workspace.newUser.feature.lockin.body": "Brug Zen med en hvilken som helst kodningsagent, og fortsæt med at bruge andre udbydere med opencode, når du vil.", - "workspace.newUser.copyApiKey": "Kopiér nøglen API", + "workspace.newUser.copyApiKey": "Kopiér API-nøgle", "workspace.newUser.copyKey": "Kopier nøgle", "workspace.newUser.copied": "Kopieret!", "workspace.newUser.step.enableBilling": "Aktiver fakturering", - "workspace.newUser.step.login.before": "Løbe", + "workspace.newUser.step.login.before": "Kør", "workspace.newUser.step.login.after": "og vælg opencode", "workspace.newUser.step.pasteKey": "Indsæt din API nøgle", "workspace.newUser.step.models.before": "Start opencode og kør", @@ -316,12 +316,12 @@ export const dict = { "workspace.models.table.enabled": "Aktiveret", "workspace.providers.title": "Medbring din egen nøgle", "workspace.providers.subtitle": "Konfigurer dine egne API nøgler fra AI-udbydere.", - "workspace.providers.placeholder": "Indtast nøglen {{provider}} API ({{prefix}}...)", + "workspace.providers.placeholder": "Indtast {{provider}} API-nøgle ({{prefix}}...)", "workspace.providers.configure": "Konfigurer", - "workspace.providers.edit": "Redigere", + "workspace.providers.edit": "Rediger", "workspace.providers.delete": "Slet", "workspace.providers.saving": "Gemmer...", - "workspace.providers.save": "Spare", + "workspace.providers.save": "Gem", "workspace.providers.table.provider": "Udbyder", "workspace.providers.table.apiKey": "API Nøgle", "workspace.usage.title": "Brugshistorik", @@ -330,15 +330,15 @@ export const dict = { "workspace.usage.table.date": "Dato", "workspace.usage.table.model": "Model", "workspace.usage.table.input": "Input", - "workspace.usage.table.output": "Produktion", - "workspace.usage.table.cost": "Koste", + "workspace.usage.table.output": "Output", + "workspace.usage.table.cost": "Omkostning", "workspace.usage.breakdown.input": "Input", "workspace.usage.breakdown.cacheRead": "Cache læst", "workspace.usage.breakdown.cacheWrite": "Cache skriv", - "workspace.usage.breakdown.output": "Produktion", + "workspace.usage.breakdown.output": "Output", "workspace.usage.breakdown.reasoning": "Ræsonnement", "workspace.usage.subscription": "abonnement (${{amount}})", - "workspace.cost.title": "Koste", + "workspace.cost.title": "Omkostninger", "workspace.cost.subtitle": "Brugsomkostninger opdelt efter model.", "workspace.cost.allModels": "Alle modeller", "workspace.cost.allKeys": "Alle nøgler", @@ -354,7 +354,7 @@ export const dict = { "workspace.keys.table.key": "Nøgle", "workspace.keys.table.createdBy": "Skabt af", "workspace.keys.table.lastUsed": "Sidst brugt", - "workspace.keys.copyApiKey": "Kopiér nøglen API", + "workspace.keys.copyApiKey": "Kopiér API-nøgle", "workspace.keys.delete": "Slet", "workspace.members.title": "Medlemmer", "workspace.members.subtitle": "Administrer arbejdsområdemedlemmer og deres tilladelser.", @@ -368,10 +368,10 @@ export const dict = { "workspace.members.noLimit": "Ingen grænse", "workspace.members.noLimitLowercase": "ingen grænse", "workspace.members.invited": "inviteret", - "workspace.members.edit": "Redigere", + "workspace.members.edit": "Rediger", "workspace.members.delete": "Slet", "workspace.members.saving": "Gemmer...", - "workspace.members.save": "Spare", + "workspace.members.save": "Gem", "workspace.members.table.email": "E-mail", "workspace.members.table.role": "Rolle", "workspace.members.table.monthLimit": "Månedsgrænse", @@ -382,10 +382,10 @@ export const dict = { "workspace.settings.title": "Indstillinger", "workspace.settings.subtitle": "Opdater dit arbejdsområdes navn og præferencer.", "workspace.settings.workspaceName": "Arbejdsområdets navn", - "workspace.settings.defaultName": "Misligholdelse", + "workspace.settings.defaultName": "Standard", "workspace.settings.updating": "Opdaterer...", - "workspace.settings.save": "Spare", - "workspace.settings.edit": "Redigere", + "workspace.settings.save": "Gem", + "workspace.settings.edit": "Rediger", "workspace.billing.title": "Fakturering", "workspace.billing.subtitle.beforeLink": "Administrer betalingsmetoder.", "workspace.billing.contactUs": "Kontakt os", @@ -394,10 +394,10 @@ export const dict = { "workspace.billing.add": "Tilføj $", "workspace.billing.enterAmount": "Indtast beløb", "workspace.billing.loading": "Indlæser...", - "workspace.billing.addAction": "Tilføje", + "workspace.billing.addAction": "Tilføj", "workspace.billing.addBalance": "Tilføj balance", "workspace.billing.linkedToStripe": "Forbundet til Stripe", - "workspace.billing.manage": "Styre", + "workspace.billing.manage": "Administrer", "workspace.billing.enable": "Aktiver fakturering", "workspace.monthlyLimit.title": "Månedlig grænse", "workspace.monthlyLimit.subtitle": "Indstil en månedlig forbrugsgrænse for din konto.", @@ -408,23 +408,23 @@ export const dict = { "workspace.monthlyLimit.noLimit": "Ingen forbrugsgrænse angivet.", "workspace.monthlyLimit.currentUsage.beforeMonth": "Nuværende brug for", "workspace.monthlyLimit.currentUsage.beforeAmount": "er $", - "workspace.reload.title": "Automatisk genindlæsning", - "workspace.reload.disabled.before": "Automatisk genindlæsning er", - "workspace.reload.disabled.state": "handicappet", - "workspace.reload.disabled.after": "Aktiver for automatisk at genindlæse, når balancen er lav.", - "workspace.reload.enabled.before": "Automatisk genindlæsning er", + "workspace.reload.title": "Automatisk genopfyldning", + "workspace.reload.disabled.before": "Automatisk genopfyldning er", + "workspace.reload.disabled.state": "deaktiveret", + "workspace.reload.disabled.after": "Aktiver for automatisk at genopfylde, når saldoen er lav.", + "workspace.reload.enabled.before": "Automatisk genopfyldning er", "workspace.reload.enabled.state": "aktiveret", - "workspace.reload.enabled.middle": "Vi genindlæser", + "workspace.reload.enabled.middle": "Vi genopfylder", "workspace.reload.processingFee": "ekspeditionsgebyr", "workspace.reload.enabled.after": "når balancen er nået", - "workspace.reload.edit": "Redigere", + "workspace.reload.edit": "Rediger", "workspace.reload.enable": "Aktiver", - "workspace.reload.enableAutoReload": "Aktiver automatisk genindlæsning", - "workspace.reload.reloadAmount": "Genindlæs $", + "workspace.reload.enableAutoReload": "Aktiver automatisk genopfyldning", + "workspace.reload.reloadAmount": "Genopfyld $", "workspace.reload.whenBalanceReaches": "Når saldoen når $", "workspace.reload.saving": "Gemmer...", - "workspace.reload.save": "Spare", - "workspace.reload.failedAt": "Genindlæsning mislykkedes kl", + "workspace.reload.save": "Gem", + "workspace.reload.failedAt": "Genopfyldning mislykkedes kl", "workspace.reload.reason": "Årsag:", "workspace.reload.updatePaymentMethod": "Opdater din betalingsmetode, og prøv igen.", "workspace.reload.retrying": "Prøver igen...", @@ -434,10 +434,10 @@ export const dict = { "workspace.payments.table.date": "Dato", "workspace.payments.table.paymentId": "Betalings-id", "workspace.payments.table.amount": "Beløb", - "workspace.payments.table.receipt": "Modtagelse", + "workspace.payments.table.receipt": "Kvittering", "workspace.payments.type.credit": "kredit", "workspace.payments.type.subscription": "abonnement", - "workspace.payments.view": "Udsigt", + "workspace.payments.view": "Vis", "workspace.black.loading": "Indlæser...", "workspace.black.time.day": "dag", "workspace.black.time.days": "dage", @@ -458,8 +458,8 @@ export const dict = { "workspace.black.waitlist.ready": "Vi er klar til at tilmelde dig ${{plan}} per måned OpenCode Black plan.", "workspace.black.waitlist.leave": "Forlad venteliste", "workspace.black.waitlist.leaving": "Forlader...", - "workspace.black.waitlist.left": "Venstre", - "workspace.black.waitlist.enroll": "Indskrive", + "workspace.black.waitlist.left": "Forladt", + "workspace.black.waitlist.enroll": "Tilmeld", "workspace.black.waitlist.enrolling": "Tilmelder...", "workspace.black.waitlist.enrolled": "Tilmeldt", "workspace.black.waitlist.enrollNote": diff --git a/packages/console/app/src/i18n/de.ts b/packages/console/app/src/i18n/de.ts index f37cbc91f..ea20893a6 100644 --- a/packages/console/app/src/i18n/de.ts +++ b/packages/console/app/src/i18n/de.ts @@ -306,27 +306,27 @@ export const dict = { "workspace.newUser.feature.lockin.title": "Kein Lock-in", "workspace.newUser.feature.lockin.body": "Verwenden Sie Zen mit einem beliebigen Codierungsagenten und nutzen Sie weiterhin andere Anbieter mit opencode, wann immer Sie möchten.", - "workspace.newUser.copyApiKey": "Kopieren Sie den Schlüssel API", + "workspace.newUser.copyApiKey": "API-Schlüssel kopieren", "workspace.newUser.copyKey": "Schlüssel kopieren", "workspace.newUser.copied": "Kopiert!", "workspace.newUser.step.enableBilling": "Abrechnung aktivieren", - "workspace.newUser.step.login.before": "Laufen", + "workspace.newUser.step.login.before": "Führe", "workspace.newUser.step.login.after": "und wählen Sie opencode", "workspace.newUser.step.pasteKey": "Fügen Sie Ihren API-Schlüssel ein", - "workspace.newUser.step.models.before": "Starten Sie opencode und führen Sie es aus", + "workspace.newUser.step.models.before": "Starte opencode und führe", "workspace.newUser.step.models.after": "um ein Modell auszuwählen", "workspace.models.title": "Modelle", "workspace.models.subtitle.beforeLink": "Verwalten Sie, auf welche Modelle Arbeitsbereichsmitglieder zugreifen können.", "workspace.models.table.model": "Modell", - "workspace.models.table.enabled": "Ermöglicht", + "workspace.models.table.enabled": "Aktiviert", "workspace.providers.title": "Bringen Sie Ihren eigenen Schlüssel mit", "workspace.providers.subtitle": "Konfigurieren Sie Ihre eigenen API-Schlüssel von KI-Anbietern.", "workspace.providers.placeholder": "Geben Sie den Schlüssel {{provider}} API ein ({{prefix}}...)", "workspace.providers.configure": "Konfigurieren", "workspace.providers.edit": "Bearbeiten", "workspace.providers.delete": "Löschen", - "workspace.providers.saving": "Sparen...", + "workspace.providers.saving": "Wird gespeichert...", "workspace.providers.save": "Speichern", "workspace.providers.table.provider": "Anbieter", "workspace.providers.table.apiKey": "API-Schlüssel", @@ -335,14 +335,14 @@ export const dict = { "workspace.usage.empty": "Machen Sie Ihren ersten API-Aufruf, um loszulegen.", "workspace.usage.table.date": "Datum", "workspace.usage.table.model": "Modell", - "workspace.usage.table.input": "Eingang", - "workspace.usage.table.output": "Ausgabe", + "workspace.usage.table.input": "Input", + "workspace.usage.table.output": "Output", "workspace.usage.table.cost": "Kosten", - "workspace.usage.breakdown.input": "Eingang", + "workspace.usage.breakdown.input": "Input", "workspace.usage.breakdown.cacheRead": "Cache-Lesen", "workspace.usage.breakdown.cacheWrite": "Cache-Schreiben", - "workspace.usage.breakdown.output": "Ausgabe", - "workspace.usage.breakdown.reasoning": "Argumentation", + "workspace.usage.breakdown.output": "Output", + "workspace.usage.breakdown.reasoning": "Reasoning", "workspace.usage.subscription": "Abonnement (${{amount}})", "workspace.cost.title": "Kosten", "workspace.cost.subtitle": "Nutzungskosten aufgeschlüsselt nach Modell.", @@ -360,12 +360,12 @@ export const dict = { "workspace.keys.table.key": "Schlüssel", "workspace.keys.table.createdBy": "Erstellt von", "workspace.keys.table.lastUsed": "Zuletzt verwendet", - "workspace.keys.copyApiKey": "Kopieren Sie den Schlüssel API", + "workspace.keys.copyApiKey": "API-Schlüssel kopieren", "workspace.keys.delete": "Löschen", "workspace.members.title": "Mitglieder", "workspace.members.subtitle": "Verwalten Sie Arbeitsbereichsmitglieder und ihre Berechtigungen.", "workspace.members.invite": "Mitglied einladen", - "workspace.members.inviting": "Einladend...", + "workspace.members.inviting": "Wird eingeladen...", "workspace.members.beta.beforeLink": "Während der Betaversion sind Arbeitsbereiche für Teams kostenlos.", "workspace.members.form.invitee": "Eingeladen", "workspace.members.form.emailPlaceholder": "Geben Sie Ihre E-Mail-Adresse ein", @@ -376,7 +376,7 @@ export const dict = { "workspace.members.invited": "eingeladen", "workspace.members.edit": "Bearbeiten", "workspace.members.delete": "Löschen", - "workspace.members.saving": "Sparen...", + "workspace.members.saving": "Wird gespeichert...", "workspace.members.save": "Speichern", "workspace.members.table.email": "E-Mail", "workspace.members.table.role": "Rolle", @@ -408,30 +408,30 @@ export const dict = { "workspace.monthlyLimit.title": "Monatliches Limit", "workspace.monthlyLimit.subtitle": "Legen Sie ein monatliches Nutzungslimit für Ihr Konto fest.", "workspace.monthlyLimit.placeholder": "50", - "workspace.monthlyLimit.setting": "Einstellung...", - "workspace.monthlyLimit.set": "Satz", + "workspace.monthlyLimit.setting": "Wird gesetzt...", + "workspace.monthlyLimit.set": "Festlegen", "workspace.monthlyLimit.edit": "Limit bearbeiten", "workspace.monthlyLimit.noLimit": "Kein Nutzungslimit festgelegt.", "workspace.monthlyLimit.currentUsage.beforeMonth": "Aktuelle Nutzung für", "workspace.monthlyLimit.currentUsage.beforeAmount": "ist $", - "workspace.reload.title": "Automatisches Neuladen", - "workspace.reload.disabled.before": "Automatisches Nachladen ist", + "workspace.reload.title": "Automatische Aufladung", + "workspace.reload.disabled.before": "Automatische Aufladung ist", "workspace.reload.disabled.state": "deaktiviert", "workspace.reload.disabled.after": - "Aktivieren Sie diese Option, um das Guthaben automatisch neu zu laden, wenn das Guthaben niedrig ist.", - "workspace.reload.enabled.before": "Automatisches Nachladen ist", - "workspace.reload.enabled.state": "ermöglicht", - "workspace.reload.enabled.middle": "Wir laden nach", + "Aktivieren Sie diese Option, damit bei niedrigem Kontostand automatisch aufgeladen wird.", + "workspace.reload.enabled.before": "Automatische Aufladung ist", + "workspace.reload.enabled.state": "aktiviert", + "workspace.reload.enabled.middle": "Wir laden auf", "workspace.reload.processingFee": "Bearbeitungsgebühr", - "workspace.reload.enabled.after": "wenn das Gleichgewicht erreicht ist", + "workspace.reload.enabled.after": "sobald der Kontostand", "workspace.reload.edit": "Bearbeiten", "workspace.reload.enable": "Aktivieren", - "workspace.reload.enableAutoReload": "Aktivieren Sie das automatische Neuladen", - "workspace.reload.reloadAmount": "$ neu laden", - "workspace.reload.whenBalanceReaches": "Wenn der Saldo $ erreicht", - "workspace.reload.saving": "Sparen...", + "workspace.reload.enableAutoReload": "Automatische Aufladung aktivieren", + "workspace.reload.reloadAmount": "Aufladebetrag $", + "workspace.reload.whenBalanceReaches": "Wenn der Kontostand $ erreicht", + "workspace.reload.saving": "Wird gespeichert...", "workspace.reload.save": "Speichern", - "workspace.reload.failedAt": "Neuladen fehlgeschlagen bei", + "workspace.reload.failedAt": "Aufladung fehlgeschlagen am", "workspace.reload.reason": "Grund:", "workspace.reload.updatePaymentMethod": "Bitte aktualisieren Sie Ihre Zahlungsmethode und versuchen Sie es erneut.", "workspace.reload.retrying": "Erneuter Versuch...", @@ -440,11 +440,11 @@ export const dict = { "workspace.payments.subtitle": "Letzte Zahlungsvorgänge.", "workspace.payments.table.date": "Datum", "workspace.payments.table.paymentId": "Zahlungs-ID", - "workspace.payments.table.amount": "Menge", + "workspace.payments.table.amount": "Betrag", "workspace.payments.table.receipt": "Quittung", "workspace.payments.type.credit": "Kredit", "workspace.payments.type.subscription": "Abonnement", - "workspace.payments.view": "Sicht", + "workspace.payments.view": "Anzeigen", "workspace.black.loading": "Laden...", "workspace.black.time.day": "Tag", "workspace.black.time.days": "Tage", @@ -454,21 +454,21 @@ export const dict = { "workspace.black.time.minutes": "Minuten", "workspace.black.time.fewSeconds": "ein paar Sekunden", "workspace.black.subscription.title": "Abonnement", - "workspace.black.subscription.message": "Sie haben OpenCode Black für {{plan}} pro Monat abonniert.", + "workspace.black.subscription.message": "Sie haben OpenCode Black für ${{plan}} pro Monat abonniert.", "workspace.black.subscription.manage": "Abonnement verwalten", "workspace.black.subscription.rollingUsage": "5-stündige Nutzung", "workspace.black.subscription.weeklyUsage": "Wöchentliche Nutzung", - "workspace.black.subscription.resetsIn": "Wird zurückgesetzt", + "workspace.black.subscription.resetsIn": "Zurückgesetzt in", "workspace.black.subscription.useBalance": "Nutzen Sie Ihr verfügbares Guthaben, nachdem Sie die Nutzungslimits erreicht haben", "workspace.black.waitlist.title": "Warteliste", "workspace.black.waitlist.joined": - "Sie stehen auf der Warteliste für den Black-Plan im Wert von ${{plan}} pro Monat OpenCode.", + "Sie stehen auf der Warteliste für den OpenCode Black Tarif für ${{plan}} pro Monat.", "workspace.black.waitlist.ready": - "Wir sind bereit, Sie für den Black-Plan im Wert von ${{plan}} pro Monat OpenCode anzumelden.", + "Wir können Sie jetzt in den OpenCode Black Tarif für ${{plan}} pro Monat aufnehmen.", "workspace.black.waitlist.leave": "Warteliste verlassen", "workspace.black.waitlist.leaving": "Verlassen...", - "workspace.black.waitlist.left": "Links", + "workspace.black.waitlist.left": "Verlassen", "workspace.black.waitlist.enroll": "Einschreiben", "workspace.black.waitlist.enrolling": "Anmeldung...", "workspace.black.waitlist.enrolled": "Eingeschrieben", diff --git a/packages/console/app/src/i18n/it.ts b/packages/console/app/src/i18n/it.ts index fb03a01e3..daf9e5625 100644 --- a/packages/console/app/src/i18n/it.ts +++ b/packages/console/app/src/i18n/it.ts @@ -284,8 +284,8 @@ export const dict = { "changelog.hero.subtitle": "Nuovi aggiornamenti e miglioramenti per OpenCode", "changelog.empty": "Nessuna voce di changelog trovata.", "changelog.viewJson": "Visualizza JSON", - "workspace.nav.zen": "zen", - "workspace.nav.apiKeys": "API Chiavi", + "workspace.nav.zen": "Zen", + "workspace.nav.apiKeys": "Chiavi API", "workspace.nav.members": "Membri", "workspace.nav.billing": "Fatturazione", "workspace.nav.settings": "Impostazioni", @@ -299,14 +299,14 @@ export const dict = { "workspace.newUser.feature.quality.title": "Massima qualità", "workspace.newUser.feature.quality.body": "Modelli di accesso configurati per prestazioni ottimali: senza downgrade o instradamento verso fornitori più economici.", - "workspace.newUser.feature.lockin.title": "Nessun blocco", + "workspace.newUser.feature.lockin.title": "Nessun lock-in", "workspace.newUser.feature.lockin.body": "Utilizza Zen con qualsiasi agente di codifica e continua a utilizzare altri provider con opencode ogni volta che vuoi.", "workspace.newUser.copyApiKey": "Copia la chiave API", "workspace.newUser.copyKey": "Copia chiave", "workspace.newUser.copied": "Copiato!", "workspace.newUser.step.enableBilling": "Abilita fatturazione", - "workspace.newUser.step.login.before": "Correre", + "workspace.newUser.step.login.before": "Esegui", "workspace.newUser.step.login.after": "e seleziona opencode", "workspace.newUser.step.pasteKey": "Incolla la tua chiave API", "workspace.newUser.step.models.before": "Avvia opencode ed esegui", @@ -315,16 +315,16 @@ export const dict = { "workspace.models.subtitle.beforeLink": "Gestire i modelli a cui possono accedere i membri dell'area di lavoro.", "workspace.models.table.model": "Modello", "workspace.models.table.enabled": "Abilitato", - "workspace.providers.title": "Porta la tua chiave", + "workspace.providers.title": "Bring Your Own Key (BYOK)", "workspace.providers.subtitle": "Configura le tue chiavi API dai fornitori di intelligenza artificiale.", "workspace.providers.placeholder": "Inserisci la chiave {{provider}} API ({{prefix}}...)", "workspace.providers.configure": "Configura", "workspace.providers.edit": "Modificare", "workspace.providers.delete": "Eliminare", - "workspace.providers.saving": "Risparmio...", + "workspace.providers.saving": "Salvataggio in corso...", "workspace.providers.save": "Salva", "workspace.providers.table.provider": "Fornitore", - "workspace.providers.table.apiKey": "API Chiave", + "workspace.providers.table.apiKey": "Chiave API", "workspace.usage.title": "Cronologia dell'utilizzo", "workspace.usage.subtitle": "Utilizzo e costi recenti di API.", "workspace.usage.empty": "Effettua la tua prima chiamata API per iniziare.", @@ -346,7 +346,7 @@ export const dict = { "workspace.cost.deletedSuffix": "(eliminato)", "workspace.cost.empty": "Nessun dato di utilizzo disponibile per il periodo selezionato.", "workspace.cost.subscriptionShort": "sub", - "workspace.keys.title": "API Chiavi", + "workspace.keys.title": "Chiavi API", "workspace.keys.subtitle": "Gestisci le tue chiavi API per accedere ai servizi opencode.", "workspace.keys.create": "Crea chiave API", "workspace.keys.placeholder": "Inserisci il nome della chiave", @@ -360,7 +360,7 @@ export const dict = { "workspace.members.title": "Membri", "workspace.members.subtitle": "Gestire i membri dell'area di lavoro e le relative autorizzazioni.", "workspace.members.invite": "Invita membro", - "workspace.members.inviting": "Invitante...", + "workspace.members.inviting": "Invito in corso...", "workspace.members.beta.beforeLink": "Gli spazi di lavoro sono gratuiti per i team durante la beta.", "workspace.members.form.invitee": "Invitato", "workspace.members.form.emailPlaceholder": "Inserisci l'e-mail", @@ -371,12 +371,12 @@ export const dict = { "workspace.members.invited": "invitato", "workspace.members.edit": "Modificare", "workspace.members.delete": "Eliminare", - "workspace.members.saving": "Risparmio...", + "workspace.members.saving": "Salvataggio in corso...", "workspace.members.save": "Salva", "workspace.members.table.email": "E-mail", "workspace.members.table.role": "Ruolo", "workspace.members.table.monthLimit": "Limite mensile", - "workspace.members.role.admin": "Ammin", + "workspace.members.role.admin": "Admin", "workspace.members.role.adminDescription": "Può gestire modelli, membri e fatturazione", "workspace.members.role.member": "Membro", "workspace.members.role.memberDescription": "Possono generare chiavi API solo per se stessi", @@ -388,42 +388,42 @@ export const dict = { "workspace.settings.save": "Salva", "workspace.settings.edit": "Modificare", "workspace.billing.title": "Fatturazione", - "workspace.billing.subtitle.beforeLink": "Gestire i metodi di pagamento.", + "workspace.billing.subtitle.beforeLink": "Gestisci i metodi di pagamento.", "workspace.billing.contactUs": "Contattaci", "workspace.billing.subtitle.afterLink": "se hai qualche domanda", "workspace.billing.currentBalance": "Saldo attuale", "workspace.billing.add": "Aggiungi $", "workspace.billing.enterAmount": "Inserisci l'importo", "workspace.billing.loading": "Caricamento...", - "workspace.billing.addAction": "Aggiungere", + "workspace.billing.addAction": "Aggiungi", "workspace.billing.addBalance": "Aggiungi saldo", "workspace.billing.linkedToStripe": "Collegato a Stripe", - "workspace.billing.manage": "Maneggio", + "workspace.billing.manage": "Gestisci", "workspace.billing.enable": "Abilita fatturazione", "workspace.monthlyLimit.title": "Limite mensile", "workspace.monthlyLimit.subtitle": "Imposta un limite di utilizzo mensile per il tuo account.", "workspace.monthlyLimit.placeholder": "50", - "workspace.monthlyLimit.setting": "Collocamento...", + "workspace.monthlyLimit.setting": "Impostazione in corso...", "workspace.monthlyLimit.set": "Impostato", "workspace.monthlyLimit.edit": "Modifica limite", "workspace.monthlyLimit.noLimit": "Nessun limite di utilizzo impostato.", "workspace.monthlyLimit.currentUsage.beforeMonth": "Utilizzo attuale per", "workspace.monthlyLimit.currentUsage.beforeAmount": "è $", "workspace.reload.title": "Ricarica automatica", - "workspace.reload.disabled.before": "La ricarica automatica lo è", + "workspace.reload.disabled.before": "La ricarica automatica è", "workspace.reload.disabled.state": "disabilitato", "workspace.reload.disabled.after": "Abilita la ricarica automatica quando il saldo è basso.", - "workspace.reload.enabled.before": "La ricarica automatica lo è", + "workspace.reload.enabled.before": "La ricarica automatica è", "workspace.reload.enabled.state": "abilitato", "workspace.reload.enabled.middle": "Ricaricheremo", "workspace.reload.processingFee": "tassa di elaborazione", - "workspace.reload.enabled.after": "quando l'equilibrio raggiunge", + "workspace.reload.enabled.after": "quando il saldo raggiunge", "workspace.reload.edit": "Modificare", "workspace.reload.enable": "Abilitare", "workspace.reload.enableAutoReload": "Abilita ricarica automatica", "workspace.reload.reloadAmount": "Ricarica $", "workspace.reload.whenBalanceReaches": "Quando il saldo raggiunge $", - "workspace.reload.saving": "Risparmio...", + "workspace.reload.saving": "Salvataggio in corso...", "workspace.reload.save": "Salva", "workspace.reload.failedAt": "Ricarica non riuscita a", "workspace.reload.reason": "Motivo:", @@ -434,11 +434,11 @@ export const dict = { "workspace.payments.subtitle": "Transazioni di pagamento recenti.", "workspace.payments.table.date": "Data", "workspace.payments.table.paymentId": "ID pagamento", - "workspace.payments.table.amount": "Quantità", + "workspace.payments.table.amount": "Importo", "workspace.payments.table.receipt": "Ricevuta", "workspace.payments.type.credit": "credito", "workspace.payments.type.subscription": "sottoscrizione", - "workspace.payments.view": "Visualizzazione", + "workspace.payments.view": "Visualizza", "workspace.black.loading": "Caricamento...", "workspace.black.time.day": "giorno", "workspace.black.time.days": "giorni", @@ -452,14 +452,14 @@ export const dict = { "workspace.black.subscription.manage": "Gestisci abbonamento", "workspace.black.subscription.rollingUsage": "Utilizzo di 5 ore", "workspace.black.subscription.weeklyUsage": "Utilizzo settimanale", - "workspace.black.subscription.resetsIn": "Si reimposta", + "workspace.black.subscription.resetsIn": "Si reimposta tra", "workspace.black.subscription.useBalance": "Utilizza il saldo disponibile dopo aver raggiunto i limiti di utilizzo", "workspace.black.waitlist.title": "Lista d'attesa", - "workspace.black.waitlist.joined": "Sei in lista d'attesa per il piano nero ${{plan}} al mese OpenCode.", + "workspace.black.waitlist.joined": "Sei in lista d'attesa per il piano OpenCode Black da ${{plan}} al mese.", "workspace.black.waitlist.ready": "Siamo pronti per iscriverti al piano OpenCode Black da ${{plan}} al mese.", "workspace.black.waitlist.leave": "Lascia la lista d'attesa", - "workspace.black.waitlist.leaving": "In partenza...", - "workspace.black.waitlist.left": "Sinistra", + "workspace.black.waitlist.leaving": "Uscita in corso...", + "workspace.black.waitlist.left": "Uscito dalla lista d'attesa", "workspace.black.waitlist.enroll": "Iscriversi", "workspace.black.waitlist.enrolling": "Iscrizione...", "workspace.black.waitlist.enrolled": "Iscritto", diff --git a/packages/console/app/src/i18n/zh.ts b/packages/console/app/src/i18n/zh.ts index 4a5553429..b24ad2684 100644 --- a/packages/console/app/src/i18n/zh.ts +++ b/packages/console/app/src/i18n/zh.ts @@ -293,9 +293,9 @@ export const dict = { "changelog.hero.subtitle": "OpenCode \u7684\u65b0\u66f4\u65b0\u4e0e\u6539\u8fdb", "changelog.empty": "\u672a\u627e\u5230\u66f4\u65b0\u65e5\u5fd7\u6761\u76ee\u3002", "changelog.viewJson": "\u67e5\u770b JSON", - "workspace.nav.zen": "禅", + "workspace.nav.zen": "Zen", "workspace.nav.apiKeys": "API 键", - "workspace.nav.members": "会员", + "workspace.nav.members": "成员", "workspace.nav.billing": "计费", "workspace.nav.settings": "设置", "workspace.home.banner.beforeLink": "编码代理的可靠优化模型。", @@ -310,26 +310,26 @@ export const dict = { "workspace.newUser.feature.lockin.body": "将 Zen 与任何编码代理结合使用,并在需要时继续将其他提供程序与 opencode 结合使用。", "workspace.newUser.copyApiKey": "复制 API 密钥", - "workspace.newUser.copyKey": "复制钥匙", - "workspace.newUser.copied": "复制了!", + "workspace.newUser.copyKey": "复制密钥", + "workspace.newUser.copied": "已复制!", "workspace.newUser.step.enableBilling": "启用计费", - "workspace.newUser.step.login.before": "跑步", + "workspace.newUser.step.login.before": "运行", "workspace.newUser.step.login.after": "并选择 opencode", "workspace.newUser.step.pasteKey": "粘贴您的 API 密钥", "workspace.newUser.step.models.before": "启动 opencode 并运行", - "workspace.newUser.step.models.after": "选择型号", - "workspace.models.title": "型号", + "workspace.newUser.step.models.after": "选择模型", + "workspace.models.title": "模型", "workspace.models.subtitle.beforeLink": "管理工作区成员可以访问哪些模型。", "workspace.models.table.model": "模型", "workspace.models.table.enabled": "启用", - "workspace.providers.title": "带上你自己的钥匙", + "workspace.providers.title": "自带密钥", "workspace.providers.subtitle": "从 AI 提供商处配置您自己的 API 密钥。", "workspace.providers.placeholder": "输入 {{provider}} API 密钥({{prefix}}...)", "workspace.providers.configure": "配置", "workspace.providers.edit": "编辑", "workspace.providers.delete": "删除", "workspace.providers.saving": "保存...", - "workspace.providers.save": "节省", + "workspace.providers.save": "保存", "workspace.providers.table.provider": "提供者", "workspace.providers.table.apiKey": "API 密钥", "workspace.usage.title": "使用历史", @@ -348,25 +348,25 @@ export const dict = { "workspace.usage.subscription": "订阅 (${{amount}})", "workspace.cost.title": "成本", "workspace.cost.subtitle": "按型号细分的使用成本。", - "workspace.cost.allModels": "所有型号", - "workspace.cost.allKeys": "所有按键", + "workspace.cost.allModels": "所有模型", + "workspace.cost.allKeys": "所有密钥", "workspace.cost.deletedSuffix": "(已删除)", "workspace.cost.empty": "所选期间没有可用的使用数据。", - "workspace.cost.subscriptionShort": "子", + "workspace.cost.subscriptionShort": "订", "workspace.keys.title": "API 键", "workspace.keys.subtitle": "管理您的 API 密钥以访问 opencode 服务。", "workspace.keys.create": "创建 API 密钥", - "workspace.keys.placeholder": "输入按键名称", + "workspace.keys.placeholder": "输入密钥名称", "workspace.keys.empty": "创建 opencode 网关 API 密钥", - "workspace.keys.table.name": "姓名", - "workspace.keys.table.key": "钥匙", + "workspace.keys.table.name": "名称", + "workspace.keys.table.key": "密钥", "workspace.keys.table.createdBy": "创建者", "workspace.keys.table.lastUsed": "最后使用", "workspace.keys.copyApiKey": "复制 API 密钥", "workspace.keys.delete": "删除", - "workspace.members.title": "会员", + "workspace.members.title": "成员", "workspace.members.subtitle": "管理工作区成员及其权限。", - "workspace.members.invite": "邀请会员", + "workspace.members.invite": "邀请成员", "workspace.members.inviting": "邀请...", "workspace.members.beta.beforeLink": "测试期间,工作空间对团队免费。", "workspace.members.form.invitee": "受邀者", @@ -379,11 +379,11 @@ export const dict = { "workspace.members.edit": "编辑", "workspace.members.delete": "删除", "workspace.members.saving": "保存...", - "workspace.members.save": "节省", + "workspace.members.save": "保存", "workspace.members.table.email": "电子邮件", "workspace.members.table.role": "角色", - "workspace.members.table.monthLimit": "月份限制", - "workspace.members.role.admin": "行政", + "workspace.members.table.monthLimit": "月限额", + "workspace.members.role.admin": "管理员", "workspace.members.role.adminDescription": "可以管理模型、成员和计费", "workspace.members.role.member": "成员", "workspace.members.role.memberDescription": "只能为自己生成 API 密钥", @@ -392,7 +392,7 @@ export const dict = { "workspace.settings.workspaceName": "工作区名称", "workspace.settings.defaultName": "默认", "workspace.settings.updating": "更新中...", - "workspace.settings.save": "节省", + "workspace.settings.save": "保存", "workspace.settings.edit": "编辑", "workspace.billing.title": "计费", "workspace.billing.subtitle.beforeLink": "管理付款方式。", @@ -404,35 +404,35 @@ export const dict = { "workspace.billing.loading": "加载中...", "workspace.billing.addAction": "添加", "workspace.billing.addBalance": "添加余额", - "workspace.billing.linkedToStripe": "链接到条纹", + "workspace.billing.linkedToStripe": "已绑定 Stripe", "workspace.billing.manage": "管理", "workspace.billing.enable": "启用计费", "workspace.monthlyLimit.title": "每月限额", "workspace.monthlyLimit.subtitle": "为您的帐户设置每月使用限额。", "workspace.monthlyLimit.placeholder": "50", - "workspace.monthlyLimit.setting": "环境...", - "workspace.monthlyLimit.set": "放", + "workspace.monthlyLimit.setting": "设置中...", + "workspace.monthlyLimit.set": "设置", "workspace.monthlyLimit.edit": "编辑限制", "workspace.monthlyLimit.noLimit": "没有设置使用限制。", - "workspace.monthlyLimit.currentUsage.beforeMonth": "当前使用情况为", - "workspace.monthlyLimit.currentUsage.beforeAmount": "是 $", - "workspace.reload.title": "自动重新加载", - "workspace.reload.disabled.before": "自动重新加载是", - "workspace.reload.disabled.state": "残疾人", - "workspace.reload.disabled.after": "启用余额不足时自动充值。", - "workspace.reload.enabled.before": "自动重新加载是", + "workspace.monthlyLimit.currentUsage.beforeMonth": "当前", + "workspace.monthlyLimit.currentUsage.beforeAmount": "的使用量为 $", + "workspace.reload.title": "自动充值", + "workspace.reload.disabled.before": "自动充值已", + "workspace.reload.disabled.state": "停用", + "workspace.reload.disabled.after": "启用后将在余额较低时自动充值。", + "workspace.reload.enabled.before": "自动充值已", "workspace.reload.enabled.state": "已启用", - "workspace.reload.enabled.middle": "我们将重新加载", - "workspace.reload.processingFee": "加工费", + "workspace.reload.enabled.middle": "我们将自动充值", + "workspace.reload.processingFee": "手续费", "workspace.reload.enabled.after": "当余额达到", "workspace.reload.edit": "编辑", - "workspace.reload.enable": "使能够", - "workspace.reload.enableAutoReload": "启用自动重新加载", - "workspace.reload.reloadAmount": "重新加载 $", + "workspace.reload.enable": "启用", + "workspace.reload.enableAutoReload": "启用自动充值", + "workspace.reload.reloadAmount": "充值 $", "workspace.reload.whenBalanceReaches": "当余额达到 $", "workspace.reload.saving": "保存...", - "workspace.reload.save": "节省", - "workspace.reload.failedAt": "重新加载失败于", + "workspace.reload.save": "保存", + "workspace.reload.failedAt": "充值失败于", "workspace.reload.reason": "原因:", "workspace.reload.updatePaymentMethod": "请更新您的付款方式并重试。", "workspace.reload.retrying": "正在重试...", @@ -441,11 +441,11 @@ export const dict = { "workspace.payments.subtitle": "最近的付款交易。", "workspace.payments.table.date": "日期", "workspace.payments.table.paymentId": "付款ID", - "workspace.payments.table.amount": "数量", + "workspace.payments.table.amount": "金额", "workspace.payments.table.receipt": "收据", "workspace.payments.type.credit": "信用", "workspace.payments.type.subscription": "订阅", - "workspace.payments.view": "看法", + "workspace.payments.view": "查看", "workspace.black.loading": "加载中...", "workspace.black.time.day": "天", "workspace.black.time.days": "天", @@ -455,20 +455,20 @@ export const dict = { "workspace.black.time.minutes": "分钟", "workspace.black.time.fewSeconds": "几秒钟", "workspace.black.subscription.title": "订阅", - "workspace.black.subscription.message": "您已订阅 OpenCode Black,每月费用为 {{plan}} 美元。", + "workspace.black.subscription.message": "您已订阅 OpenCode Black,费用为每月 ${{plan}}。", "workspace.black.subscription.manage": "管理订阅", "workspace.black.subscription.rollingUsage": "5小时使用", "workspace.black.subscription.weeklyUsage": "每周使用量", "workspace.black.subscription.resetsIn": "重置于", "workspace.black.subscription.useBalance": "达到使用限额后使用您的可用余额", "workspace.black.waitlist.title": "候补名单", - "workspace.black.waitlist.joined": "您正在等待每月 ${{plan}} OpenCode 黑色计划。", - "workspace.black.waitlist.ready": "我们已准备好让您加入每月 {{plan}} 美元的 OpenCode 黑色计划。", + "workspace.black.waitlist.joined": "您已加入每月 ${{plan}} 的 OpenCode Black 方案候补名单。", + "workspace.black.waitlist.ready": "我们已准备好将您加入每月 ${{plan}} 的 OpenCode Black 方案。", "workspace.black.waitlist.leave": "离开候补名单", "workspace.black.waitlist.leaving": "离开...", - "workspace.black.waitlist.left": "左边", - "workspace.black.waitlist.enroll": "注册", - "workspace.black.waitlist.enrolling": "正在报名...", - "workspace.black.waitlist.enrolled": "已注册", + "workspace.black.waitlist.left": "已退出", + "workspace.black.waitlist.enroll": "加入", + "workspace.black.waitlist.enrolling": "加入中...", + "workspace.black.waitlist.enrolled": "已加入", "workspace.black.waitlist.enrollNote": "单击“注册”后,您的订阅将立即开始,并且将从您的卡中扣费。", } satisfies Dict diff --git a/packages/console/app/src/i18n/zht.ts b/packages/console/app/src/i18n/zht.ts index 38bd448e3..2de7c3996 100644 --- a/packages/console/app/src/i18n/zht.ts +++ b/packages/console/app/src/i18n/zht.ts @@ -293,9 +293,9 @@ export const dict = { "changelog.hero.subtitle": "OpenCode \u7684\u65b0\u66f4\u65b0\u8207\u6539\u5584", "changelog.empty": "\u627e\u4e0d\u5230\u66f4\u65b0\u65e5\u8a8c\u9805\u76ee\u3002", "changelog.viewJson": "\u6aa2\u8996 JSON", - "workspace.nav.zen": "禪", + "workspace.nav.zen": "Zen", "workspace.nav.apiKeys": "API 鍵", - "workspace.nav.members": "會員", + "workspace.nav.members": "成員", "workspace.nav.billing": "計費", "workspace.nav.settings": "設定", "workspace.home.banner.beforeLink": "編碼代理的可靠優化模型。", @@ -310,26 +310,26 @@ export const dict = { "workspace.newUser.feature.lockin.body": "將 Zen 與任何編碼代理結合使用,並在需要時繼續將其他提供程序與 opencode 結合使用。", "workspace.newUser.copyApiKey": "複製 API 密鑰", - "workspace.newUser.copyKey": "複製鑰匙", - "workspace.newUser.copied": "複製了!", + "workspace.newUser.copyKey": "複製密鑰", + "workspace.newUser.copied": "已複製!", "workspace.newUser.step.enableBilling": "啟用計費", - "workspace.newUser.step.login.before": "跑步", + "workspace.newUser.step.login.before": "執行", "workspace.newUser.step.login.after": "並選擇 opencode", "workspace.newUser.step.pasteKey": "粘貼您的 API 密鑰", "workspace.newUser.step.models.before": "啟動 opencode 並運行", - "workspace.newUser.step.models.after": "選擇型號", - "workspace.models.title": "型號", + "workspace.newUser.step.models.after": "選擇模型", + "workspace.models.title": "模型", "workspace.models.subtitle.beforeLink": "管理工作區成員可以訪問哪些模型。", "workspace.models.table.model": "模型", "workspace.models.table.enabled": "啟用", - "workspace.providers.title": "帶上你自己的鑰匙", + "workspace.providers.title": "自帶密鑰", "workspace.providers.subtitle": "從 AI 提供商處配置您自己的 API 密鑰。", "workspace.providers.placeholder": "輸入 {{provider}} API 密鑰({{prefix}}...)", "workspace.providers.configure": "配置", "workspace.providers.edit": "編輯", "workspace.providers.delete": "刪除", "workspace.providers.saving": "保存...", - "workspace.providers.save": "節省", + "workspace.providers.save": "儲存", "workspace.providers.table.provider": "提供者", "workspace.providers.table.apiKey": "API 密鑰", "workspace.usage.title": "使用歷史", @@ -348,25 +348,25 @@ export const dict = { "workspace.usage.subscription": "訂閱 (${{amount}})", "workspace.cost.title": "成本", "workspace.cost.subtitle": "按型號細分的使用成本。", - "workspace.cost.allModels": "所有型號", - "workspace.cost.allKeys": "所有按鍵", + "workspace.cost.allModels": "所有模型", + "workspace.cost.allKeys": "所有密鑰", "workspace.cost.deletedSuffix": "(已刪除)", "workspace.cost.empty": "所選期間沒有可用的使用數據。", - "workspace.cost.subscriptionShort": "子", + "workspace.cost.subscriptionShort": "訂", "workspace.keys.title": "API 鍵", "workspace.keys.subtitle": "管理您的 API 密鑰以訪問 opencode 服務。", "workspace.keys.create": "創建 API 密鑰", - "workspace.keys.placeholder": "輸入按鍵名稱", + "workspace.keys.placeholder": "輸入密鑰名稱", "workspace.keys.empty": "創建 opencode 網關 API 密鑰", - "workspace.keys.table.name": "姓名", - "workspace.keys.table.key": "鑰匙", + "workspace.keys.table.name": "名稱", + "workspace.keys.table.key": "密鑰", "workspace.keys.table.createdBy": "創建者", "workspace.keys.table.lastUsed": "最後使用", "workspace.keys.copyApiKey": "複製 API 密鑰", "workspace.keys.delete": "刪除", - "workspace.members.title": "會員", + "workspace.members.title": "成員", "workspace.members.subtitle": "管理工作區成員及其權限。", - "workspace.members.invite": "邀請會員", + "workspace.members.invite": "邀請成員", "workspace.members.inviting": "邀請...", "workspace.members.beta.beforeLink": "測試期間,工作空間對團隊免費。", "workspace.members.form.invitee": "受邀者", @@ -379,11 +379,11 @@ export const dict = { "workspace.members.edit": "編輯", "workspace.members.delete": "刪除", "workspace.members.saving": "保存...", - "workspace.members.save": "節省", + "workspace.members.save": "儲存", "workspace.members.table.email": "電子郵件", "workspace.members.table.role": "角色", - "workspace.members.table.monthLimit": "月份限制", - "workspace.members.role.admin": "行政", + "workspace.members.table.monthLimit": "月限額", + "workspace.members.role.admin": "管理員", "workspace.members.role.adminDescription": "可以管理模型、成員和計費", "workspace.members.role.member": "成員", "workspace.members.role.memberDescription": "只能為自己生成 API 密鑰", @@ -392,7 +392,7 @@ export const dict = { "workspace.settings.workspaceName": "工作區名稱", "workspace.settings.defaultName": "預設", "workspace.settings.updating": "更新中...", - "workspace.settings.save": "節省", + "workspace.settings.save": "儲存", "workspace.settings.edit": "編輯", "workspace.billing.title": "計費", "workspace.billing.subtitle.beforeLink": "管理付款方式。", @@ -404,35 +404,35 @@ export const dict = { "workspace.billing.loading": "載入中...", "workspace.billing.addAction": "添加", "workspace.billing.addBalance": "添加餘額", - "workspace.billing.linkedToStripe": "鏈接到條紋", + "workspace.billing.linkedToStripe": "已連結 Stripe", "workspace.billing.manage": "管理", "workspace.billing.enable": "啟用計費", "workspace.monthlyLimit.title": "每月限額", "workspace.monthlyLimit.subtitle": "為您的帳戶設置每月使用限額。", "workspace.monthlyLimit.placeholder": "50", - "workspace.monthlyLimit.setting": "環境...", - "workspace.monthlyLimit.set": "放", + "workspace.monthlyLimit.setting": "設定中...", + "workspace.monthlyLimit.set": "設定", "workspace.monthlyLimit.edit": "編輯限制", "workspace.monthlyLimit.noLimit": "沒有設置使用限制。", - "workspace.monthlyLimit.currentUsage.beforeMonth": "當前使用情況為", - "workspace.monthlyLimit.currentUsage.beforeAmount": "是 $", - "workspace.reload.title": "自動重新加載", - "workspace.reload.disabled.before": "自動重新加載是", - "workspace.reload.disabled.state": "殘疾人", - "workspace.reload.disabled.after": "啟用餘額不足時自動充值。", - "workspace.reload.enabled.before": "自動重新加載是", + "workspace.monthlyLimit.currentUsage.beforeMonth": "當前", + "workspace.monthlyLimit.currentUsage.beforeAmount": "的使用量為 $", + "workspace.reload.title": "自動儲值", + "workspace.reload.disabled.before": "自動儲值已", + "workspace.reload.disabled.state": "停用", + "workspace.reload.disabled.after": "啟用後會在餘額偏低時自動儲值。", + "workspace.reload.enabled.before": "自動儲值已", "workspace.reload.enabled.state": "已啟用", - "workspace.reload.enabled.middle": "我們將重新加載", - "workspace.reload.processingFee": "加工費", + "workspace.reload.enabled.middle": "我們將自動儲值", + "workspace.reload.processingFee": "手續費", "workspace.reload.enabled.after": "當餘額達到", "workspace.reload.edit": "編輯", - "workspace.reload.enable": "使能夠", - "workspace.reload.enableAutoReload": "啟用自動重新加載", - "workspace.reload.reloadAmount": "重新加載 $", + "workspace.reload.enable": "啟用", + "workspace.reload.enableAutoReload": "啟用自動儲值", + "workspace.reload.reloadAmount": "儲值 $", "workspace.reload.whenBalanceReaches": "當餘額達到 $", "workspace.reload.saving": "保存...", - "workspace.reload.save": "節省", - "workspace.reload.failedAt": "重新加載失敗於", + "workspace.reload.save": "儲存", + "workspace.reload.failedAt": "儲值失敗於", "workspace.reload.reason": "原因:", "workspace.reload.updatePaymentMethod": "請更新您的付款方式並重試。", "workspace.reload.retrying": "正在重試...", @@ -441,11 +441,11 @@ export const dict = { "workspace.payments.subtitle": "最近的付款交易。", "workspace.payments.table.date": "日期", "workspace.payments.table.paymentId": "付款ID", - "workspace.payments.table.amount": "數量", + "workspace.payments.table.amount": "金額", "workspace.payments.table.receipt": "收據", "workspace.payments.type.credit": "信用", "workspace.payments.type.subscription": "訂閱", - "workspace.payments.view": "看法", + "workspace.payments.view": "查看", "workspace.black.loading": "載入中...", "workspace.black.time.day": "天", "workspace.black.time.days": "天", @@ -455,20 +455,20 @@ export const dict = { "workspace.black.time.minutes": "分鐘", "workspace.black.time.fewSeconds": "幾秒鐘", "workspace.black.subscription.title": "訂閱", - "workspace.black.subscription.message": "您已訂閱 OpenCode Black,每月費用為 {{plan}} 美元。", + "workspace.black.subscription.message": "您已訂閱 OpenCode Black,費用為每月 ${{plan}}。", "workspace.black.subscription.manage": "管理訂閱", "workspace.black.subscription.rollingUsage": "5小時使用", "workspace.black.subscription.weeklyUsage": "每週使用量", "workspace.black.subscription.resetsIn": "重置於", "workspace.black.subscription.useBalance": "達到使用限額後使用您的可用餘額", "workspace.black.waitlist.title": "候補名單", - "workspace.black.waitlist.joined": "您正在等待每月 ${{plan}} OpenCode 黑色計劃。", - "workspace.black.waitlist.ready": "我們已準備好讓您加入每月 {{plan}} 美元的 OpenCode 黑色計劃。", + "workspace.black.waitlist.joined": "您已加入每月 ${{plan}} 的 OpenCode Black 方案候補名單。", + "workspace.black.waitlist.ready": "我們已準備好將您加入每月 ${{plan}} 的 OpenCode Black 方案。", "workspace.black.waitlist.leave": "離開候補名單", "workspace.black.waitlist.leaving": "離開...", - "workspace.black.waitlist.left": "左邊", - "workspace.black.waitlist.enroll": "註冊", - "workspace.black.waitlist.enrolling": "正在報名...", - "workspace.black.waitlist.enrolled": "已註冊", + "workspace.black.waitlist.left": "已退出", + "workspace.black.waitlist.enroll": "加入", + "workspace.black.waitlist.enrolling": "加入中...", + "workspace.black.waitlist.enrolled": "已加入", "workspace.black.waitlist.enrollNote": "單擊“註冊”後,您的訂閱將立即開始,並且將從您的卡中扣費。", } satisfies Dict diff --git a/specs/19-workspace-i18n-audit-overview.md b/specs/19-workspace-i18n-audit-overview.md new file mode 100644 index 000000000..42599a2f6 --- /dev/null +++ b/specs/19-workspace-i18n-audit-overview.md @@ -0,0 +1,76 @@ +## workspace i18n audit overview (zen workspace routes) + +Audit objective: verify translation accuracy for customer-facing workspace management pages used to manage Zen (AI inference provider) usage, with strict terminology and brand integrity. + +--- + +### scope + +- Routes audited: `packages/console/app/src/routes/workspace/**` (all workspace TSX routes, including billing/keys/members/settings) +- Locale files audited: `packages/console/app/src/i18n/ar.ts`, `packages/console/app/src/i18n/da.ts`, `packages/console/app/src/i18n/de.ts`, `packages/console/app/src/i18n/it.ts` +- Source-of-truth copy: `packages/console/app/src/i18n/en.ts` +- Total unique translation keys used by workspace routes: **181** + +--- + +### deliverables + +- Arabic audit and fix spec: `specs/20-workspace-i18n-audit-ar.md` +- Danish audit and fix spec: `specs/21-workspace-i18n-audit-da.md` +- German audit and fix spec: `specs/22-workspace-i18n-audit-de.md` +- Italian audit and fix spec: `specs/23-workspace-i18n-audit-it.md` + +These files are intentionally execution-ready so follow-up agents can apply string fixes without re-auditing. + +--- + +### non-negotiable terminology contract + +1. Product names and brands: + - `Zen` must remain exactly `Zen` (never translated, never lowercased). + - `Stripe`, `OpenCode Black`, `opencode`, `API`, `/models` remain literal. +2. AI domain terms must preserve technical meaning: + - `model` = AI model, not fashion/product model. + - `provider` = AI provider/vendor. + - `Bring Your Own Key` = BYOK concept (user-provided API credential). +3. Billing/top-up language must stay financial: + - `reload` in billing pages means balance top-up/recharge, not page refresh. + - `amount`, `cost`, `usage`, `monthly spending limit` must map to metering/billing context. +4. Placeholder and interpolation safety: + - Keep placeholders unchanged (`{{provider}}`, `{{prefix}}`, `{{amount}}`, etc). + - Keep currency symbols and key ordering intact. + +--- + +### cross-locale risk summary + +- Critical risk focus across locales: billing `reload` text must consistently mean balance top-up/recharge (not page refresh), while product literals and CLI command verbs remain exact. +- `ar` (Arabic): **31** flagged keys (critical: 4, major: 23, minor: 4), with critical literals broken for `Zen`, `Stripe`, and `OpenCode Black` waitlist strings. +- `da` (Danish): **33** flagged keys (critical: 8, major: 18, minor: 7), concentrated in reload/top-up semantics plus onboarding/default-label blockers. +- `de` (German): **34** flagged keys (critical: 6, major: 27, minor: 1), centered on reload/top-up semantics, onboarding command phrasing, and usage metric wording. +- `it` (Italian): **25** flagged keys (critical: 2, major: 18, minor: 5), led by `Zen` casing and waitlist status semantics with broader API/billing wording drift. + +--- + +### remediation workflow for follow-up agents + +1. Pick one locale spec (`20`/`21`/`22`/`23`) and apply only mapped key updates in that locale file. +2. Do not add/remove keys; only edit string values. +3. Preserve placeholders and punctuation contracts. +4. Run app typecheck: + - `bun run typecheck` in `packages/console/app` +5. Run post-fix terminology sanity checks: + - Literal checks in locale files: `Zen`, `Stripe`, `OpenCode Black`, `opencode`, `API`, `/models`. + - `workspace.reload.*` language matches top-up/recharge semantics. + - `API key` labels are ordered naturally in target language. + - Placeholders remain unchanged (`{{provider}}`, `{{prefix}}`, `{{plan}}`, `{{amount}}`, etc). + +--- + +### acceptance criteria + +- All mapped critical and major issues in locale specs are fixed. +- `workspace.nav.zen` is exactly `Zen` in all locales. +- `workspace.billing.linkedToStripe` preserves `Stripe` literal in all locales. +- Workspace billing and usage terminology is technically accurate for AI inference workflows. +- No placeholder regressions. diff --git a/specs/20-workspace-i18n-audit-ar.md b/specs/20-workspace-i18n-audit-ar.md new file mode 100644 index 000000000..5eab6fed9 --- /dev/null +++ b/specs/20-workspace-i18n-audit-ar.md @@ -0,0 +1,99 @@ +## workspace i18n audit - ar + +Arabic translation audit for workspace routes with focus on Zen/AI/billing terminology accuracy. + +--- + +### coverage + +- Route scope: `packages/console/app/src/routes/workspace/**` +- Locale file: `packages/console/app/src/i18n/ar.ts` +- Source reference: `packages/console/app/src/i18n/en.ts` +- Unique keys in scope: **181** +- Flagged keys: **31** (critical: 4, major: 23, minor: 4) + +--- + +### glossary decisions (ar) + +- `Zen`: keep exactly `Zen` +- `OpenCode Black`: keep exactly `OpenCode Black` +- `Stripe`: keep exactly `Stripe` +- `opencode`: keep exactly `opencode` +- `API`: keep exactly `API` +- `/models`: keep exactly `/models` +- `model`: `نموذج` / `نماذج` +- `provider`: `مزوّد` +- `API key`: `مفتاح API` +- `Bring Your Own Key`: `استخدم مفتاحك الخاص` +- `usage`: `الاستخدام` +- `cost`: `التكلفة` +- `billing`: `الفوترة` +- `monthly spending limit`: `حد الإنفاق الشهري` +- `auto reload` (billing context): `إعادة الشحن التلقائي` +- Keep placeholders exactly as-is: `{{provider}}`, `{{prefix}}`, `{{plan}}`, `{{amount}}`. + +--- + +### required key updates + +| key | replace with | severity | reason | +| -------------------------------------- | ------------------------------------------------------------------ | -------- | ---------------------------------------------------- | +| workspace.nav.zen | Zen | critical | Product literal must not be translated. | +| workspace.billing.linkedToStripe | مرتبط بـ Stripe | critical | Keep payment brand literal `Stripe`. | +| workspace.black.waitlist.joined | أنت على قائمة الانتظار لخطة OpenCode Black بقيمة ${{plan}} شهريًا. | critical | Preserve exact literal `OpenCode Black`. | +| workspace.black.waitlist.ready | نحن مستعدون لتسجيلك في خطة OpenCode Black بقيمة ${{plan}} شهريًا. | critical | Preserve exact literal `OpenCode Black`. | +| workspace.nav.apiKeys | مفاتيح API | major | Correct `API` key word order. | +| workspace.keys.title | مفاتيح API | major | Correct `API` key word order. | +| workspace.providers.table.apiKey | مفتاح API | major | Correct `API` key word order. | +| workspace.cost.title | التكلفة | major | `Cost` mistranslated as verb. | +| workspace.usage.table.cost | التكلفة | major | `Cost` mistranslated as verb. | +| workspace.cost.allModels | جميع النماذج | major | Prefer standard AI term `نماذج`. | +| workspace.cost.subscriptionShort | اشتراك | major | Current value is semantically wrong. | +| workspace.payments.table.amount | المبلغ | major | Financial amount mistranslated as quantity. | +| workspace.payments.view | عرض | major | CTA mistranslated as noun “scenery”. | +| workspace.monthlyLimit.setting | جارٍ التعيين... | major | Progress state mistranslated. | +| workspace.settings.defaultName | الافتراضي | major | Default label mistranslated. | +| workspace.newUser.step.login.before | شغّل | major | CLI imperative “Run” mistranslated. | +| workspace.members.role.admin | مسؤول | major | Spelling error. | +| workspace.reload.title | إعادة الشحن التلقائي | major | Billing `reload` means top-up/recharge, not refresh. | +| workspace.reload.enableAutoReload | تفعيل إعادة الشحن التلقائي | major | Must reflect top-up semantics. | +| workspace.reload.reloadAmount | مبلغ إعادة الشحن $ | major | Must reflect recharge amount. | +| workspace.reload.failedAt | فشلت إعادة الشحن في | major | Must reflect recharge failure. | +| workspace.reload.disabled.state | معطّل | major | Incorrect toggle state term. | +| workspace.reload.enabled.after | عندما يصل الرصيد إلى | major | `balance` mistranslated as “equilibrium”. | +| workspace.reload.enable | تفعيل | major | CTA form mistranslated. | +| workspace.reload.disabled.before | إعادة الشحن التلقائي | major | Align phrase with recharge semantics. | +| workspace.reload.enabled.before | إعادة الشحن التلقائي | major | Align phrase with recharge semantics. | +| workspace.reload.enabled.middle | سنعيد شحن رصيدك بمبلغ | major | Must explicitly mean topping up balance. | +| workspace.billing.addAction | إضافة | minor | CTA grammatical form fix. | +| workspace.billing.manage | إدارة | minor | CTA grammatical form fix. | +| workspace.keys.empty | أنشئ مفتاح API لبوابة opencode | minor | Improve technical clarity and ordering. | +| workspace.newUser.feature.lockin.title | بدون احتجاز بمزوّد واحد | minor | Better conveys “No Lock-in”. | + +--- + +### implementation batches + +1. **Brand literals first (critical)** + - `workspace.nav.zen`, `workspace.billing.linkedToStripe`, `workspace.black.waitlist.joined`, `workspace.black.waitlist.ready` +2. **Reload/recharge semantics** + - `workspace.reload.*` flagged keys to ensure top-up meaning (not page refresh) +3. **Billing/payment terminology** + - `workspace.cost.title`, `workspace.usage.table.cost`, `workspace.payments.table.amount`, `workspace.payments.view`, `workspace.monthlyLimit.setting` +4. **API/workspace wording fixes** + - API-key ordering keys, `workspace.settings.defaultName`, `workspace.members.role.admin`, `workspace.newUser.step.login.before` +5. **Minor CTA/clarity polish** + - `workspace.billing.addAction`, `workspace.billing.manage`, `workspace.keys.empty`, `workspace.newUser.feature.lockin.title` + +--- + +### acceptance checks for follow-up fix agent + +- `workspace.nav.zen` value is exactly `Zen`. +- `workspace.billing.linkedToStripe` contains `Stripe` literal. +- `workspace.black.waitlist.joined` and `workspace.black.waitlist.ready` keep `OpenCode Black` exactly. +- No `workspace.reload.*` string implies page refresh; all imply balance top-up/recharge. +- API key labels use `مفتاح API` / `مفاتيح API` ordering. +- Preserve literals exactly: `Zen`, `Stripe`, `OpenCode Black`, `opencode`, `API`, `/models`. +- All placeholders remain unchanged (`{{provider}}`, `{{prefix}}`, `{{plan}}`, `{{amount}}`). diff --git a/specs/21-workspace-i18n-audit-da.md b/specs/21-workspace-i18n-audit-da.md new file mode 100644 index 000000000..c0c0ef0c0 --- /dev/null +++ b/specs/21-workspace-i18n-audit-da.md @@ -0,0 +1,103 @@ +## workspace i18n audit - da + +Danish translation audit for workspace routes with emphasis on AI-provider, billing, and workspace-management accuracy. + +--- + +### coverage + +- Route scope: `packages/console/app/src/routes/workspace/**` +- Locale file: `packages/console/app/src/i18n/da.ts` +- Source reference: `packages/console/app/src/i18n/en.ts` +- Unique locale keys used in scope: **181** +- Flagged keys: **33** (critical: 8, major: 18, minor: 7) + +--- + +### glossary decisions (da) + +- `Zen`: keep exactly `Zen` +- `Stripe`: keep exactly `Stripe` +- `OpenCode Black`: keep exactly `OpenCode Black` +- `opencode`: keep exactly `opencode` +- `API`: keep exactly `API` +- `/models`: keep exactly `/models` +- `API key`: `API-nøgle` +- `billing`: `fakturering` +- `reload` in wallet context: `genopfyldning` (top-up), never page refresh wording + +--- + +### required key updates + +| key | current da | replace with | severity | reason | +| ------------------------------------- | --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| workspace.newUser.step.login.before | Løbe | Kør | critical | Wrong verb for CLI instruction (`opencode auth login`). | +| workspace.settings.defaultName | Misligholdelse | Standard | critical | Wrong meaning for default-label UI text. | +| workspace.reload.title | Automatisk genindlæsning | Automatisk genopfyldning | critical | `reload` here is balance top-up, not page reload. | +| workspace.reload.disabled.before | Automatisk genindlæsning er | Automatisk genopfyldning er | critical | Same billing top-up semantic issue. | +| workspace.reload.enabled.before | Automatisk genindlæsning er | Automatisk genopfyldning er | critical | Same billing top-up semantic issue. | +| workspace.reload.enableAutoReload | Aktiver automatisk genindlæsning | Aktiver automatisk genopfyldning | critical | Same billing top-up semantic issue. | +| workspace.reload.reloadAmount | Genindlæs $ | Genopfyld $ | critical | Top-up amount label, not page reload action. | +| workspace.reload.failedAt | Genindlæsning mislykkedes kl | Genopfyldning mislykkedes kl | critical | Error refers to failed recharge event. | +| workspace.reload.disabled.after | Aktiver for automatisk at genindlæse, når balancen er lav. | Aktiver for automatisk at genopfylde, når saldoen er lav. | major | Must describe low-balance auto top-up behavior. | +| workspace.reload.enabled.middle | Vi genindlæser | Vi genopfylder | major | Must describe automatic recharge action. | +| workspace.reload.disabled.state | handicappet | deaktiveret | major | Wrong/off-tone toggle-state wording. | +| workspace.members.save | Spare | Gem | major | Current word means monetary savings, not save changes. | +| workspace.providers.save | Spare | Gem | major | Current word means monetary savings, not save changes. | +| workspace.reload.save | Spare | Gem | major | Current word means monetary savings, not save changes. | +| workspace.settings.save | Spare | Gem | major | Current word means monetary savings, not save changes. | +| workspace.keys.copyApiKey | Kopiér nøglen API | Kopiér API-nøgle | major | Incorrect technical phrase order. | +| workspace.newUser.copyApiKey | Kopiér nøglen API | Kopiér API-nøgle | major | Incorrect technical phrase order. | +| workspace.providers.placeholder | Indtast nøglen {{provider}} API ({{prefix}}...) | Indtast {{provider}} API-nøgle ({{prefix}}...) | major | Technical phrase is malformed; placeholders must be preserved exactly. | +| workspace.newUser.feature.tested.body | Vi har benchmarket og testet modeller specifikt til kodningsmidler for at sikre den bedste ydeevne. | Vi har benchmarket og testet modeller specifikt til kodningsagenter for at sikre den bedste ydeevne. | major | Wrong domain noun (`kodningsmidler` != coding agents). | +| workspace.payments.table.receipt | Modtagelse | Kvittering | major | Wrong payment term for receipt column. | +| workspace.payments.view | Udsigt | Vis | major | Wrong CTA meaning for “View” action. | +| workspace.black.waitlist.left | Venstre | Forladt | major | Wrong meaning (“left” direction vs status). | +| workspace.usage.table.output | Produktion | Output | major | Wrong AI metering term in token table. | +| workspace.usage.breakdown.output | Produktion | Output | major | Wrong AI metering term in token breakdown. | +| workspace.usage.table.cost | Koste | Omkostning | major | Wrong part of speech for metric label. | +| workspace.cost.title | Koste | Omkostninger | major | Wrong part of speech for section heading. | +| workspace.members.edit | Redigere | Rediger | minor | Use imperative CTA form. | +| workspace.providers.edit | Redigere | Rediger | minor | Use imperative CTA form. | +| workspace.reload.edit | Redigere | Rediger | minor | Use imperative CTA form. | +| workspace.settings.edit | Redigere | Rediger | minor | Use imperative CTA form. | +| workspace.billing.addAction | Tilføje | Tilføj | minor | Use imperative CTA form. | +| workspace.billing.manage | Styre | Administrer | minor | Better management CTA wording in product UI. | +| workspace.black.waitlist.enroll | Indskrive | Tilmeld | minor | Better enrollment CTA for subscription/waitlist flow. | + +--- + +### implementation batches + +1. **Critical blockers: onboarding + default + reload semantics** + - `workspace.newUser.step.login.before` + - `workspace.settings.defaultName` + - `workspace.reload.title` + - `workspace.reload.disabled.before` + - `workspace.reload.enabled.before` + - `workspace.reload.enableAutoReload` + - `workspace.reload.reloadAmount` + - `workspace.reload.failedAt` +2. **Billing top-up and save-action correctness** + - Remaining `workspace.reload.*` in table + - `workspace.members.save`, `workspace.providers.save`, `workspace.reload.save`, `workspace.settings.save` +3. **API and provider terminology cleanup** + - `workspace.keys.copyApiKey`, `workspace.newUser.copyApiKey`, `workspace.providers.placeholder` +4. **Usage/payments/workspace label fixes** + - `workspace.newUser.feature.tested.body` + - `workspace.payments.table.receipt`, `workspace.payments.view` + - `workspace.black.waitlist.left` + - `workspace.usage.table.output`, `workspace.usage.breakdown.output`, `workspace.usage.table.cost`, `workspace.cost.title` +5. **CTA polish (minor imperative consistency)** + - all `*.edit`, `workspace.billing.addAction`, `workspace.billing.manage`, `workspace.black.waitlist.enroll` + +--- + +### acceptance checks for follow-up fix agent + +- Preserve literals exactly: `Zen`, `Stripe`, `OpenCode Black`, `opencode`, `API`, `/models`. +- Preserve placeholders exactly (eg `{{provider}}`, `{{prefix}}`, `{{plan}}`, `{{amount}}`). +- All `workspace.reload.*` labels must mean balance top-up/recharge (`genopfyld*`), never page refresh (`genindlæs*`). +- Save CTAs must reflect saving changes (`Gem` / `Gemmer...`), not savings-money wording. +- AI metering labels in usage tables remain technically correct (`Input`, `Output`, cost nouns). diff --git a/specs/22-workspace-i18n-audit-de.md b/specs/22-workspace-i18n-audit-de.md new file mode 100644 index 000000000..cfc782008 --- /dev/null +++ b/specs/22-workspace-i18n-audit-de.md @@ -0,0 +1,95 @@ +## workspace i18n audit - de + +German translation audit for workspace routes with focus on CLI onboarding clarity, AI metric terminology, and billing top-up semantics. + +--- + +### coverage + +- Route scope: `packages/console/app/src/routes/workspace/**` +- Locale file: `packages/console/app/src/i18n/de.ts` +- Source reference: `packages/console/app/src/i18n/en.ts` +- Unique keys in scope: **181** +- Flagged keys: **34** (critical: 6, major: 27, minor: 1) + +--- + +### glossary decisions (de) + +- Preserve literals exactly: `Zen`, `Stripe`, `OpenCode Black`, `opencode`, `API`, `/models` +- Preserve placeholders exactly (`{{provider}}`, `{{amount}}`, `{{plan}}`, `{{prefix}}`, etc.) +- `API key`: `API-Schlüssel` +- `usage`: `Nutzung` +- `cost`: `Kosten`; payments column `Betrag` +- `billing`: `Abrechnung` +- Billing `reload` semantics: `Aufladung` / `aufladen` (never `Neuladen`) +- AI cost metrics: keep `Input`, `Output`, `Reasoning` + +--- + +### required key updates + +| key | replace with | severity | reason | +| ------------------------------------- | ---------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------- | +| workspace.newUser.step.login.before | Führe | critical | Wrong CLI verb in onboarding instruction. | +| workspace.monthlyLimit.set | Festlegen | critical | CTA mistranslated as noun (`Satz`). | +| workspace.reload.title | Automatische Aufladung | critical | Billing top-up semantics, not page reload. | +| workspace.reload.disabled.after | Aktivieren Sie diese Option, damit bei niedrigem Kontostand automatisch aufgeladen wird. | critical | Uses `neu laden`; must use billing top-up phrasing. | +| workspace.reload.enableAutoReload | Automatische Aufladung aktivieren | critical | Primary toggle must follow billing top-up semantics. | +| workspace.black.subscription.message | Sie haben OpenCode Black für ${{plan}} pro Monat abonniert. | critical | Missing `$` before `{{plan}}`. | +| workspace.newUser.step.models.before | Starte opencode und führe | major | Unidiomatic command phrasing before `/models`. | +| workspace.newUser.copyApiKey | API-Schlüssel kopieren | major | Broken technical term word order. | +| workspace.keys.copyApiKey | API-Schlüssel kopieren | major | Broken technical term word order. | +| workspace.models.table.enabled | Aktiviert | major | Wrong toggle-state label. | +| workspace.providers.saving | Wird gespeichert... | major | `Sparen...` means saving money, not save state. | +| workspace.members.inviting | Wird eingeladen... | major | Incorrect invite loading state wording. | +| workspace.members.saving | Wird gespeichert... | major | `Sparen...` means saving money, not save state. | +| workspace.monthlyLimit.setting | Wird gesetzt... | major | In-progress state should be verbal action. | +| workspace.payments.table.amount | Betrag | major | Financial column mistranslated as quantity. | +| workspace.payments.view | Anzeigen | major | CTA mistranslated as noun (`Sicht`). | +| workspace.usage.table.input | Input | major | AI billing metric should remain technical term. | +| workspace.usage.table.output | Output | major | AI billing metric should remain technical term. | +| workspace.usage.breakdown.input | Input | major | AI billing metric should remain technical term. | +| workspace.usage.breakdown.output | Output | major | AI billing metric should remain technical term. | +| workspace.usage.breakdown.reasoning | Reasoning | major | AI billing metric should remain technical term. | +| workspace.reload.disabled.before | Automatische Aufladung ist | major | Should use top-up semantics instead of `Nachladen`. | +| workspace.reload.enabled.before | Automatische Aufladung ist | major | Should use top-up semantics instead of `Nachladen`. | +| workspace.reload.enabled.state | aktiviert | major | `ermöglicht` is wrong state adjective for toggle. | +| workspace.reload.enabled.middle | Wir laden auf | major | Should be account top-up verb (`aufladen`). | +| workspace.reload.enabled.after | sobald der Kontostand | major | `Gleichgewicht` is wrong meaning for account balance. | +| workspace.reload.reloadAmount | Aufladebetrag $ | major | Label should reflect top-up amount semantics. | +| workspace.reload.whenBalanceReaches | Wenn der Kontostand $ erreicht | major | Use account-balance term `Kontostand`. | +| workspace.reload.failedAt | Aufladung fehlgeschlagen am | major | Error copy should use top-up semantics. | +| workspace.reload.saving | Wird gespeichert... | major | `Sparen...` means saving money, not save state. | +| workspace.black.waitlist.left | Verlassen | major | `Links` is incorrect meaning. | +| workspace.black.waitlist.joined | Sie stehen auf der Warteliste für den OpenCode Black Tarif für ${{plan}} pro Monat. | major | Product name order/phrase is broken. | +| workspace.black.waitlist.ready | Wir können Sie jetzt in den OpenCode Black Tarif für ${{plan}} pro Monat aufnehmen. | major | Product name order/phrase is broken. | +| workspace.black.subscription.resetsIn | Zurückgesetzt in | minor | Improve pre-duration label grammar. | + +--- + +### implementation batches + +1. **Critical blockers first** + - `workspace.newUser.step.login.before`, `workspace.monthlyLimit.set`, `workspace.reload.title`, `workspace.reload.disabled.after`, `workspace.reload.enableAutoReload`, `workspace.black.subscription.message` +2. **Reload semantics sweep** + - All `workspace.reload.*` keys listed above (state labels, helper text, error text, amount labels) +3. **Onboarding + API key wording** + - `workspace.newUser.step.models.before`, `workspace.newUser.copyApiKey`, `workspace.keys.copyApiKey` +4. **Async/CTA quality fixes** + - `workspace.providers.saving`, `workspace.members.inviting`, `workspace.members.saving`, `workspace.monthlyLimit.setting`, `workspace.payments.view`, `workspace.reload.saving` +5. **AI usage/payments terminology** + - usage `Input/Output/Reasoning` keys + `workspace.payments.table.amount` +6. **OpenCode Black waitlist copy** + - `workspace.black.waitlist.left`, `workspace.black.waitlist.joined`, `workspace.black.waitlist.ready`, `workspace.black.subscription.resetsIn` + +--- + +### acceptance checks for follow-up fix agent + +- Flagged totals align with this spec: **34** (`critical` 6, `major` 27, `minor` 1). +- `workspace.nav.zen` remains exactly `Zen`. +- Literals remain exact where present: `Stripe`, `OpenCode Black`, `opencode`, `API`, `/models`. +- Billing top-up copy consistently uses `Aufladung` / `aufladen` (not `Neuladen`/`Nachladen`). +- Usage metrics remain technical terms: `Input`, `Output`, `Reasoning`. +- Placeholders remain unchanged in all updated strings. diff --git a/specs/23-workspace-i18n-audit-it.md b/specs/23-workspace-i18n-audit-it.md new file mode 100644 index 000000000..da1b72826 --- /dev/null +++ b/specs/23-workspace-i18n-audit-it.md @@ -0,0 +1,86 @@ +## workspace i18n audit - it + +Italian translation audit for workspace routes with focus on Zen brand integrity and AI/billing term precision. + +--- + +### coverage + +- Route scope: `packages/console/app/src/routes/workspace/**` +- Locale file: `packages/console/app/src/i18n/it.ts` +- Source reference: `packages/console/app/src/i18n/en.ts` +- Unique keys in scope: **181** (`177` `workspace.*` + `4` `common.*`) +- Flagged keys: **25** (critical: 2, major: 18, minor: 5) + +--- + +### glossary decisions (it) + +- `Zen`: keep exactly `Zen` +- `Stripe`: keep exactly `Stripe` +- `OpenCode Black`: keep exactly `OpenCode Black` +- `opencode`: keep exactly `opencode` +- `API`: keep exactly `API` +- `/models`: keep exactly `/models` +- `API key`: `chiave API` / `chiavi API` +- `billing`: `fatturazione` +- `auto reload` (billing): `ricarica automatica` +- `reload` in billing context: top-up/recharge semantics (never page refresh) + +--- + +### required key updates + +| key | current_it | replace with | severity | reason | +| -------------------------------------- | ------------------------------------------------------------------- | ----------------------------------------------------------------------- | -------- | --------------------------------------------------------- | +| workspace.nav.zen | zen | Zen | critical | Brand literal must match exactly. | +| workspace.black.waitlist.left | Sinistra | Uscito dalla lista d'attesa | critical | `Left` is waitlist status, not direction. | +| workspace.billing.manage | Maneggio | Gestisci | major | Wrong lexical meaning for CTA. | +| workspace.billing.subtitle.beforeLink | Gestire i metodi di pagamento. | Gestisci i metodi di pagamento. | major | UI copy should be imperative, not infinitive. | +| workspace.black.waitlist.joined | Sei in lista d'attesa per il piano nero ${{plan}} al mese OpenCode. | Sei in lista d'attesa per il piano OpenCode Black da ${{plan}} al mese. | major | Preserve exact product naming and natural billing phrase. | +| workspace.black.waitlist.leaving | In partenza... | Uscita in corso... | major | Wrong async action meaning for waitlist exit. | +| workspace.black.subscription.resetsIn | Si reimposta | Si reimposta tra | major | Missing connector for duration composition. | +| workspace.members.inviting | Invitante... | Invito in corso... | major | Incorrect grammar for in-progress invite state. | +| workspace.members.role.admin | Ammin | Admin | major | Role label typo / non-standard abbreviation. | +| workspace.members.saving | Risparmio... | Salvataggio in corso... | major | Persistence action mistranslated as money saving. | +| workspace.providers.saving | Risparmio... | Salvataggio in corso... | major | Persistence action mistranslated as money saving. | +| workspace.reload.saving | Risparmio... | Salvataggio in corso... | major | Persistence action mistranslated as money saving. | +| workspace.monthlyLimit.setting | Collocamento... | Impostazione in corso... | major | Wrong lexical meaning for `Setting...`. | +| workspace.newUser.step.login.before | Correre | Esegui | major | CLI instruction must convey `Run`. | +| workspace.payments.table.amount | Quantità | Importo | major | Financial amount requires `Importo`. | +| workspace.keys.title | API Chiavi | Chiavi API | major | Technical term order is incorrect. | +| workspace.nav.apiKeys | API Chiavi | Chiavi API | major | Technical term order is incorrect. | +| workspace.providers.table.apiKey | API Chiave | Chiave API | major | Technical term order is incorrect. | +| workspace.providers.title | Porta la tua chiave | Bring Your Own Key (BYOK) | major | Preserve BYOK concept explicitly in AI-provider context. | +| workspace.reload.enabled.after | quando l'equilibrio raggiunge | quando il saldo raggiunge | major | Billing semantic error (`saldo`, not physical balance). | +| workspace.billing.addAction | Aggiungere | Aggiungi | minor | CTA should be imperative form. | +| workspace.payments.view | Visualizzazione | Visualizza | minor | CTA should be verb, not noun. | +| workspace.reload.disabled.before | La ricarica automatica lo è | La ricarica automatica è | minor | Remove incorrect pronoun for grammatical sentence. | +| workspace.reload.enabled.before | La ricarica automatica lo è | La ricarica automatica è | minor | Remove incorrect pronoun for grammatical sentence. | +| workspace.newUser.feature.lockin.title | Nessun blocco | Nessun lock-in | minor | Prefer established product/industry term. | + +--- + +### implementation batches + +1. **Critical brand/status fixes** + - `workspace.nav.zen`, `workspace.black.waitlist.left` +2. **Billing and waitlist semantics** + - `workspace.billing.manage`, `workspace.billing.subtitle.beforeLink`, `workspace.black.waitlist.joined`, `workspace.black.waitlist.leaving`, `workspace.black.subscription.resetsIn`, `workspace.reload.enabled.after`, `workspace.payments.table.amount` +3. **Async/action grammar correctness** + - `workspace.members.inviting`, all `*.saving` keys, `workspace.monthlyLimit.setting`, `workspace.newUser.step.login.before` +4. **AI/API terminology consistency** + - `workspace.keys.title`, `workspace.nav.apiKeys`, `workspace.providers.table.apiKey`, `workspace.providers.title` +5. **Minor CTA/style normalizations** + - `workspace.billing.addAction`, `workspace.payments.view`, `workspace.reload.disabled.before`, `workspace.reload.enabled.before`, `workspace.newUser.feature.lockin.title` + +--- + +### acceptance checks for follow-up fix agent + +- `workspace.nav.zen` is exactly `Zen`. +- Waitlist status strings use state semantics (`joined`, `leaving`, `left`) and preserve `OpenCode Black`. +- Billing `reload` copy clearly means balance top-up/recharge. +- `Chiave API` / `Chiavi API` ordering is consistent across workspace UI. +- BYOK meaning remains explicit in provider setup title. +- All placeholders are preserved exactly (`{{plan}}`, `{{provider}}`, `{{prefix}}`, `{{amount}}`, etc.).