diff --git a/.changeset/12956-console-copy-system.md b/.changeset/12956-console-copy-system.md new file mode 100644 index 0000000000..402c529a6c --- /dev/null +++ b/.changeset/12956-console-copy-system.md @@ -0,0 +1,7 @@ +--- +'@object-ui/i18n': patch +'@object-ui/app-shell': patch +'@object-ui/console': patch +--- + +Console copy names the system the user is already in, not the cloud noun "environment" (objectui#12956). Inside a running deployment, the Settings subtitle and its first category, the timezone prompt, the read-rate banner, the sign-in, sign-up and email-verification notices, the profile password descriptions, the home page loading, empty and build-refusal states, the system-settings quick action, the Connect-an-agent endpoint card and the AI model status error now say "this system" (zh 「本系统」), or drop the noun where the sentence reads without it. The Settings category that holds Company, Branding and Localization reads "General" (zh 「常规」). All ten language packs follow; no key is renamed, added or removed. Inline English fallbacks at the call sites follow the `en` values. diff --git a/apps/console/src/pages/auth/AuthLayout.tsx b/apps/console/src/pages/auth/AuthLayout.tsx index 9e5cf0c488..4859c72d6f 100644 --- a/apps/console/src/pages/auth/AuthLayout.tsx +++ b/apps/console/src/pages/auth/AuthLayout.tsx @@ -154,7 +154,7 @@ export function AuthLayout({ children, formWidth = 'sm' }: AuthLayoutProps) { {host} diff --git a/apps/console/src/pages/auth/RegisterPage.tsx b/apps/console/src/pages/auth/RegisterPage.tsx index 7715410b20..1d55ad0e91 100644 --- a/apps/console/src/pages/auth/RegisterPage.tsx +++ b/apps/console/src/pages/auth/RegisterPage.tsx @@ -238,7 +238,7 @@ export function RegisterPage() { title={t('auth.register.title', { defaultValue: 'Create an account' })} description={t('auth.register.errors.selfRegistrationClosed', { defaultValue: - 'Self-registration is not open on this environment. Ask an administrator for an invitation.', + 'Self-registration is not open on this system. Ask an administrator for an invitation.', })} />

diff --git a/apps/console/src/pages/auth/VerifyEmailPromptPage.tsx b/apps/console/src/pages/auth/VerifyEmailPromptPage.tsx index f8c800a718..a2d28f28b4 100644 --- a/apps/console/src/pages/auth/VerifyEmailPromptPage.tsx +++ b/apps/console/src/pages/auth/VerifyEmailPromptPage.tsx @@ -83,7 +83,7 @@ export function VerifyEmailPromptPage() { (err as Error)?.message?.trim() || t('auth.verifyEmail.resendUnavailable', { defaultValue: - 'Email delivery may not be configured for this environment. Contact support if this persists.', + 'Email delivery may not be configured for this system. Contact support if this persists.', }); setResent(false); setResendError(description); diff --git a/apps/console/src/pages/settings/__tests__/WorkspaceTimezonePrompt.test.tsx b/apps/console/src/pages/settings/__tests__/WorkspaceTimezonePrompt.test.tsx index 1f88234530..ea0240d8ca 100644 --- a/apps/console/src/pages/settings/__tests__/WorkspaceTimezonePrompt.test.tsx +++ b/apps/console/src/pages/settings/__tests__/WorkspaceTimezonePrompt.test.tsx @@ -194,7 +194,7 @@ describe('asks once while the zone is the default and the session may write it ( it('en: renders once, pre-filled with the browser zone, naming the current default', async () => { renderPrompt(ADMIN, 'en'); const dialog = await screen.findByRole('dialog'); - expect(within(dialog).getByText('Set the environment timezone')).toBeTruthy(); + expect(within(dialog).getByText('Set the system timezone')).toBeTruthy(); expect(within(dialog).getByText(/platform default timezone, UTC\./)).toBeTruthy(); // The Settings page's own field for the key, pre-filled with the browser's zone. const field = within(dialog).getByLabelText('Default timezone') as HTMLInputElement; @@ -208,10 +208,10 @@ describe('asks once while the zone is the default and the session may write it ( it('zh-CN: the same prompt reads in the pack, pre-filled the same way', async () => { renderPrompt(ADMIN, 'zh'); const dialog = await screen.findByRole('dialog'); - expect(within(dialog).getByText('设置环境时区')).toBeTruthy(); + expect(within(dialog).getByText('设置系统时区')).toBeTruthy(); expect(within(dialog).getByRole('button', { name: '保持默认' })).toBeTruthy(); expect(within(dialog).getByRole('button', { name: '设置时区' })).toBeTruthy(); - expect(screen.queryByText('Set the environment timezone')).toBeNull(); + expect(screen.queryByText('Set the system timezone')).toBeNull(); // An input carrying a suggestion `list` is a combobox to assistive tech. expect((within(dialog).getByRole('combobox') as HTMLInputElement).value).toBe(BROWSER_ZONE); }); @@ -268,7 +268,7 @@ describe('confirm writes once through the Settings write path; decline writes no const puts = settingsCalls('PUT'); expect(puts).toHaveLength(1); expect(JSON.parse(String((puts[0][1] as RequestInit).body))).toEqual({ timezone: 'Europe/Berlin' }); - expect(toastSuccess).toHaveBeenCalledWith('Environment timezone set to Europe/Berlin'); + expect(toastSuccess).toHaveBeenCalledWith('System timezone set to Europe/Berlin'); }); it('confirm without editing writes the pre-filled browser zone', async () => { diff --git a/apps/console/src/pages/system/ProfilePage.tsx b/apps/console/src/pages/system/ProfilePage.tsx index 1dcdce5b6b..ac26f2fd2f 100644 --- a/apps/console/src/pages/system/ProfilePage.tsx +++ b/apps/console/src/pages/system/ProfilePage.tsx @@ -709,7 +709,7 @@ function PasswordCard({ changePassword, setInitialPassword, hasLocalPassword, hi } else { await setInitialPassword(newPassword); setSuccess(t('profile.password.localSet', { - defaultValue: 'Local password set. You can now sign in with email and password on this environment.', + defaultValue: 'Local password set. You can now sign in with email and password.', })); setHasPassword(true); onPasswordSet?.(); @@ -739,11 +739,11 @@ function PasswordCard({ changePassword, setInitialPassword, hasLocalPassword, hi {hasPassword ? t('profile.password.changeDescription', { - defaultValue: 'Update the password you use to sign in to this environment.', + defaultValue: 'Update the password you use to sign in.', }) : t('profile.password.setDescription', { defaultValue: - 'You signed in via single sign-on. Set a local password to also sign in with email and password on this environment.', + 'You signed in via single sign-on. Set a local password to also sign in with email and password.', })} diff --git a/packages/app-shell/src/console/auth/signUpRefusalMessages.ts b/packages/app-shell/src/console/auth/signUpRefusalMessages.ts index 6b4eb1ce0c..cbad25d734 100644 --- a/packages/app-shell/src/console/auth/signUpRefusalMessages.ts +++ b/packages/app-shell/src/console/auth/signUpRefusalMessages.ts @@ -29,7 +29,7 @@ export function signUpRefusalMessages(t: TranslateFn): Record { // invitation only, or only from allowlisted email domains. SELF_REGISTRATION_CLOSED: t('auth.register.errors.selfRegistrationClosed', { defaultValue: - 'Self-registration is not open on this environment. Ask an administrator for an invitation.', + 'Self-registration is not open on this system. Ask an administrator for an invitation.', }), EMAIL_DOMAIN_NOT_ALLOWED: t('auth.register.errors.emailDomainNotAllowed', { defaultValue: diff --git a/packages/app-shell/src/console/home/HomePage.tsx b/packages/app-shell/src/console/home/HomePage.tsx index 5f98e4f77f..c1ed9951f1 100644 --- a/packages/app-shell/src/console/home/HomePage.tsx +++ b/packages/app-shell/src/console/home/HomePage.tsx @@ -349,7 +349,7 @@ export function HomePage() { // the zero-app empty state as its description. Localized in all ten packs. const authoringGateReason = t('home.build.noCapability', { defaultValue: - "Building apps isn't available in this environment — it requires the “Manage Metadata” permission, which your account doesn't have.", + "Building apps isn't available in this system — it requires the “Manage Metadata” permission, which your account doesn't have.", }); const marketplaceGateReason = t('home.template.marketplaceDisabled', { defaultValue: 'This runtime has no app marketplace configured, so there are no templates to install here.', @@ -472,7 +472,7 @@ export function HomePage() { if (loading || !isAdminResolved) { return (

-
{t('home.loading', { defaultValue: 'Loading environment…' })}
+
{t('home.loading', { defaultValue: 'Loading…' })}
); } @@ -560,7 +560,7 @@ export function HomePage() { {t('home.noAppsDescription', { defaultValue: - 'Your environment is being set up — apps your admin shares with you will show up here.', + 'The system is being set up — apps your admin shares with you will show up here.', })} diff --git a/packages/app-shell/src/console/home/QuickActions.tsx b/packages/app-shell/src/console/home/QuickActions.tsx index 742ffbae1e..2641b5056c 100644 --- a/packages/app-shell/src/console/home/QuickActions.tsx +++ b/packages/app-shell/src/console/home/QuickActions.tsx @@ -51,7 +51,7 @@ export function QuickActions() { { id: 'system-settings', label: t('home.quickActions.systemSettings', { defaultValue: 'System Settings' }), - description: t('home.quickActions.systemSettingsDesc', { defaultValue: 'Configure your environment' }), + description: t('home.quickActions.systemSettingsDesc', { defaultValue: 'Configure your system' }), icon: Settings, // #3611 — the system hub, not the bare `/apps/setup` (which is the // "No Apps Configured" empty state's own URL on a zero-app deployment). diff --git a/packages/app-shell/src/layout/ReadRateBanner.tsx b/packages/app-shell/src/layout/ReadRateBanner.tsx index e858cbb09c..3218131f79 100644 --- a/packages/app-shell/src/layout/ReadRateBanner.tsx +++ b/packages/app-shell/src/layout/ReadRateBanner.tsx @@ -95,9 +95,9 @@ export function ReadRateBanner({ apiBase, className }: ReadRateBannerProps) { const title = noWrites ? t('console.readRate.noWritesTitle', { - defaultValue: 'Reads with no writes at all in this environment', + defaultValue: 'Reads with no writes at all in this system', }) - : t('console.readRate.ratioTitle', { defaultValue: 'Unusual read volume in this environment' }); + : t('console.readRate.ratioTitle', { defaultValue: 'Unusual read volume in this system' }); const body = noWrites ? t('console.readRate.noWrites', { diff --git a/packages/i18n/src/__tests__/console-copy-system-noun-12956.test.ts b/packages/i18n/src/__tests__/console-copy-system-noun-12956.test.ts new file mode 100644 index 0000000000..80a7759ff3 --- /dev/null +++ b/packages/i18n/src/__tests__/console-copy-system-noun-12956.test.ts @@ -0,0 +1,68 @@ +/** + * objectui#12956 — inside the running system, the console does not call + * itself 「此环境 / 本环境」. + * + * Ruling A on objectstack-ai/cloud#3002 keeps 「环境」 as the cloud's noun for + * a deployment and keeps it out of the way of a user who is already inside + * one. The strings in the families below are shown by every ObjectStack + * deployment to that user, so they say 「本系统」, or drop the noun where the + * sentence reads without it. + * + * The pin enumerates every string under each named family in the `zh` pack, + * so a value added to one of these families later is held too. It asserts the + * enumeration is non-empty per family first: a family path that stopped + * resolving would otherwise pass with nothing checked. + * + * Out of scope on purpose (the card's exclusions): `console.settingsView`, + * where 「环境变量」 means environment variables, and `cloudOnboarding.*`, + * which explains the cloud noun once. + */ +import { describe, it, expect } from 'vitest'; +import { builtInLocales } from '../locales'; + +const FAMILIES = [ + 'console.settingsHub', + 'console.workspaceTimezonePrompt', + 'console.readRate', + 'auth', + 'profile.password', + 'home', + 'connectAgent', + 'aiModelStatus', +] as const; + +/** "This / the said environment", the phrasing the ruling retires here. */ +const SELF_AS_ENVIRONMENT = /[此本该]环境/u; + +function resolve(root: unknown, path: string): unknown { + return path.split('.').reduce( + (node, key) => (node && typeof node === 'object' ? (node as Record)[key] : undefined), + root, + ); +} + +function strings(node: unknown, path: string, out: Array<[string, string]> = []): Array<[string, string]> { + if (typeof node === 'string') out.push([path, node]); + else if (node && typeof node === 'object') { + for (const [key, child] of Object.entries(node)) strings(child, `${path}.${key}`, out); + } + return out; +} + +describe('console copy names the system the user is in, not the cloud noun (objectui#12956)', () => { + const zh = builtInLocales.zh as unknown; + + it.each(FAMILIES)('zh %s carries no 此环境 / 本环境 / 该环境', (family) => { + const entries = strings(resolve(zh, family), family); + expect(entries.length).toBeGreaterThan(0); + const offenders = entries.filter(([, value]) => SELF_AS_ENVIRONMENT.test(value)); + expect(offenders).toEqual([]); + }); + + it('the matcher catches each retired spelling and leaves environment variables alone', () => { + expect(SELF_AS_ENVIRONMENT.test('本环境读取量异常')).toBe(true); + expect(SELF_AS_ENVIRONMENT.test('您正在登录此环境')).toBe(true); + expect(SELF_AS_ENVIRONMENT.test('该环境可能未运行 AI 服务')).toBe(true); + expect(SELF_AS_ENVIRONMENT.test('已被环境变量锁定')).toBe(false); + }); +}); diff --git a/packages/i18n/src/__tests__/ellipsis-glyph-3878.test.ts b/packages/i18n/src/__tests__/ellipsis-glyph-3878.test.ts index 736dc080e6..ad25c47c98 100644 --- a/packages/i18n/src/__tests__/ellipsis-glyph-3878.test.ts +++ b/packages/i18n/src/__tests__/ellipsis-glyph-3878.test.ts @@ -333,7 +333,10 @@ describe('objectui#3878 — the ten packs spell the ellipsis U+2026 and only U+2 const LOADING_GROUP_EN = 'Loading…'; /** - * The group as measured on `main` @ `22ba9271f`. Pinned by name so the + * The group as measured on `main` @ `22ba9271f`, plus `home.loading`, which + * joined when objectui#12956 dropped the cloud noun from its `en` value + * (`Loading environment…` became `Loading…`); every pack now renders it the + * way it renders the rest of the group. Pinned by name so the * uniformity rule below cannot go green by the group quietly emptying out — * a uniformity assertion over nothing passes, which is this pin's failure mode. */ @@ -346,6 +349,7 @@ const LOADING_GROUP = [ 'fields.recipient.loading', 'grid.bulk.loading', 'grid.import.historyLoading', + 'home.loading', 'lookup.loading', 'report.loading', ] as const; @@ -363,16 +367,16 @@ const LOADING_GROUP = [ const LOADING_GROUP_FORKS: ReadonlyArray<{ lang: Lang; key: string; value: string }> = []; describe('objectui#5972 — each pack renders the merged `Loading…` group exactly one way', () => { - it('derives the group from en and finds exactly the ten keys pinned above', () => { + it('derives the group from en and finds exactly the keys pinned above', () => { // Membership first, uniformity second. If `en` drifts — a key renamed, a // value edited to `Loading more…`, a new `Loading…` key landing — the group // this file reasons about is no longer the group it names, and the rule // below would be silently measuring something else. const derived = PACKS.en.filter(([, value]) => value === LOADING_GROUP_EN).map(([key]) => key); - expect(derived.length, 'the group emptied or changed size — re-measure before editing the list').toBe(10); + expect(derived.length, 'the group emptied or changed size — re-measure before editing the list').toBe(11); expect([...derived].sort()).toEqual([...LOADING_GROUP].sort()); - // And every pack must actually define all ten. An absent key is a key-set + // And every pack must actually define every member. An absent key is a key-set // fact owned by all-locales-key-parity, but if one went missing here the // uniformity rule would happily pass over the survivors. for (const lang of LANGS) { @@ -390,7 +394,7 @@ describe('objectui#5972 — each pack renders the merged `Loading…` group exac for (const lang of LANGS) { const byKey = new Map(PACKS[lang]); const ruled = LOADING_GROUP.filter((key) => !forked.has(`${lang} ${key}`)); - // Non-vacuity per language: 10 keys, minus this pack's exemptions. A + // Non-vacuity per language: every member, minus this pack's exemptions. A // count assertion here is what stops a collapsed pack or a typo'd key // name from turning the set check below into a check of nothing. const expectedCount = LOADING_GROUP.length - LOADING_GROUP_FORKS.filter((f) => f.lang === lang).length; diff --git a/packages/i18n/src/locales/ar.ts b/packages/i18n/src/locales/ar.ts index 409613d170..519ded9f0a 100644 --- a/packages/i18n/src/locales/ar.ts +++ b/packages/i18n/src/locales/ar.ts @@ -1872,13 +1872,13 @@ const ar = { savedViewsUnreadable: "هذه القائمة فارغة لأنه تعذّرت قراءتها، لا لأن هذا الكائن ليس لديه عروض محفوظة. أعد المحاولة، وأبلغ عن المشكلة إذا استمرت.", settingsHub: { title: "الإعدادات", - subtitle: "اضبط البيئة والتكاملات وأعلام الميزات.", + subtitle: "اضبط النظام والتكاملات وأعلام الميزات.", loadError: "تعذّر تحميل الإعدادات", empty: "لا توجد إعدادات مسجّلة. يمكن للإضافات تسجيل بيانات الإعدادات عبر SettingsService.", settingsCount: "{{n}} من الإعدادات", beta: "إصدار تجريبي", categories: { - Workspace: "البيئة", + Workspace: "عام", Communication: "الاتصالات", Security: "الأمان", Infrastructure: "البنية التحتية", @@ -2236,12 +2236,12 @@ const ar = { unsupportedSpecifierType: "نوع إعداد غير مدعوم: {{type}}", }, workspaceTimezonePrompt: { - title: "تعيين المنطقة الزمنية للبيئة", - description: "لا تزال هذه البيئة تستخدم المنطقة الزمنية الافتراضية للمنصة، {{current}}. تحدد المنطقة الزمنية للبيئة معنى \"اليوم\" في الصيغ، وكيفية تجميع التقارير حسب التاريخ، وكيفية عرض التواريخ والأوقات، لجميع أعضاء البيئة. تم إدخال المنطقة الزمنية لمتصفحك أدناه.", + title: "تعيين المنطقة الزمنية للنظام", + description: "لا يزال هذا النظام يستخدم المنطقة الزمنية الافتراضية للمنصة، {{current}}. تحدد المنطقة الزمنية للنظام معنى \"اليوم\" في الصيغ، وكيفية تجميع التقارير حسب التاريخ، وكيفية عرض التواريخ والأوقات، لجميع مستخدمي النظام. تم إدخال المنطقة الزمنية لمتصفحك أدناه.", laterHint: "يمكنك تغييرها في أي وقت من صفحة الإعدادات.", decline: "الإبقاء على الافتراضي", confirm: "تعيين المنطقة الزمنية", - saved: "تم تعيين المنطقة الزمنية للبيئة إلى {{zone}}", + saved: "تم تعيين المنطقة الزمنية للنظام إلى {{zone}}", }, error: { connectionFailed: "تعذّر الاتصال بالخادم", @@ -2301,9 +2301,9 @@ const ar = { }, // objectui#9954 — see the `en` pack for what raises each case. readRate: { - ratioTitle: 'حجم قراءة غير معتاد في هذه البيئة', + ratioTitle: 'حجم قراءة غير معتاد في هذا النظام', ratio: 'تتم قراءة {{ratio}} صف مقابل كل صف مكتوب. تُعلِّم المنصة كل ما يتجاوز {{threshold}}. لا يتم تقييد أو حظر أي شيء؛ هذا تقرير لمراجعة نمط القراءة.', - noWritesTitle: 'قراءات بدون أي كتابة في هذه البيئة', + noWritesTitle: 'قراءات بدون أي كتابة في هذا النظام', noWrites: 'تتم قراءة صفوف دون كتابة أي صف على الإطلاق، لذا لا يوجد حد أعلى لمعدل القراءة. هذه هي أخطر قراءة. تُعلِّم المنصة كل ما يتجاوز {{threshold}}. لا يتم تقييد أو حظر أي شيء؛ هذا تقرير لمراجعة نمط القراءة.', }, // objectui#10439 — see the `en` pack for what raises each case. @@ -2479,7 +2479,7 @@ const ar = { auth: { setPassword: { title: "تعيين كلمة مرور للاسترداد", - description: "لقد سجّلت الدخول عبر الدخول الموحّد. عيّن كلمة مرور محلية لتتمكن من الدخول إلى هذه البيئة مباشرةً إذا أصبح الدخول الموحّد غير متاح.", + description: "لقد سجّلت الدخول عبر الدخول الموحّد. عيّن كلمة مرور محلية لتتمكن من الدخول مباشرةً إذا أصبح الدخول الموحّد غير متاح.", email: "البريد الإلكتروني", newPassword: "كلمة المرور الجديدة", confirmPassword: "تأكيد كلمة المرور", @@ -2564,7 +2564,7 @@ const ar = { orText: "أو تابع باستخدام البريد الإلكتروني", errors: { userExists: "يوجد حساب بهذا البريد الإلكتروني بالفعل. حاول تسجيل الدخول.", - selfRegistrationClosed: "التسجيل الذاتي غير متاح في هذه البيئة. اطلب دعوة من المسؤول.", + selfRegistrationClosed: "التسجيل الذاتي غير متاح في هذا النظام. اطلب دعوة من المسؤول.", emailDomainNotAllowed: "نطاق هذا البريد الإلكتروني غير مسموح له بالتسجيل هنا. استخدم البريد الإلكتروني لمؤسستك أو اطلب دعوة من المسؤول.", }, verifyInbox: { @@ -2641,7 +2641,7 @@ const ar = { checkSpam: "لم تستلم البريد؟ تحقق من مجلد البريد غير المرغوب أو تواصل مع الدعم.", or: "أو", // objectui#3546 slice three. - resendUnavailable: "قد يكون إرسال البريد الإلكتروني غير مُهيأ في هذه البيئة. تواصل مع الدعم إذا استمرت المشكلة.", + resendUnavailable: "قد يكون إرسال البريد الإلكتروني غير مُهيأ في هذا النظام. تواصل مع الدعم إذا استمرت المشكلة.", }, setup: { welcomeTitle: "مرحباً بك في ObjectStack", @@ -2685,7 +2685,7 @@ const ar = { disabledDescription: "لم يتم تمكين تفويض الأجهزة في هذا النشر، لذا لا يمكن الموافقة على هذا الجهاز هنا.", }, shell: { - tenantHostHint: "تسجل الدخول إلى هذه البيئة", + tenantHostHint: "تسجل الدخول إلى هذا النظام", }, layout: { headline: "أنشئ تطبيقات أعمال قوية بسرعة أكبر.", @@ -2782,9 +2782,9 @@ const ar = { password: { changeTitle: "تغيير كلمة المرور", setTitle: "تعيين كلمة مرور محلية", - changeDescription: "قم بتحديث كلمة المرور التي تستخدمها لتسجيل الدخول إلى هذه البيئة.", + changeDescription: "قم بتحديث كلمة المرور التي تستخدمها لتسجيل الدخول.", setDescription: - "لقد سجّلت الدخول عبر تسجيل الدخول الموحّد. عيّن كلمة مرور محلية لتتمكن أيضاً من تسجيل الدخول بالبريد الإلكتروني وكلمة المرور في هذه البيئة.", + "لقد سجّلت الدخول عبر تسجيل الدخول الموحّد. عيّن كلمة مرور محلية لتتمكن أيضاً من تسجيل الدخول بالبريد الإلكتروني وكلمة المرور.", current: "كلمة المرور الحالية", new: "كلمة المرور الجديدة", password: "كلمة المرور", @@ -2793,7 +2793,7 @@ const ar = { mismatch: "كلمتا المرور غير متطابقتين", enterCurrent: "أدخل كلمة المرور الحالية", changed: "تم تغيير كلمة المرور.", - localSet: "تم تعيين كلمة المرور المحلية. يمكنك الآن تسجيل الدخول بالبريد الإلكتروني وكلمة المرور في هذه البيئة.", + localSet: "تم تعيين كلمة المرور المحلية. يمكنك الآن تسجيل الدخول بالبريد الإلكتروني وكلمة المرور.", changeAction: "تغيير كلمة المرور", setAction: "تعيين كلمة المرور", }, @@ -2871,7 +2871,7 @@ const ar = { home: { build: { title: "إنشاء تطبيق", - noCapability: "إنشاء التطبيقات غير متاح في هذه البيئة — فهو يتطلب إذن «إدارة البيانات الوصفية» الذي لا يملكه حسابك.", + noCapability: "إنشاء التطبيقات غير متاح في هذا النظام — فهو يتطلب إذن «إدارة البيانات الوصفية» الذي لا يملكه حسابك.", }, template: { title: "ابدأ من قالب", @@ -2881,7 +2881,7 @@ const ar = { welcomeAdminDescriptionNoBuild: "أعدّ تطبيقك الأول من قائمة الإدارة على اليسار. وبمجرد توفر البيانات، يمكن لمساعد الذكاء الاصطناعي مساعدتك في استكشافها.", welcomeAdminDescriptionNoAi: "أعدّ تطبيقك الأول من قائمة الإدارة على اليسار.", noAppsTitle: "لا توجد تطبيقات بعد", - noAppsDescription: "يجري إعداد بيئتك — وستظهر هنا التطبيقات التي يشاركها معك المسؤول.", + noAppsDescription: "يجري إعداد النظام — وستظهر هنا التطبيقات التي يشاركها معك المسؤول.", buildWithAI: "الإنشاء بالذكاء الاصطناعي", askAI: "اسأل الذكاء الاصطناعي", recoveryReminder: { @@ -2934,7 +2934,7 @@ const ar = { notifications: "الإشعارات", notificationsEmpty: "لا توجد إشعارات غير مقروءة", }, - loading: "جارٍ تحميل البيئة…", + loading: "جارٍ التحميل…", welcome: "مرحباً بك في ObjectUI", welcomeDescription: "ابدأ بإنشاء تطبيقك الأول أو تكوين إعدادات النظام.", createFirstApp: "أنشئ أول تطبيق لك", @@ -2945,7 +2945,7 @@ const ar = { manageObjects: "إدارة الكائنات", manageObjectsDesc: "تكوين نماذج البيانات", systemSettings: "إعدادات النظام", - systemSettingsDesc: "تكوين بيئتك", + systemSettingsDesc: "تكوين النظام", }, appCard: { noDescription: "لا يوجد وصف", @@ -3448,10 +3448,10 @@ const ar = { body: 'واجهة MCP متوقفة (OS_MCP_SERVER_ENABLED=false). اطلب من المشغّل إعادة تفعيلها.', }, url: { - title: 'نقطة نهاية MCP لهذه البيئة', + title: 'نقطة نهاية MCP لهذا النظام', body: 'أي عميل ذكاء اصطناعي يدعم MCP يتصل عبر هذا العنوان. الهوية ذاتية الخدمة: النشر هو خادم تفويض OAuth 2.1 الخاص به — تسجّل الدخول بهويتك، وكل استدعاء يخضع لصلاحياتك وأمان مستوى الصفوف.', downloadSkill: 'تنزيل SKILL.md', - skillHint: 'مهارة الوكيل المحمولة: تعلّم أي وكيل داعم للمهارات كيفية العمل مع هذه البيئة.', + skillHint: 'مهارة الوكيل المحمولة: تعلّم أي وكيل داعم للمهارات كيفية العمل مع هذا النظام.', }, claude: { body: 'الإعدادات ← الموصلات ← إضافة موصل مخصص، الصق هذا العنوان وسجّل الدخول عبر المتصفح.', @@ -3594,8 +3594,8 @@ const ar = { rowConversational: "نموذج Build / Ask", rowStructured: "مُهيكل (blueprint / seed)", rowReasoning: "مستوى الاستدلال", - readFailed: "تعذّرت قراءة نموذج الذكاء الاصطناعي الفعّال. قد لا تُشغّل هذه البيئة خدمة ذكاء اصطناعي، أو قد لا تملك صلاحية ai:read.", - readFailedWithStatus: "تعذّرت قراءة نموذج الذكاء الاصطناعي الفعّال (HTTP {{status}}). قد لا تُشغّل هذه البيئة خدمة ذكاء اصطناعي، أو قد لا تملك صلاحية ai:read.", + readFailed: "تعذّرت قراءة نموذج الذكاء الاصطناعي الفعّال. قد لا يُشغّل هذا النظام خدمة ذكاء اصطناعي، أو قد لا تملك صلاحية ai:read.", + readFailedWithStatus: "تعذّرت قراءة نموذج الذكاء الاصطناعي الفعّال (HTTP {{status}}). قد لا يُشغّل هذا النظام خدمة ذكاء اصطناعي، أو قد لا تملك صلاحية ai:read.", overridesInEffect: "التجاوزات السارية: ", noOverrides: "لا شيء — يجري تشغيل القيم الافتراضية للكود المنشور.", adapter: "المحوّل: ", diff --git a/packages/i18n/src/locales/de.ts b/packages/i18n/src/locales/de.ts index d96b90f5a4..d91ec25d49 100644 --- a/packages/i18n/src/locales/de.ts +++ b/packages/i18n/src/locales/de.ts @@ -1687,13 +1687,13 @@ const de = { savedViewsUnreadable: "Diese Liste ist leer, weil sie nicht gelesen werden konnte, nicht weil dieses Objekt keine gespeicherten Ansichten hätte. Versuchen Sie es erneut und melden Sie das Problem, wenn es weiterhin auftritt.", settingsHub: { title: "Einstellungen", - subtitle: "Konfigurieren Sie Ihre Umgebung, Integrationen und Feature-Flags.", + subtitle: "Konfigurieren Sie Ihr System, Integrationen und Feature-Flags.", loadError: "Einstellungen konnten nicht geladen werden", empty: "Keine Einstellungen registriert. Plugins können Einstellungsmanifeste über den SettingsService registrieren.", settingsCount: "{{n}} Einstellungen", beta: "Beta", categories: { - Workspace: "Umgebung", + Workspace: "Allgemein", Communication: "Kommunikation", Security: "Sicherheit", Infrastructure: "Infrastruktur", @@ -2039,12 +2039,12 @@ const de = { unsupportedSpecifierType: "Nicht unterstützter Einstellungstyp: {{type}}", }, workspaceTimezonePrompt: { - title: "Zeitzone der Umgebung festlegen", - description: "Diese Umgebung verwendet noch die Standardzeitzone der Plattform, {{current}}. Die Zeitzone der Umgebung bestimmt, welcher Tag in Formeln als heute gilt, wie Berichte nach Datum gruppieren und wie Datum und Uhrzeit angezeigt werden – für alle in der Umgebung. Unten ist die Zeitzone Ihres Browsers eingetragen.", + title: "Zeitzone des Systems festlegen", + description: "Dieses System verwendet noch die Standardzeitzone der Plattform, {{current}}. Die Zeitzone des Systems bestimmt, welcher Tag in Formeln als heute gilt, wie Berichte nach Datum gruppieren und wie Datum und Uhrzeit angezeigt werden – für alle im System. Unten ist die Zeitzone Ihres Browsers eingetragen.", laterHint: "Sie können sie jederzeit in den Einstellungen ändern.", decline: "Standard beibehalten", confirm: "Zeitzone festlegen", - saved: "Zeitzone der Umgebung auf {{zone}} festgelegt", + saved: "Zeitzone des Systems auf {{zone}} festgelegt", }, error: { connectionFailed: "Verbindung zum Server nicht möglich", @@ -2104,9 +2104,9 @@ const de = { }, // objectui#9954 — see the `en` pack for what raises each case. readRate: { - ratioTitle: 'Ungewöhnliches Lesevolumen in dieser Umgebung', + ratioTitle: 'Ungewöhnliches Lesevolumen in diesem System', ratio: 'Pro geschriebener Zeile werden {{ratio}} Zeilen gelesen. Die Plattform meldet alles über {{threshold}}. Es wird nichts begrenzt oder blockiert; dies ist ein Bericht, damit das Lesemuster geprüft werden kann.', - noWritesTitle: 'Lesevorgänge ganz ohne Schreibvorgänge in dieser Umgebung', + noWritesTitle: 'Lesevorgänge ganz ohne Schreibvorgänge in diesem System', noWrites: 'Es werden Zeilen gelesen, aber überhaupt keine geschrieben, sodass die Leserate keine Obergrenze hat. Das ist der schwerwiegendste Messwert. Die Plattform meldet alles über {{threshold}}. Es wird nichts begrenzt oder blockiert; dies ist ein Bericht, damit das Lesemuster geprüft werden kann.', }, // objectui#10439 — see the `en` pack for what raises each case. @@ -2267,7 +2267,7 @@ const de = { auth: { setPassword: { title: "Wiederherstellungspasswort festlegen", - description: "Sie haben sich über Single Sign-on angemeldet. Legen Sie ein lokales Passwort fest, damit Sie sich weiterhin direkt an dieser Umgebung anmelden können, falls SSO einmal nicht verfügbar ist.", + description: "Sie haben sich über Single Sign-on angemeldet. Legen Sie ein lokales Passwort fest, damit Sie sich weiterhin direkt anmelden können, falls SSO einmal nicht verfügbar ist.", email: "E-Mail", newPassword: "Neues Passwort", confirmPassword: "Passwort bestätigen", @@ -2352,7 +2352,7 @@ const de = { orText: "oder mit E-Mail fortfahren", errors: { userExists: "Ein Konto mit dieser E-Mail existiert bereits. Versuchen Sie sich anzumelden.", - selfRegistrationClosed: "Die Selbstregistrierung ist in dieser Umgebung nicht möglich. Bitten Sie einen Administrator um eine Einladung.", + selfRegistrationClosed: "Die Selbstregistrierung ist in diesem System nicht möglich. Bitten Sie einen Administrator um eine Einladung.", emailDomainNotAllowed: "Die Domain dieser E-Mail-Adresse ist für die Registrierung hier nicht zugelassen. Verwenden Sie die E-Mail-Adresse Ihrer Organisation oder bitten Sie einen Administrator um eine Einladung.", }, verifyInbox: { @@ -2429,7 +2429,7 @@ const de = { checkSpam: "E-Mail nicht erhalten? Überprüfen Sie Ihren Spam-Ordner oder kontaktieren Sie den Support.", or: "Oder", // objectui#3546 slice three. - resendUnavailable: "Für diese Umgebung ist möglicherweise kein E-Mail-Versand konfiguriert. Kontaktieren Sie den Support, wenn das Problem bestehen bleibt.", + resendUnavailable: "Für dieses System ist möglicherweise kein E-Mail-Versand konfiguriert. Kontaktieren Sie den Support, wenn das Problem bestehen bleibt.", }, setup: { welcomeTitle: "Willkommen bei ObjectStack", @@ -2473,7 +2473,7 @@ const de = { disabledDescription: "Für diese Bereitstellung ist die Geräteautorisierung nicht aktiviert, daher kann dieses Gerät hier nicht genehmigt werden.", }, shell: { - tenantHostHint: "Sie melden sich bei dieser Umgebung an", + tenantHostHint: "Sie melden sich bei diesem System an", }, layout: { headline: "Leistungsstarke Geschäftsanwendungen schneller entwickeln.", @@ -2570,9 +2570,9 @@ const de = { password: { changeTitle: "Passwort ändern", setTitle: "Lokales Passwort festlegen", - changeDescription: "Aktualisieren Sie das Passwort, mit dem Sie sich in dieser Umgebung anmelden.", + changeDescription: "Aktualisieren Sie das Passwort, mit dem Sie sich anmelden.", setDescription: - "Sie haben sich per Single Sign-On angemeldet. Legen Sie ein lokales Passwort fest, um sich in dieser Umgebung auch mit E-Mail und Passwort anmelden zu können.", + "Sie haben sich per Single Sign-On angemeldet. Legen Sie ein lokales Passwort fest, um sich auch mit E-Mail und Passwort anmelden zu können.", current: "Aktuelles Passwort", new: "Neues Passwort", password: "Passwort", @@ -2581,7 +2581,7 @@ const de = { mismatch: "Die Passwörter stimmen nicht überein", enterCurrent: "Geben Sie Ihr aktuelles Passwort ein", changed: "Passwort geändert.", - localSet: "Lokales Passwort festgelegt. Sie können sich in dieser Umgebung jetzt auch mit E-Mail und Passwort anmelden.", + localSet: "Lokales Passwort festgelegt. Sie können sich jetzt auch mit E-Mail und Passwort anmelden.", changeAction: "Passwort ändern", setAction: "Passwort festlegen", }, @@ -2659,7 +2659,7 @@ const de = { home: { build: { title: "App erstellen", - noCapability: "Das Erstellen von Apps ist in dieser Umgebung nicht verfügbar — es erfordert die Berechtigung „Metadaten verwalten“, die Ihr Konto nicht besitzt.", + noCapability: "Das Erstellen von Apps ist in diesem System nicht verfügbar — es erfordert die Berechtigung „Metadaten verwalten“, die Ihr Konto nicht besitzt.", }, template: { title: "Mit einer Vorlage starten", @@ -2669,7 +2669,7 @@ const de = { welcomeAdminDescriptionNoBuild: "Richten Sie Ihre erste Anwendung über das Verwaltungsmenü links ein. Sobald Daten vorhanden sind, kann der KI-Assistent bei der Auswertung helfen.", welcomeAdminDescriptionNoAi: "Richten Sie Ihre erste Anwendung über das Verwaltungsmenü links ein.", noAppsTitle: "Noch keine Anwendungen", - noAppsDescription: "Ihre Umgebung wird eingerichtet — Apps, die Ihr Administrator für Sie freigibt, erscheinen hier.", + noAppsDescription: "Das System wird eingerichtet — Apps, die Ihr Administrator für Sie freigibt, erscheinen hier.", buildWithAI: "Mit KI erstellen", askAI: "KI fragen", recoveryReminder: { @@ -2718,7 +2718,7 @@ const de = { notifications: "Benachrichtigungen", notificationsEmpty: "Keine ungelesenen Benachrichtigungen", }, - loading: "Umgebung wird geladen…", + loading: "Wird geladen…", welcome: "Willkommen bei ObjectUI", welcomeDescription: "Erstellen Sie zunächst Ihre erste Anwendung oder konfigurieren Sie Ihre Systemeinstellungen.", createFirstApp: "Erstellen Sie Ihre erste App", @@ -2729,7 +2729,7 @@ const de = { manageObjects: "Objekte verwalten", manageObjectsDesc: "Datenmodelle konfigurieren", systemSettings: "Systemeinstellungen", - systemSettingsDesc: "Konfigurieren Sie Ihre Umgebung", + systemSettingsDesc: "Konfigurieren Sie Ihr System", }, appCard: { noDescription: "Keine Beschreibung", @@ -3193,10 +3193,10 @@ const de = { body: 'Die MCP-Schnittstelle ist ausgeschaltet (OS_MCP_SERVER_ENABLED=false). Bitten Sie Ihren Betreiber, sie wieder zu aktivieren.', }, url: { - title: 'MCP-Endpunkt dieser Umgebung', + title: 'MCP-Endpunkt dieses Systems', body: 'Jeder MCP-fähige KI-Client verbindet sich über diese URL. Die Identität ist Self-Service: Die Bereitstellung ist ihr eigener OAuth-2.1-Autorisierungsserver — Sie melden sich als Sie selbst an, und jeder Aufruf unterliegt Ihren Berechtigungen und der Zeilensicherheit.', downloadSkill: 'SKILL.md herunterladen', - skillHint: 'Die portable Agenten-Skill-Datei: erklärt jedem skill-fähigen Agenten die Arbeit mit dieser Umgebung.', + skillHint: 'Die portable Agenten-Skill-Datei: erklärt jedem skill-fähigen Agenten die Arbeit mit diesem System.', }, claude: { body: 'Einstellungen → Connectors → Benutzerdefinierten Connector hinzufügen, dann diese URL einfügen und im Browser anmelden.', @@ -3327,8 +3327,8 @@ const de = { rowConversational: "Build-/Ask-Modell", rowStructured: "Strukturiert (Blueprint / Seed)", rowReasoning: "Reasoning-Aufwand", - readFailed: "Das effektive KI-Modell konnte nicht gelesen werden. In dieser Umgebung läuft möglicherweise kein KI-Dienst, oder Ihnen fehlt die Berechtigung ai:read.", - readFailedWithStatus: "Das effektive KI-Modell konnte nicht gelesen werden (HTTP {{status}}). In dieser Umgebung läuft möglicherweise kein KI-Dienst, oder Ihnen fehlt die Berechtigung ai:read.", + readFailed: "Das effektive KI-Modell konnte nicht gelesen werden. In diesem System läuft möglicherweise kein KI-Dienst, oder Ihnen fehlt die Berechtigung ai:read.", + readFailedWithStatus: "Das effektive KI-Modell konnte nicht gelesen werden (HTTP {{status}}). In diesem System läuft möglicherweise kein KI-Dienst, oder Ihnen fehlt die Berechtigung ai:read.", overridesInEffect: "Aktive Overrides: ", noOverrides: "keine — es gelten die Standardwerte des bereitgestellten Codes.", adapter: "Adapter: ", diff --git a/packages/i18n/src/locales/en.ts b/packages/i18n/src/locales/en.ts index fb54121de3..aa219bb65c 100644 --- a/packages/i18n/src/locales/en.ts +++ b/packages/i18n/src/locales/en.ts @@ -2095,7 +2095,7 @@ const en = { }, settingsHub: { title: 'Settings', - subtitle: 'Configure your environment, integrations, and feature flags.', + subtitle: 'Configure your system, integrations, and feature flags.', loadError: 'Failed to load settings', empty: 'No settings registered. Plugins can register settings manifests via the SettingsService.', settingsCount: '{{n}} settings', @@ -2103,7 +2103,7 @@ const en = { // Section headers, keyed by the manifest `category` value. Unknown // (plugin-authored) categories fall back to the literal category string. categories: { - Workspace: 'Environment', + Workspace: 'General', Communication: 'Communication', Security: 'Security', Infrastructure: 'Infrastructure', @@ -2180,12 +2180,12 @@ const en = { // administrator while `localization.timezone` is still the manifest default. // `{{current}}` is that default, `{{zone}}` the zone the admin confirmed. workspaceTimezonePrompt: { - title: 'Set the environment timezone', - description: 'This environment still uses the platform default timezone, {{current}}. The environment timezone decides what "today" means in formulas, how reports group dates and how dates and times are shown, for everyone in the environment. Your browser timezone is filled in below.', + title: 'Set the system timezone', + description: 'This system still uses the platform default timezone, {{current}}. The system timezone decides what "today" means in formulas, how reports group dates and how dates and times are shown, for everyone in the system. Your browser timezone is filled in below.', laterHint: 'You can change it at any time on the Settings page.', decline: 'Keep the default', confirm: 'Set timezone', - saved: 'Environment timezone set to {{zone}}', + saved: 'System timezone set to {{zone}}', }, error: { connectionFailed: 'Cannot connect to server', @@ -2580,9 +2580,9 @@ const en = { // from the wire; this repo holds no copy of the line. Report only — the copy // states that nothing is limited or blocked, and must keep doing so. readRate: { - ratioTitle: 'Unusual read volume in this environment', + ratioTitle: 'Unusual read volume in this system', ratio: 'Reads are running at {{ratio}} rows for every row written. The platform flags anything above {{threshold}}. Nothing is limited or blocked; this is a report so the read pattern can be reviewed.', - noWritesTitle: 'Reads with no writes at all in this environment', + noWritesTitle: 'Reads with no writes at all in this system', noWrites: 'Rows are being read while none at all are being written, so the read rate has no upper bound. This is the most severe reading. The platform flags anything above {{threshold}}. Nothing is limited or blocked; this is a report so the read pattern can be reviewed.', }, // objectui#10439 — the environment admin's storage-capacity banner (cloud#2135). @@ -2847,7 +2847,7 @@ const en = { orText: 'or continue with email', errors: { userExists: 'An account with this email already exists. Try signing in instead.', - selfRegistrationClosed: 'Self-registration is not open on this environment. Ask an administrator for an invitation.', + selfRegistrationClosed: 'Self-registration is not open on this system. Ask an administrator for an invitation.', emailDomainNotAllowed: "This email's domain is not allowed to register here. Use your organization email, or ask an administrator for an invitation.", }, verifyInbox: { @@ -2922,7 +2922,7 @@ const en = { resentDescription: 'Please check your inbox and click the verification link.', resendFailed: 'Cannot resend verification email', resendUnavailable: - 'Email delivery may not be configured for this environment. Contact support if this persists.', + 'Email delivery may not be configured for this system. Contact support if this persists.', signInLink: 'Go to sign in', backToSignIn: 'Back to sign in', backToLogin: 'Back to login', @@ -2973,7 +2973,7 @@ const en = { cancel: 'Cancel', }, shell: { - tenantHostHint: 'You are signing in to this environment', + tenantHostHint: 'You are signing in to this system', }, // These were previously supplied only as inline `defaultValue:` args at the // SetPasswordPage call sites, so `zh` was the only pack that could carry a @@ -2981,7 +2981,7 @@ const en = { setPassword: { title: 'Set a recovery password', description: - 'You signed in via single sign-on. Set a local password so you can still sign in to this environment directly if SSO ever becomes unavailable.', + 'You signed in via single sign-on. Set a local password so you can still sign in directly if SSO ever becomes unavailable.', email: 'Email', newPassword: 'New password', confirmPassword: 'Confirm password', @@ -3101,9 +3101,9 @@ const en = { password: { changeTitle: 'Change Password', setTitle: 'Set Local Password', - changeDescription: 'Update the password you use to sign in to this environment.', + changeDescription: 'Update the password you use to sign in.', setDescription: - 'You signed in via single sign-on. Set a local password to also sign in with email and password on this environment.', + 'You signed in via single sign-on. Set a local password to also sign in with email and password.', current: 'Current password', new: 'New password', password: 'Password', @@ -3112,7 +3112,7 @@ const en = { mismatch: 'Passwords do not match', enterCurrent: 'Enter your current password', changed: 'Password changed.', - localSet: 'Local password set. You can now sign in with email and password on this environment.', + localSet: 'Local password set. You can now sign in with email and password.', changeAction: 'Change password', setAction: 'Set password', }, @@ -3238,21 +3238,21 @@ const en = { appOpened: '{{time}}', build: { title: 'Build an app', - noCapability: 'Building apps isn\'t available in this environment — it requires the “Manage Metadata” permission, which your account doesn\'t have.', + noCapability: 'Building apps isn\'t available in this system — it requires the “Manage Metadata” permission, which your account doesn\'t have.', }, template: { title: 'Start with a template', marketplaceDisabled: 'This runtime has no app marketplace configured, so there are no templates to install here.', }, open: 'Open', - loading: 'Loading environment…', + loading: 'Loading…', welcome: 'Build your business system with AI', welcomeDescription: 'Describe your business in one sentence — AI generates the objects, screens, APIs and agent tools. Or start from scratch.', welcomeAdminDescription: 'Describe your business in one sentence — AI generates the objects, screens, APIs and agent tools. Or set things up yourself from the menu on the left.', welcomeAdminDescriptionNoBuild: 'Set up your first application from the Administration menu on the left. Once you have data, the AI assistant can help you explore it.', welcomeAdminDescriptionNoAi: 'Set up your first application from the Administration menu on the left.', noAppsTitle: 'No applications yet', - noAppsDescription: 'Your environment is being set up — apps your admin shares with you will show up here.', + noAppsDescription: 'The system is being set up — apps your admin shares with you will show up here.', buildWithAI: 'Build with AI', askAI: 'Ask AI', recoveryReminder: { @@ -3292,7 +3292,7 @@ const en = { manageObjects: 'Manage Objects', manageObjectsDesc: 'Configure data models', systemSettings: 'System Settings', - systemSettingsDesc: 'Configure your environment', + systemSettingsDesc: 'Configure your system', }, recentApps: { title: 'Recently Accessed', @@ -3845,10 +3845,10 @@ const en = { body: 'The MCP surface is off (OS_MCP_SERVER_ENABLED=false), so there is nothing to connect. Ask your operator to re-enable it.', }, url: { - title: 'This environment\'s MCP endpoint', + title: 'This system\'s MCP endpoint', body: 'Any MCP-capable AI client connects with this URL. Identity is self-serve: the deployment is its own OAuth 2.1 authorization server, so interactive clients just open a browser login — you connect as yourself, and every call runs under your own permissions and row-level security.', downloadSkill: 'Download SKILL.md', - skillHint: 'The portable agent skill: teaches any skills-capable agent how to work with this environment.', + skillHint: 'The portable agent skill: teaches any skills-capable agent how to work with this system.', }, claude: { body: 'Settings → Connectors → Add custom connector, then paste this URL. Sign in through the browser when prompted.', @@ -3994,8 +3994,8 @@ const en = { rowConversational: 'Build / Ask model', rowStructured: 'Structured (blueprint / seed)', rowReasoning: 'Reasoning effort', - readFailed: 'Couldn\'t read the effective AI model. This environment may not run an AI service, or you may lack the ai:read permission.', - readFailedWithStatus: 'Couldn\'t read the effective AI model (HTTP {{status}}). This environment may not run an AI service, or you may lack the ai:read permission.', + readFailed: 'Couldn\'t read the effective AI model. This system may not run an AI service, or you may lack the ai:read permission.', + readFailedWithStatus: 'Couldn\'t read the effective AI model (HTTP {{status}}). This system may not run an AI service, or you may lack the ai:read permission.', overridesInEffect: 'Overrides in effect: ', noOverrides: 'none — running the deployed code defaults.', adapter: 'Adapter: ', diff --git a/packages/i18n/src/locales/es.ts b/packages/i18n/src/locales/es.ts index 39dc66e3cf..dabe9bd9cb 100644 --- a/packages/i18n/src/locales/es.ts +++ b/packages/i18n/src/locales/es.ts @@ -1733,13 +1733,13 @@ const es = { savedViewsUnreadable: "Esta lista está vacía porque no se pudo leer, no porque este objeto no tenga vistas guardadas. Inténtalo de nuevo e informa del problema si continúa.", settingsHub: { title: "Configuración", - subtitle: "Configure su entorno, las integraciones y los indicadores de funciones.", + subtitle: "Configure su sistema, las integraciones y los indicadores de funciones.", loadError: "No se pudo cargar la configuración", empty: "No hay configuraciones registradas. Los plugins pueden registrar manifiestos de configuración mediante el SettingsService.", settingsCount: "{{n}} configuraciones", beta: "Beta", categories: { - Workspace: "Entorno", + Workspace: "General", Communication: "Comunicación", Security: "Seguridad", Infrastructure: "Infraestructura", @@ -2088,12 +2088,12 @@ const es = { unsupportedSpecifierType: "Tipo de ajuste no admitido: {{type}}", }, workspaceTimezonePrompt: { - title: "Configure la zona horaria del entorno", - description: "Este entorno aún usa la zona horaria predeterminada de la plataforma, {{current}}. La zona horaria del entorno determina qué significa «hoy» en las fórmulas, cómo agrupan los informes por fecha y cómo se muestran las fechas y horas, para todos en el entorno. Abajo se indica la zona horaria de su navegador.", + title: "Configure la zona horaria del sistema", + description: "Este sistema aún usa la zona horaria predeterminada de la plataforma, {{current}}. La zona horaria del sistema determina qué significa «hoy» en las fórmulas, cómo agrupan los informes por fecha y cómo se muestran las fechas y horas, para todos en el sistema. Abajo se indica la zona horaria de su navegador.", laterHint: "Puede cambiarla en cualquier momento en la página de Configuración.", decline: "Mantener la predeterminada", confirm: "Configurar zona horaria", - saved: "Zona horaria del entorno configurada en {{zone}}", + saved: "Zona horaria del sistema configurada en {{zone}}", }, error: { connectionFailed: "No se puede conectar al servidor", @@ -2153,9 +2153,9 @@ const es = { }, // objectui#9954 — see the `en` pack for what raises each case. readRate: { - ratioTitle: 'Volumen de lectura inusual en este entorno', + ratioTitle: 'Volumen de lectura inusual en este sistema', ratio: 'Se leen {{ratio}} filas por cada fila escrita. La plataforma señala todo lo que supere {{threshold}}. No se limita ni se bloquea nada; es un informe para que se pueda revisar el patrón de lectura.', - noWritesTitle: 'Lecturas sin ninguna escritura en este entorno', + noWritesTitle: 'Lecturas sin ninguna escritura en este sistema', noWrites: 'Se están leyendo filas sin escribir ninguna, por lo que la tasa de lectura no tiene límite superior. Es la lectura más grave. La plataforma señala todo lo que supere {{threshold}}. No se limita ni se bloquea nada; es un informe para que se pueda revisar el patrón de lectura.', }, // objectui#10439 — see the `en` pack for what raises each case. @@ -2319,7 +2319,7 @@ const es = { auth: { setPassword: { title: "Establecer una contraseña de recuperación", - description: "Ha iniciado sesión mediante inicio de sesión único. Establezca una contraseña local para poder seguir accediendo directamente a este entorno si el SSO deja de estar disponible.", + description: "Ha iniciado sesión mediante inicio de sesión único. Establezca una contraseña local para poder seguir accediendo directamente si el SSO deja de estar disponible.", email: "Correo electrónico", newPassword: "Nueva contraseña", confirmPassword: "Confirmar la contraseña", @@ -2404,7 +2404,7 @@ const es = { orText: "o continúe con correo electrónico", errors: { userExists: "Ya existe una cuenta con ese correo. Intente iniciar sesión.", - selfRegistrationClosed: "El registro por cuenta propia no está abierto en este entorno. Solicite una invitación a un administrador.", + selfRegistrationClosed: "El registro por cuenta propia no está abierto en este sistema. Solicite una invitación a un administrador.", emailDomainNotAllowed: "El dominio de este correo no está autorizado para registrarse aquí. Use el correo de su organización o solicite una invitación a un administrador.", }, verifyInbox: { @@ -2481,7 +2481,7 @@ const es = { checkSpam: "¿No recibió el correo? Revise su carpeta de spam o contacte soporte.", or: "O", // objectui#3546 slice three. - resendUnavailable: "Puede que el envío de correos no esté configurado en este entorno. Contacte soporte si el problema persiste.", + resendUnavailable: "Puede que el envío de correos no esté configurado en este sistema. Contacte soporte si el problema persiste.", }, setup: { welcomeTitle: "Bienvenido a ObjectStack", @@ -2525,7 +2525,7 @@ const es = { disabledDescription: "Esta implementación no tiene habilitada la autorización de dispositivos, por lo que este dispositivo no puede aprobarse aquí.", }, shell: { - tenantHostHint: "Está iniciando sesión en este entorno", + tenantHostHint: "Está iniciando sesión en este sistema", }, layout: { headline: "Cree aplicaciones empresariales potentes, más rápido.", @@ -2622,9 +2622,9 @@ const es = { password: { changeTitle: "Cambiar contraseña", setTitle: "Establecer contraseña local", - changeDescription: "Actualice la contraseña que usa para iniciar sesión en este entorno.", + changeDescription: "Actualice la contraseña que usa para iniciar sesión.", setDescription: - "Inició sesión mediante inicio de sesión único. Establezca una contraseña local para poder iniciar sesión también con correo y contraseña en este entorno.", + "Inició sesión mediante inicio de sesión único. Establezca una contraseña local para poder iniciar sesión también con correo y contraseña.", current: "Contraseña actual", new: "Nueva contraseña", password: "Contraseña", @@ -2633,7 +2633,7 @@ const es = { mismatch: "Las contraseñas no coinciden", enterCurrent: "Introduzca su contraseña actual", changed: "Contraseña cambiada.", - localSet: "Contraseña local establecida. Ahora puede iniciar sesión con correo y contraseña en este entorno.", + localSet: "Contraseña local establecida. Ahora puede iniciar sesión con correo y contraseña.", changeAction: "Cambiar contraseña", setAction: "Establecer contraseña", }, @@ -2711,7 +2711,7 @@ const es = { home: { build: { title: "Crear una aplicación", - noCapability: "La creación de aplicaciones no está disponible en este entorno: requiere el permiso «Gestionar metadatos», que su cuenta no tiene.", + noCapability: "La creación de aplicaciones no está disponible en este sistema: requiere el permiso «Gestionar metadatos», que su cuenta no tiene.", }, template: { title: "Empezar con una plantilla", @@ -2721,7 +2721,7 @@ const es = { welcomeAdminDescriptionNoBuild: "Configure su primera aplicación desde el menú de Administración de la izquierda. Cuando tenga datos, el asistente de IA podrá ayudarle a explorarlos.", welcomeAdminDescriptionNoAi: "Configure su primera aplicación desde el menú de Administración de la izquierda.", noAppsTitle: "Todavía no hay aplicaciones", - noAppsDescription: "Su entorno se está preparando — las aplicaciones que su administrador comparta aparecerán aquí.", + noAppsDescription: "El sistema se está preparando — las aplicaciones que su administrador comparta aparecerán aquí.", buildWithAI: "Crear con IA", askAI: "Preguntar a la IA", recoveryReminder: { @@ -2771,7 +2771,7 @@ const es = { notifications: "Notificaciones", notificationsEmpty: "No hay notificaciones sin leer", }, - loading: "Cargando entorno…", + loading: "Cargando…", welcome: "Bienvenido a ObjectUI", welcomeDescription: "Comienza creando tu primera aplicación o configura los ajustes del sistema.", createFirstApp: "Crea tu primera aplicación", @@ -2782,7 +2782,7 @@ const es = { manageObjects: "Gestionar objetos", manageObjectsDesc: "Configura modelos de datos", systemSettings: "Configuración del sistema", - systemSettingsDesc: "Configura tu entorno", + systemSettingsDesc: "Configura tu sistema", }, appCard: { noDescription: "Sin descripción", @@ -3255,10 +3255,10 @@ const es = { body: 'La superficie MCP está apagada (OS_MCP_SERVER_ENABLED=false). Pida a su operador que la vuelva a habilitar.', }, url: { - title: 'Endpoint MCP de este entorno', + title: 'Endpoint MCP de este sistema', body: 'Cualquier cliente de IA compatible con MCP se conecta con esta URL. La identidad es autoservicio: la implementación es su propio servidor de autorización OAuth 2.1 — inicia sesión como usted mismo y cada llamada corre bajo sus permisos y seguridad a nivel de fila.', downloadSkill: 'Descargar SKILL.md', - skillHint: 'La skill portátil del agente: enseña a cualquier agente compatible cómo trabajar con este entorno.', + skillHint: 'La skill portátil del agente: enseña a cualquier agente compatible cómo trabajar con este sistema.', }, claude: { body: 'Configuración → Conectores → Añadir conector personalizado, pegue esta URL e inicie sesión en el navegador.', @@ -3392,8 +3392,8 @@ const es = { rowConversational: "Modelo Build / Ask", rowStructured: "Estructurado (blueprint / seed)", rowReasoning: "Esfuerzo de razonamiento", - readFailed: "No se pudo leer el modelo de IA efectivo. Puede que este entorno no ejecute un servicio de IA o que no tenga el permiso ai:read.", - readFailedWithStatus: "No se pudo leer el modelo de IA efectivo (HTTP {{status}}). Puede que este entorno no ejecute un servicio de IA o que no tenga el permiso ai:read.", + readFailed: "No se pudo leer el modelo de IA efectivo. Puede que este sistema no ejecute un servicio de IA o que no tenga el permiso ai:read.", + readFailedWithStatus: "No se pudo leer el modelo de IA efectivo (HTTP {{status}}). Puede que este sistema no ejecute un servicio de IA o que no tenga el permiso ai:read.", overridesInEffect: "Anulaciones vigentes: ", noOverrides: "ninguna: se usan los valores predeterminados del código desplegado.", adapter: "Adaptador: ", diff --git a/packages/i18n/src/locales/fr.ts b/packages/i18n/src/locales/fr.ts index 9c38e3c692..094948b598 100644 --- a/packages/i18n/src/locales/fr.ts +++ b/packages/i18n/src/locales/fr.ts @@ -1730,13 +1730,13 @@ const fr = { savedViewsUnreadable: "Cette liste est vide parce qu’elle n’a pas pu être lue, et non parce que cet objet n’aurait aucune vue enregistrée. Réessayez, et signalez le problème s’il persiste.", settingsHub: { title: "Paramètres", - subtitle: "Configurez votre environnement, vos intégrations et vos indicateurs de fonctionnalité.", + subtitle: "Configurez votre système, vos intégrations et vos indicateurs de fonctionnalité.", loadError: "Échec du chargement des paramètres", empty: "Aucun paramètre enregistré. Les plugins peuvent enregistrer des manifestes de paramètres via le SettingsService.", settingsCount: "{{n}} paramètres", beta: "Bêta", categories: { - Workspace: "Environnement", + Workspace: "Général", Communication: "Communication", Security: "Sécurité", Infrastructure: "Infrastructure", @@ -2085,12 +2085,12 @@ const fr = { unsupportedSpecifierType: "Type de paramètre non pris en charge : {{type}}", }, workspaceTimezonePrompt: { - title: "Définir le fuseau horaire de l’environnement", - description: "Cet environnement utilise encore le fuseau horaire par défaut de la plateforme, {{current}}. Le fuseau horaire de l’environnement détermine ce que signifie « aujourd’hui » dans les formules, la façon dont les rapports regroupent les dates et l’affichage des dates et des heures, pour tous les membres de l’environnement. Le fuseau horaire de votre navigateur est renseigné ci-dessous.", + title: "Définir le fuseau horaire du système", + description: "Ce système utilise encore le fuseau horaire par défaut de la plateforme, {{current}}. Le fuseau horaire du système détermine ce que signifie « aujourd’hui » dans les formules, la façon dont les rapports regroupent les dates et l’affichage des dates et des heures, pour tous les utilisateurs du système. Le fuseau horaire de votre navigateur est renseigné ci-dessous.", laterHint: "Vous pouvez le modifier à tout moment sur la page Paramètres.", decline: "Conserver la valeur par défaut", confirm: "Définir le fuseau horaire", - saved: "Fuseau horaire de l’environnement défini sur {{zone}}", + saved: "Fuseau horaire du système défini sur {{zone}}", }, error: { connectionFailed: "Impossible de se connecter au serveur", @@ -2150,9 +2150,9 @@ const fr = { }, // objectui#9954 — see the `en` pack for what raises each case. readRate: { - ratioTitle: 'Volume de lecture inhabituel dans cet environnement', + ratioTitle: 'Volume de lecture inhabituel dans ce système', ratio: '{{ratio}} lignes sont lues pour chaque ligne écrite. La plateforme signale tout ce qui dépasse {{threshold}}. Rien n’est limité ni bloqué ; il s’agit d’un rapport permettant d’examiner le schéma de lecture.', - noWritesTitle: 'Lectures sans aucune écriture dans cet environnement', + noWritesTitle: 'Lectures sans aucune écriture dans ce système', noWrites: 'Des lignes sont lues alors qu’aucune n’est écrite, de sorte que le taux de lecture n’a aucune limite supérieure. C’est la mesure la plus grave. La plateforme signale tout ce qui dépasse {{threshold}}. Rien n’est limité ni bloqué ; il s’agit d’un rapport permettant d’examiner le schéma de lecture.', }, // objectui#10439 — see the `en` pack for what raises each case. @@ -2316,7 +2316,7 @@ const fr = { auth: { setPassword: { title: "Définir un mot de passe de secours", - description: "Vous vous êtes connecté via l'authentification unique. Définissez un mot de passe local afin de pouvoir toujours vous connecter directement à cet environnement si le SSO devenait indisponible.", + description: "Vous vous êtes connecté via l'authentification unique. Définissez un mot de passe local afin de pouvoir toujours vous connecter directement si le SSO devenait indisponible.", email: "E-mail", newPassword: "Nouveau mot de passe", confirmPassword: "Confirmer le mot de passe", @@ -2401,7 +2401,7 @@ const fr = { orText: "ou continuer avec l'e-mail", errors: { userExists: "Un compte avec cet e-mail existe déjà. Essayez de vous connecter.", - selfRegistrationClosed: "L'inscription libre n'est pas ouverte dans cet environnement. Demandez une invitation à un administrateur.", + selfRegistrationClosed: "L'inscription libre n'est pas ouverte sur ce système. Demandez une invitation à un administrateur.", emailDomainNotAllowed: "Le domaine de cet e-mail n'est pas autorisé à s'inscrire ici. Utilisez l'e-mail de votre organisation ou demandez une invitation à un administrateur.", }, verifyInbox: { @@ -2478,7 +2478,7 @@ const fr = { checkSpam: "E-mail non reçu ? Vérifiez votre dossier spam ou contactez le support.", or: "Ou", // objectui#3546 slice three. - resendUnavailable: "L'envoi d'e-mails n'est peut-être pas configuré pour cet environnement. Contactez le support si le problème persiste.", + resendUnavailable: "L'envoi d'e-mails n'est peut-être pas configuré pour ce système. Contactez le support si le problème persiste.", }, setup: { welcomeTitle: "Bienvenue sur ObjectStack", @@ -2522,7 +2522,7 @@ const fr = { disabledDescription: "L'autorisation d'appareil n'est pas activée sur ce déploiement, cet appareil ne peut donc pas être approuvé ici.", }, shell: { - tenantHostHint: "Vous vous connectez à cet environnement", + tenantHostHint: "Vous vous connectez à ce système", }, layout: { headline: "Créez des applications métier puissantes, plus vite.", @@ -2619,9 +2619,9 @@ const fr = { password: { changeTitle: "Changer le mot de passe", setTitle: "Définir un mot de passe local", - changeDescription: "Mettez à jour le mot de passe que vous utilisez pour vous connecter à cet environnement.", + changeDescription: "Mettez à jour le mot de passe que vous utilisez pour vous connecter.", setDescription: - "Vous vous êtes connecté via l'authentification unique. Définissez un mot de passe local pour pouvoir également vous connecter avec votre e-mail et un mot de passe sur cet environnement.", + "Vous vous êtes connecté via l'authentification unique. Définissez un mot de passe local pour pouvoir également vous connecter avec votre e-mail et un mot de passe.", current: "Mot de passe actuel", new: "Nouveau mot de passe", password: "Mot de passe", @@ -2630,7 +2630,7 @@ const fr = { mismatch: "Les mots de passe ne correspondent pas", enterCurrent: "Saisissez votre mot de passe actuel", changed: "Mot de passe modifié.", - localSet: "Mot de passe local défini. Vous pouvez désormais vous connecter avec votre e-mail et votre mot de passe sur cet environnement.", + localSet: "Mot de passe local défini. Vous pouvez désormais vous connecter avec votre e-mail et votre mot de passe.", changeAction: "Changer le mot de passe", setAction: "Définir le mot de passe", }, @@ -2708,7 +2708,7 @@ const fr = { home: { build: { title: "Créer une application", - noCapability: "La création d'applications n'est pas disponible dans cet environnement : elle requiert l'autorisation « Gérer les métadonnées », que votre compte ne possède pas.", + noCapability: "La création d'applications n'est pas disponible dans ce système : elle requiert l'autorisation « Gérer les métadonnées », que votre compte ne possède pas.", }, template: { title: "Partir d'un modèle", @@ -2718,7 +2718,7 @@ const fr = { welcomeAdminDescriptionNoBuild: "Configurez votre première application depuis le menu Administration à gauche. Une fois les données en place, l'assistant IA pourra vous aider à les explorer.", welcomeAdminDescriptionNoAi: "Configurez votre première application depuis le menu Administration à gauche.", noAppsTitle: "Aucune application pour l'instant", - noAppsDescription: "Votre environnement est en cours de configuration — les applications partagées par votre administrateur apparaîtront ici.", + noAppsDescription: "Le système est en cours de configuration — les applications partagées par votre administrateur apparaîtront ici.", buildWithAI: "Créer avec l'IA", askAI: "Demander à l'IA", recoveryReminder: { @@ -2768,7 +2768,7 @@ const fr = { notifications: "Notifications", notificationsEmpty: "Aucune notification non lue", }, - loading: "Chargement de l'environnement…", + loading: "Chargement…", welcome: "Bienvenue dans ObjectUI", welcomeDescription: "Commencez par créer votre première application ou configurer les paramètres système.", createFirstApp: "Créez votre première app", @@ -2779,7 +2779,7 @@ const fr = { manageObjects: "Gérer les objets", manageObjectsDesc: "Configurer les modèles de données", systemSettings: "Paramètres système", - systemSettingsDesc: "Configurez votre environnement", + systemSettingsDesc: "Configurez votre système", }, appCard: { noDescription: "Aucune description", @@ -3252,10 +3252,10 @@ const fr = { body: 'La surface MCP est désactivée (OS_MCP_SERVER_ENABLED=false). Demandez à votre opérateur de la réactiver.', }, url: { - title: 'Endpoint MCP de cet environnement', + title: 'Endpoint MCP de ce système', body: 'Tout client IA compatible MCP se connecte avec cette URL. L’identité est en libre-service : le déploiement est son propre serveur d’autorisation OAuth 2.1 — vous vous connectez en votre nom, et chaque appel s’exécute sous vos permissions et la sécurité au niveau des lignes.', downloadSkill: 'Télécharger SKILL.md', - skillHint: 'La skill d’agent portable : apprend à tout agent compatible à travailler avec cet environnement.', + skillHint: 'La skill d’agent portable : apprend à tout agent compatible à travailler avec ce système.', }, claude: { body: 'Paramètres → Connecteurs → Ajouter un connecteur personnalisé, collez cette URL puis connectez-vous dans le navigateur.', @@ -3389,8 +3389,8 @@ const fr = { rowConversational: "Modèle Build / Ask", rowStructured: "Structuré (blueprint / seed)", rowReasoning: "Effort de raisonnement", - readFailed: "Impossible de lire le modèle d'IA effectif. Cet environnement n'exécute peut-être pas de service d'IA, ou vous n'avez pas la permission ai:read.", - readFailedWithStatus: "Impossible de lire le modèle d'IA effectif (HTTP {{status}}). Cet environnement n'exécute peut-être pas de service d'IA, ou vous n'avez pas la permission ai:read.", + readFailed: "Impossible de lire le modèle d'IA effectif. Ce système n'exécute peut-être pas de service d'IA, ou vous n'avez pas la permission ai:read.", + readFailedWithStatus: "Impossible de lire le modèle d'IA effectif (HTTP {{status}}). Ce système n'exécute peut-être pas de service d'IA, ou vous n'avez pas la permission ai:read.", overridesInEffect: "Surcharges actives : ", noOverrides: "aucune — les valeurs par défaut du code déployé s'appliquent.", adapter: "Adaptateur : ", diff --git a/packages/i18n/src/locales/ja.ts b/packages/i18n/src/locales/ja.ts index b2905ebaae..3c5a9ff052 100644 --- a/packages/i18n/src/locales/ja.ts +++ b/packages/i18n/src/locales/ja.ts @@ -1687,13 +1687,13 @@ const ja = { savedViewsUnreadable: "このリストが空なのは読み取れなかったためであり、このオブジェクトに保存済みビューがないためではありません。再試行し、繰り返し発生する場合は報告してください。", settingsHub: { title: "設定", - subtitle: "環境、連携、機能フラグを設定します。", + subtitle: "システム、連携、機能フラグを設定します。", loadError: "設定の読み込みに失敗しました", empty: "登録された設定はありません。プラグインは SettingsService 経由で設定マニフェストを登録できます。", settingsCount: "{{n}} 件の設定", beta: "ベータ", categories: { - Workspace: "環境", + Workspace: "一般", Communication: "コミュニケーション", Security: "セキュリティ", Infrastructure: "インフラストラクチャ", @@ -2041,12 +2041,12 @@ const ja = { unsupportedSpecifierType: "サポートされていない設定項目の種類: {{type}}", }, workspaceTimezonePrompt: { - title: "環境のタイムゾーンを設定", - description: "この環境は、まだプラットフォームの既定のタイムゾーン({{current}})を使用しています。環境のタイムゾーンは、数式での「今日」の意味、レポートの日付ごとのグループ化、日付と時刻の表示方法を決め、環境の全員に適用されます。下にブラウザーのタイムゾーンを入力しています。", + title: "システムのタイムゾーンを設定", + description: "このシステムは、まだプラットフォームの既定のタイムゾーン({{current}})を使用しています。システムのタイムゾーンは、数式での「今日」の意味、レポートの日付ごとのグループ化、日付と時刻の表示方法を決め、システムの全員に適用されます。下にブラウザーのタイムゾーンを入力しています。", laterHint: "設定ページでいつでも変更できます。", decline: "既定のままにする", confirm: "タイムゾーンを設定", - saved: "環境のタイムゾーンを {{zone}} に設定しました", + saved: "システムのタイムゾーンを {{zone}} に設定しました", }, error: { connectionFailed: "サーバーに接続できません", @@ -2106,9 +2106,9 @@ const ja = { }, // objectui#9954 — see the `en` pack for what raises each case. readRate: { - ratioTitle: 'この環境の読み取り量が異常です', + ratioTitle: 'このシステムの読み取り量が異常です', ratio: '書き込み 1 行あたり {{ratio}} 行を読み取っています。プラットフォームは {{threshold}} を超える比率を検出対象とします。制限やブロックは一切行われていません。読み取りパターンを確認するための報告です。', - noWritesTitle: 'この環境は読み取りのみで書き込みがまったくありません', + noWritesTitle: 'このシステムは読み取りのみで書き込みがまったくありません', noWrites: '行の読み取りはある一方で書き込みがまったくないため、読み取り比率に上限がありません。これは最も深刻な読み取り値です。プラットフォームは {{threshold}} を超える比率を検出対象とします。制限やブロックは一切行われていません。読み取りパターンを確認するための報告です。', }, // objectui#10439 — see the `en` pack for what raises each case. @@ -2269,7 +2269,7 @@ const ja = { auth: { setPassword: { title: "リカバリー用パスワードを設定", - description: "シングルサインオンでサインインしました。SSO が利用できなくなったときにもこの環境へ直接サインインできるよう、ローカルパスワードを設定してください。", + description: "シングルサインオンでサインインしました。SSO が利用できなくなったときにも直接サインインできるよう、ローカルパスワードを設定してください。", email: "メールアドレス", newPassword: "新しいパスワード", confirmPassword: "パスワードの確認", @@ -2354,7 +2354,7 @@ const ja = { orText: "またはメールアドレスで続行", errors: { userExists: "このメールアドレスのアカウントはすでに存在します。代わりにサインインしてください。", - selfRegistrationClosed: "この環境ではセルフ登録を受け付けていません。管理者に招待を依頼してください。", + selfRegistrationClosed: "このシステムではセルフ登録を受け付けていません。管理者に招待を依頼してください。", emailDomainNotAllowed: "このメールアドレスのドメインはここでの登録が許可されていません。組織のメールアドレスを使用するか、管理者に招待を依頼してください。", }, verifyInbox: { @@ -2431,7 +2431,7 @@ const ja = { checkSpam: "メールが届きませんか?スパムフォルダーを確認するか、サポートに連絡してください。", or: "または", // objectui#3546 slice three. - resendUnavailable: "この環境ではメール配信が設定されていない可能性があります。問題が続く場合はサポートに連絡してください。", + resendUnavailable: "このシステムではメール配信が設定されていない可能性があります。問題が続く場合はサポートに連絡してください。", }, setup: { welcomeTitle: "ObjectStackへようこそ", @@ -2475,7 +2475,7 @@ const ja = { disabledDescription: "このデプロイメントではデバイス認証が有効になっていないため、ここでこのデバイスを承認できません。", }, shell: { - tenantHostHint: "この環境にサインインしています", + tenantHostHint: "このシステムにサインインしています", }, layout: { headline: "強力なビジネスアプリを、より速く。", @@ -2572,9 +2572,9 @@ const ja = { password: { changeTitle: "パスワードを変更", setTitle: "ローカルパスワードを設定", - changeDescription: "この環境へのサインインに使用するパスワードを更新します。", + changeDescription: "サインインに使用するパスワードを更新します。", setDescription: - "シングルサインオンでサインインしています。ローカルパスワードを設定すると、この環境でメールアドレスとパスワードでもサインインできます。", + "シングルサインオンでサインインしています。ローカルパスワードを設定すると、メールアドレスとパスワードでもサインインできます。", current: "現在のパスワード", new: "新しいパスワード", password: "パスワード", @@ -2583,7 +2583,7 @@ const ja = { mismatch: "パスワードが一致しません", enterCurrent: "現在のパスワードを入力してください", changed: "パスワードを変更しました。", - localSet: "ローカルパスワードを設定しました。この環境でメールアドレスとパスワードでサインインできます。", + localSet: "ローカルパスワードを設定しました。メールアドレスとパスワードでサインインできます。", changeAction: "パスワードを変更", setAction: "パスワードを設定", }, @@ -2661,7 +2661,7 @@ const ja = { home: { build: { title: "アプリを作る", - noCapability: "この環境ではアプリの作成はできません — 「メタデータ管理」権限が必要ですが、お使いのアカウントにはありません。", + noCapability: "このシステムではアプリの作成はできません — 「メタデータ管理」権限が必要ですが、お使いのアカウントにはありません。", }, template: { title: "テンプレートから始める", @@ -2671,7 +2671,7 @@ const ja = { welcomeAdminDescriptionNoBuild: "左の管理メニューから最初のアプリケーションを設定してください。データが入ると、AI アシスタントが分析を手伝えます。", welcomeAdminDescriptionNoAi: "左の管理メニューから最初のアプリケーションを設定してください。", noAppsTitle: "アプリケーションがまだありません", - noAppsDescription: "環境を準備中です — 管理者が共有したアプリがここに表示されます。", + noAppsDescription: "システムを準備中です — 管理者が共有したアプリがここに表示されます。", buildWithAI: "AI でビルド", askAI: "AI に質問", recoveryReminder: { @@ -2720,7 +2720,7 @@ const ja = { notifications: "通知", notificationsEmpty: "未読の通知はありません", }, - loading: "環境を読み込み中…", + loading: "読み込み中…", welcome: "ObjectUI へようこそ", welcomeDescription: "最初のアプリケーションを作成するか、システム設定を行ってください。", createFirstApp: "最初のアプリを作成", @@ -2731,7 +2731,7 @@ const ja = { manageObjects: "オブジェクトを管理", manageObjectsDesc: "データモデルを設定", systemSettings: "システム設定", - systemSettingsDesc: "環境を設定", + systemSettingsDesc: "システムを設定", }, appCard: { noDescription: "説明なし", @@ -3195,10 +3195,10 @@ const ja = { body: 'MCP サーフェスがオフになっています(OS_MCP_SERVER_ENABLED=false)。運用担当者に再有効化を依頼してください。', }, url: { - title: 'この環境の MCP エンドポイント', + title: 'このシステムの MCP エンドポイント', body: 'MCP 対応の AI クライアントはこの URL で接続します。認証はセルフサービスです:デプロイメント自体が OAuth 2.1 認可サーバーなので、ブラウザでログインするだけ。すべての呼び出しはあなたの権限と行レベルセキュリティの下で実行されます。', downloadSkill: 'SKILL.md をダウンロード', - skillHint: 'ポータブルなエージェントスキル:スキル対応エージェントにこの環境の使い方を教えます。', + skillHint: 'ポータブルなエージェントスキル:スキル対応エージェントにこのシステムの使い方を教えます。', }, claude: { body: '設定 → コネクタ → カスタムコネクタを追加で、この URL を貼り付け、ブラウザでログインしてください。', @@ -3329,8 +3329,8 @@ const ja = { rowConversational: "Build / Ask モデル", rowStructured: "構造化(ブループリント / シード)", rowReasoning: "推論の強度", - readFailed: "有効な AI モデルを読み取れませんでした。この環境は AI サービスを実行していないか、ai:read 権限がない可能性があります。", - readFailedWithStatus: "有効な AI モデルを読み取れませんでした(HTTP {{status}})。この環境は AI サービスを実行していないか、ai:read 権限がない可能性があります。", + readFailed: "有効な AI モデルを読み取れませんでした。このシステムは AI サービスを実行していないか、ai:read 権限がない可能性があります。", + readFailedWithStatus: "有効な AI モデルを読み取れませんでした(HTTP {{status}})。このシステムは AI サービスを実行していないか、ai:read 権限がない可能性があります。", overridesInEffect: "有効なオーバーライド: ", noOverrides: "なし — デプロイ済みコードの既定値で動作しています。", adapter: "アダプター: ", diff --git a/packages/i18n/src/locales/ko.ts b/packages/i18n/src/locales/ko.ts index b8b453f97c..31fd912b39 100644 --- a/packages/i18n/src/locales/ko.ts +++ b/packages/i18n/src/locales/ko.ts @@ -1687,13 +1687,13 @@ const ko = { savedViewsUnreadable: "이 목록이 비어 있는 것은 읽지 못했기 때문이며, 이 오브젝트에 저장된 보기가 없어서가 아닙니다. 다시 시도하고, 계속 발생하면 문제를 보고하세요.", settingsHub: { title: "설정", - subtitle: "환경, 연동, 기능 플래그를 구성합니다.", + subtitle: "시스템, 연동, 기능 플래그를 구성합니다.", loadError: "설정을 불러오지 못했습니다", empty: "등록된 설정이 없습니다. 플러그인은 SettingsService를 통해 설정 매니페스트를 등록할 수 있습니다.", settingsCount: "설정 {{n}}개", beta: "베타", categories: { - Workspace: "환경", + Workspace: "일반", Communication: "커뮤니케이션", Security: "보안", Infrastructure: "인프라", @@ -2039,12 +2039,12 @@ const ko = { unsupportedSpecifierType: "지원되지 않는 설정 항목 유형: {{type}}", }, workspaceTimezonePrompt: { - title: "환경 시간대 설정", - description: "이 환경은 아직 플랫폼 기본 시간대({{current}})를 사용하고 있습니다. 환경 시간대는 수식에서 \"오늘\"의 의미, 보고서의 날짜별 그룹화, 날짜와 시간의 표시 방식을 결정하며 환경의 모든 사용자에게 적용됩니다. 아래에 브라우저 시간대가 입력되어 있습니다.", + title: "시스템 시간대 설정", + description: "이 시스템은 아직 플랫폼 기본 시간대({{current}})를 사용하고 있습니다. 시스템 시간대는 수식에서 \"오늘\"의 의미, 보고서의 날짜별 그룹화, 날짜와 시간의 표시 방식을 결정하며 시스템의 모든 사용자에게 적용됩니다. 아래에 브라우저 시간대가 입력되어 있습니다.", laterHint: "설정 페이지에서 언제든지 변경할 수 있습니다.", decline: "기본값 유지", confirm: "시간대 설정", - saved: "환경 시간대를 {{zone}}(으)로 설정했습니다", + saved: "시스템 시간대를 {{zone}}(으)로 설정했습니다", }, error: { connectionFailed: "서버에 연결할 수 없습니다", @@ -2104,9 +2104,9 @@ const ko = { }, // objectui#9954 — see the `en` pack for what raises each case. readRate: { - ratioTitle: '이 환경의 읽기 양이 비정상적입니다', + ratioTitle: '이 시스템의 읽기 양이 비정상적입니다', ratio: '쓰기 1행당 {{ratio}}행을 읽고 있습니다. 플랫폼은 {{threshold}} 초과 비율을 표시합니다. 제한하거나 차단하는 것은 없습니다. 읽기 패턴을 검토할 수 있도록 알리는 보고입니다.', - noWritesTitle: '이 환경은 읽기만 있고 쓰기가 전혀 없습니다', + noWritesTitle: '이 시스템은 읽기만 있고 쓰기가 전혀 없습니다', noWrites: '행을 읽고 있지만 쓰기가 전혀 없어 읽기 비율에 상한이 없습니다. 가장 심각한 수치입니다. 플랫폼은 {{threshold}} 초과 비율을 표시합니다. 제한하거나 차단하는 것은 없습니다. 읽기 패턴을 검토할 수 있도록 알리는 보고입니다.', }, // objectui#10439 — see the `en` pack for what raises each case. @@ -2267,7 +2267,7 @@ const ko = { auth: { setPassword: { title: "복구 비밀번호 설정", - description: "싱글 사인온으로 로그인했습니다. SSO를 사용할 수 없게 되더라도 이 환경에 직접 로그인할 수 있도록 로컬 비밀번호를 설정하세요.", + description: "싱글 사인온으로 로그인했습니다. SSO를 사용할 수 없게 되더라도 직접 로그인할 수 있도록 로컬 비밀번호를 설정하세요.", email: "이메일", newPassword: "새 비밀번호", confirmPassword: "비밀번호 확인", @@ -2352,7 +2352,7 @@ const ko = { orText: "또는 이메일로 계속", errors: { userExists: "해당 이메일로 이미 계정이 존재합니다. 로그인해 보세요.", - selfRegistrationClosed: "이 환경에서는 직접 가입을 받지 않습니다. 관리자에게 초대를 요청하세요.", + selfRegistrationClosed: "이 시스템에서는 직접 가입을 받지 않습니다. 관리자에게 초대를 요청하세요.", emailDomainNotAllowed: "이 이메일의 도메인으로는 여기에서 가입할 수 없습니다. 조직 이메일을 사용하거나 관리자에게 초대를 요청하세요.", }, verifyInbox: { @@ -2429,7 +2429,7 @@ const ko = { checkSpam: "이메일을 받지 못하셨나요? 스팸 폴더를 확인하거나 지원팀에 문의하세요.", or: "또는", // objectui#3546 slice three. - resendUnavailable: "이 환경에서는 이메일 발송이 구성되지 않았을 수 있습니다. 문제가 계속되면 지원팀에 문의하세요.", + resendUnavailable: "이 시스템에서는 이메일 발송이 구성되지 않았을 수 있습니다. 문제가 계속되면 지원팀에 문의하세요.", }, setup: { welcomeTitle: "ObjectStack에 오신 것을 환영합니다", @@ -2473,7 +2473,7 @@ const ko = { disabledDescription: "이 배포에는 장치 승인이 활성화되어 있지 않으므로 여기에서 이 장치를 승인할 수 없습니다.", }, shell: { - tenantHostHint: "이 환경에 로그인하는 중입니다", + tenantHostHint: "이 시스템에 로그인하는 중입니다", }, layout: { headline: "강력한 비즈니스 애플리케이션을 더 빠르게.", @@ -2570,9 +2570,9 @@ const ko = { password: { changeTitle: "비밀번호 변경", setTitle: "로컬 비밀번호 설정", - changeDescription: "이 환경에 로그인할 때 사용하는 비밀번호를 업데이트하세요.", + changeDescription: "로그인할 때 사용하는 비밀번호를 업데이트하세요.", setDescription: - "통합 인증(SSO)으로 로그인하셨습니다. 로컬 비밀번호를 설정하면 이 환경에서 이메일과 비밀번호로도 로그인할 수 있습니다.", + "통합 인증(SSO)으로 로그인하셨습니다. 로컬 비밀번호를 설정하면 이메일과 비밀번호로도 로그인할 수 있습니다.", current: "현재 비밀번호", new: "새 비밀번호", password: "비밀번호", @@ -2581,7 +2581,7 @@ const ko = { mismatch: "비밀번호가 일치하지 않습니다", enterCurrent: "현재 비밀번호를 입력하세요", changed: "비밀번호가 변경되었습니다.", - localSet: "로컬 비밀번호가 설정되었습니다. 이제 이 환경에서 이메일과 비밀번호로 로그인할 수 있습니다.", + localSet: "로컬 비밀번호가 설정되었습니다. 이제 이메일과 비밀번호로 로그인할 수 있습니다.", changeAction: "비밀번호 변경", setAction: "비밀번호 설정", }, @@ -2659,7 +2659,7 @@ const ko = { home: { build: { title: "앱 만들기", - noCapability: "이 환경에서는 앱 만들기를 사용할 수 없습니다 — ‘메타데이터 관리’ 권한이 필요하지만 계정에 해당 권한이 없습니다.", + noCapability: "이 시스템에서는 앱 만들기를 사용할 수 없습니다 — ‘메타데이터 관리’ 권한이 필요하지만 계정에 해당 권한이 없습니다.", }, template: { title: "템플릿으로 시작", @@ -2669,7 +2669,7 @@ const ko = { welcomeAdminDescriptionNoBuild: "왼쪽 관리 메뉴에서 첫 애플리케이션을 설정하세요. 데이터가 쌓이면 AI 어시스턴트가 살펴보는 것을 도와줍니다.", welcomeAdminDescriptionNoAi: "왼쪽 관리 메뉴에서 첫 애플리케이션을 설정하세요.", noAppsTitle: "아직 애플리케이션이 없습니다", - noAppsDescription: "환경을 준비하고 있습니다 — 관리자가 공유한 앱이 여기에 표시됩니다.", + noAppsDescription: "시스템을 준비하고 있습니다 — 관리자가 공유한 앱이 여기에 표시됩니다.", buildWithAI: "AI로 빌드", askAI: "AI에게 질문", recoveryReminder: { @@ -2717,7 +2717,7 @@ const ko = { notifications: "알림", notificationsEmpty: "읽지 않은 알림이 없습니다", }, - loading: "환경 로드 중…", + loading: "로딩 중…", welcome: "ObjectUI에 오신 것을 환영합니다", welcomeDescription: "첫 애플리케이션을 만들거나 시스템 설정을 구성하여 시작하세요.", createFirstApp: "첫 앱 만들기", @@ -2728,7 +2728,7 @@ const ko = { manageObjects: "객체 관리", manageObjectsDesc: "데이터 모델 구성", systemSettings: "시스템 설정", - systemSettingsDesc: "환경 구성", + systemSettingsDesc: "시스템 구성", }, appCard: { noDescription: "설명 없음", @@ -3192,10 +3192,10 @@ const ko = { body: 'MCP 서비스가 꺼져 있습니다(OS_MCP_SERVER_ENABLED=false). 운영자에게 다시 활성화를 요청하세요.', }, url: { - title: '이 환경의 MCP 엔드포인트', + title: '이 시스템의 MCP 엔드포인트', body: 'MCP를 지원하는 모든 AI 클라이언트가 이 URL로 연결합니다. 인증은 셀프서비스입니다. 배포 자체가 OAuth 2.1 인가 서버이므로 브라우저 로그인만 하면 되고, 모든 호출은 본인의 권한과 행 수준 보안 아래 실행됩니다.', downloadSkill: 'SKILL.md 다운로드', - skillHint: '이식 가능한 에이전트 스킬: 스킬을 지원하는 에이전트에게 이 환경 사용법을 알려줍니다.', + skillHint: '이식 가능한 에이전트 스킬: 스킬을 지원하는 에이전트에게 이 시스템 사용법을 알려줍니다.', }, claude: { body: '설정 → 커넥터 → 사용자 지정 커넥터 추가에서 이 URL을 붙여넣고 브라우저에서 로그인하세요.', @@ -3326,8 +3326,8 @@ const ko = { rowConversational: "Build / Ask 모델", rowStructured: "구조화(블루프린트 / 시드)", rowReasoning: "추론 강도", - readFailed: "유효한 AI 모델을 읽을 수 없습니다. 이 환경에서 AI 서비스가 실행되지 않거나 ai:read 권한이 없을 수 있습니다.", - readFailedWithStatus: "유효한 AI 모델을 읽을 수 없습니다(HTTP {{status}}). 이 환경에서 AI 서비스가 실행되지 않거나 ai:read 권한이 없을 수 있습니다.", + readFailed: "유효한 AI 모델을 읽을 수 없습니다. 이 시스템에서 AI 서비스가 실행되지 않거나 ai:read 권한이 없을 수 있습니다.", + readFailedWithStatus: "유효한 AI 모델을 읽을 수 없습니다(HTTP {{status}}). 이 시스템에서 AI 서비스가 실행되지 않거나 ai:read 권한이 없을 수 있습니다.", overridesInEffect: "적용 중인 재정의: ", noOverrides: "없음 — 배포된 코드의 기본값으로 실행 중입니다.", adapter: "어댑터: ", diff --git a/packages/i18n/src/locales/pt.ts b/packages/i18n/src/locales/pt.ts index 425846ae54..2a43fbb41b 100644 --- a/packages/i18n/src/locales/pt.ts +++ b/packages/i18n/src/locales/pt.ts @@ -1728,13 +1728,13 @@ const pt = { savedViewsUnreadable: "Esta lista está vazia porque não pôde ser lida, não porque este objeto não tenha exibições salvas. Tente novamente e relate o problema se ele persistir.", settingsHub: { title: "Configurações", - subtitle: "Configure seu ambiente, integrações e sinalizadores de recursos.", + subtitle: "Configure seu sistema, integrações e sinalizadores de recursos.", loadError: "Falha ao carregar as configurações", empty: "Nenhuma configuração registrada. Os plugins podem registrar manifestos de configuração pelo SettingsService.", settingsCount: "{{n}} configurações", beta: "Beta", categories: { - Workspace: "Ambiente", + Workspace: "Geral", Communication: "Comunicação", Security: "Segurança", Infrastructure: "Infraestrutura", @@ -2083,12 +2083,12 @@ const pt = { unsupportedSpecifierType: "Tipo de configuração não suportado: {{type}}", }, workspaceTimezonePrompt: { - title: "Definir o fuso horário do ambiente", - description: "Este ambiente ainda usa o fuso horário padrão da plataforma, {{current}}. O fuso horário do ambiente define o que \"hoje\" significa nas fórmulas, como os relatórios agrupam por data e como datas e horas são exibidas, para todos no ambiente. O fuso horário do seu navegador foi preenchido abaixo.", + title: "Definir o fuso horário do sistema", + description: "Este sistema ainda usa o fuso horário padrão da plataforma, {{current}}. O fuso horário do sistema define o que \"hoje\" significa nas fórmulas, como os relatórios agrupam por data e como datas e horas são exibidas, para todos no sistema. O fuso horário do seu navegador foi preenchido abaixo.", laterHint: "Você pode alterá-lo a qualquer momento na página de Configurações.", decline: "Manter o padrão", confirm: "Definir fuso horário", - saved: "Fuso horário do ambiente definido como {{zone}}", + saved: "Fuso horário do sistema definido como {{zone}}", }, error: { connectionFailed: "Não é possível conectar ao servidor", @@ -2148,9 +2148,9 @@ const pt = { }, // objectui#9954 — see the `en` pack for what raises each case. readRate: { - ratioTitle: 'Volume de leitura incomum neste ambiente', + ratioTitle: 'Volume de leitura incomum neste sistema', ratio: 'São lidas {{ratio}} linhas para cada linha gravada. A plataforma sinaliza tudo acima de {{threshold}}. Nada está sendo limitado ou bloqueado; este é um relatório para que o padrão de leitura possa ser revisado.', - noWritesTitle: 'Leituras sem nenhuma gravação neste ambiente', + noWritesTitle: 'Leituras sem nenhuma gravação neste sistema', noWrites: 'Linhas estão sendo lidas sem que nenhuma seja gravada, portanto a taxa de leitura não tem limite superior. Esta é a leitura mais grave. A plataforma sinaliza tudo acima de {{threshold}}. Nada está sendo limitado ou bloqueado; este é um relatório para que o padrão de leitura possa ser revisado.', }, // objectui#10439 — see the `en` pack for what raises each case. @@ -2314,7 +2314,7 @@ const pt = { auth: { setPassword: { title: "Definir uma senha de recuperação", - description: "Você entrou por logon único. Defina uma senha local para continuar conseguindo acessar este ambiente diretamente caso o SSO fique indisponível.", + description: "Você entrou por logon único. Defina uma senha local para continuar conseguindo entrar diretamente caso o SSO fique indisponível.", email: "E-mail", newPassword: "Nova senha", confirmPassword: "Confirmar a senha", @@ -2399,7 +2399,7 @@ const pt = { orText: "ou continue com e-mail", errors: { userExists: "Já existe uma conta com esse e-mail. Tente fazer login.", - selfRegistrationClosed: "O cadastro por conta própria não está aberto neste ambiente. Peça um convite a um administrador.", + selfRegistrationClosed: "O cadastro por conta própria não está aberto neste sistema. Peça um convite a um administrador.", emailDomainNotAllowed: "O domínio deste e-mail não tem permissão para se cadastrar aqui. Use o e-mail da sua organização ou peça um convite a um administrador.", }, verifyInbox: { @@ -2476,7 +2476,7 @@ const pt = { checkSpam: "Não recebeu o e-mail? Verifique sua pasta de spam ou entre em contato com o suporte.", or: "Ou", // objectui#3546 slice three. - resendUnavailable: "O envio de e-mails pode não estar configurado neste ambiente. Entre em contato com o suporte se o problema persistir.", + resendUnavailable: "O envio de e-mails pode não estar configurado neste sistema. Entre em contato com o suporte se o problema persistir.", }, setup: { welcomeTitle: "Bem-vindo ao ObjectStack", @@ -2520,7 +2520,7 @@ const pt = { disabledDescription: "Esta implantação não tem a autorização de dispositivo habilitada, por isso este dispositivo não pode ser aprovado aqui.", }, shell: { - tenantHostHint: "Você está fazendo login neste ambiente", + tenantHostHint: "Você está fazendo login neste sistema", }, layout: { headline: "Crie aplicativos de negócios poderosos, com mais rapidez.", @@ -2617,9 +2617,9 @@ const pt = { password: { changeTitle: "Alterar senha", setTitle: "Definir senha local", - changeDescription: "Atualize a senha que você usa para entrar neste ambiente.", + changeDescription: "Atualize a senha que você usa para entrar.", setDescription: - "Você entrou via logon único (SSO). Defina uma senha local para também poder entrar com e-mail e senha neste ambiente.", + "Você entrou via logon único (SSO). Defina uma senha local para também poder entrar com e-mail e senha.", current: "Senha atual", new: "Nova senha", password: "Senha", @@ -2628,7 +2628,7 @@ const pt = { mismatch: "As senhas não coincidem", enterCurrent: "Digite sua senha atual", changed: "Senha alterada.", - localSet: "Senha local definida. Agora você pode entrar com e-mail e senha neste ambiente.", + localSet: "Senha local definida. Agora você pode entrar com e-mail e senha.", changeAction: "Alterar senha", setAction: "Definir senha", }, @@ -2706,7 +2706,7 @@ const pt = { home: { build: { title: "Criar um aplicativo", - noCapability: "A criação de aplicativos não está disponível neste ambiente — ela exige a permissão “Gerenciar metadados”, que sua conta não possui.", + noCapability: "A criação de aplicativos não está disponível neste sistema — ela exige a permissão “Gerenciar metadados”, que sua conta não possui.", }, template: { title: "Comece com um modelo", @@ -2716,7 +2716,7 @@ const pt = { welcomeAdminDescriptionNoBuild: "Configure seu primeiro aplicativo pelo menu de Administração à esquerda. Quando houver dados, o assistente de IA poderá ajudar a explorá-los.", welcomeAdminDescriptionNoAi: "Configure seu primeiro aplicativo pelo menu de Administração à esquerda.", noAppsTitle: "Ainda não há aplicativos", - noAppsDescription: "Seu ambiente está sendo preparado — os aplicativos que seu administrador compartilhar aparecerão aqui.", + noAppsDescription: "O sistema está sendo preparado — os aplicativos que seu administrador compartilhar aparecerão aqui.", buildWithAI: "Criar com IA", askAI: "Perguntar à IA", recoveryReminder: { @@ -2766,7 +2766,7 @@ const pt = { notifications: "Notificações", notificationsEmpty: "Nenhuma notificação não lida", }, - loading: "Carregando ambiente…", + loading: "Carregando…", welcome: "Bem-vindo ao ObjectUI", welcomeDescription: "Comece criando sua primeira aplicação ou configurando as preferências do sistema.", createFirstApp: "Crie sua primeira app", @@ -2777,7 +2777,7 @@ const pt = { manageObjects: "Gerenciar objetos", manageObjectsDesc: "Configure modelos de dados", systemSettings: "Configurações do sistema", - systemSettingsDesc: "Configure seu ambiente", + systemSettingsDesc: "Configure seu sistema", }, appCard: { noDescription: "Sem descrição", @@ -3250,10 +3250,10 @@ const pt = { body: 'A superfície MCP está desligada (OS_MCP_SERVER_ENABLED=false). Peça ao operador para reativá-la.', }, url: { - title: 'Endpoint MCP deste ambiente', + title: 'Endpoint MCP deste sistema', body: 'Qualquer cliente de IA compatível com MCP conecta-se com esta URL. A identidade é autosserviço: a implantação é seu próprio servidor de autorização OAuth 2.1 — você entra como você mesmo e cada chamada corre sob suas permissões e segurança em nível de linha.', downloadSkill: 'Baixar SKILL.md', - skillHint: 'A skill portátil do agente: ensina qualquer agente compatível a trabalhar com este ambiente.', + skillHint: 'A skill portátil do agente: ensina qualquer agente compatível a trabalhar com este sistema.', }, claude: { body: 'Configurações → Conectores → Adicionar conector personalizado, cole esta URL e faça login no navegador.', @@ -3387,8 +3387,8 @@ const pt = { rowConversational: "Modelo Build / Ask", rowStructured: "Estruturado (blueprint / seed)", rowReasoning: "Esforço de raciocínio", - readFailed: "Não foi possível ler o modelo de IA efetivo. Este ambiente pode não executar um serviço de IA, ou você pode não ter a permissão ai:read.", - readFailedWithStatus: "Não foi possível ler o modelo de IA efetivo (HTTP {{status}}). Este ambiente pode não executar um serviço de IA, ou você pode não ter a permissão ai:read.", + readFailed: "Não foi possível ler o modelo de IA efetivo. Este sistema pode não executar um serviço de IA, ou você pode não ter a permissão ai:read.", + readFailedWithStatus: "Não foi possível ler o modelo de IA efetivo (HTTP {{status}}). Este sistema pode não executar um serviço de IA, ou você pode não ter a permissão ai:read.", overridesInEffect: "Substituições em vigor: ", noOverrides: "nenhuma — usando os padrões do código implantado.", adapter: "Adaptador: ", diff --git a/packages/i18n/src/locales/ru.ts b/packages/i18n/src/locales/ru.ts index d77ee9d299..61e8c66ae7 100644 --- a/packages/i18n/src/locales/ru.ts +++ b/packages/i18n/src/locales/ru.ts @@ -1786,13 +1786,13 @@ const ru = { savedViewsUnreadable: "Список пуст из-за того, что его не удалось прочитать, а не потому, что у этого объекта нет сохранённых представлений. Повторите попытку и сообщите о проблеме, если она повторяется.", settingsHub: { title: "Настройки", - subtitle: "Настройте окружение, интеграции и флаги функций.", + subtitle: "Настройте систему, интеграции и флаги функций.", loadError: "Не удалось загрузить настройки", empty: "Настройки не зарегистрированы. Плагины могут регистрировать манифесты настроек через SettingsService.", settingsCount: "Настроек: {{n}}", beta: "Бета", categories: { - Workspace: "Окружение", + Workspace: "Общие", Communication: "Коммуникации", Security: "Безопасность", Infrastructure: "Инфраструктура", @@ -2146,12 +2146,12 @@ const ru = { unsupportedSpecifierType: "Неподдерживаемый тип настройки: {{type}}", }, workspaceTimezonePrompt: { - title: "Задайте часовой пояс окружения", - description: "В этом окружении всё ещё используется часовой пояс платформы по умолчанию — {{current}}. Часовой пояс окружения определяет, что означает «сегодня» в формулах, как отчёты группируют данные по датам и как отображаются дата и время, — для всех в окружении. Ниже указан часовой пояс вашего браузера.", + title: "Задайте часовой пояс системы", + description: "В этой системе всё ещё используется часовой пояс платформы по умолчанию — {{current}}. Часовой пояс системы определяет, что означает «сегодня» в формулах, как отчёты группируют данные по датам и как отображаются дата и время, — для всех в системе. Ниже указан часовой пояс вашего браузера.", laterHint: "Его можно изменить в любое время на странице «Настройки».", decline: "Оставить по умолчанию", confirm: "Задать часовой пояс", - saved: "Часовой пояс окружения: {{zone}}", + saved: "Часовой пояс системы: {{zone}}", }, error: { connectionFailed: "Не удаётся подключиться к серверу", @@ -2211,9 +2211,9 @@ const ru = { }, // objectui#9954 — see the `en` pack for what raises each case. readRate: { - ratioTitle: 'Необычный объём чтения в этой среде', + ratioTitle: 'Необычный объём чтения в этой системе', ratio: 'На каждую записанную строку читается {{ratio}} строк. Платформа отмечает всё, что выше {{threshold}}. Ничто не ограничивается и не блокируется; это отчёт, чтобы можно было проверить схему чтения.', - noWritesTitle: 'Чтение вообще без записи в этой среде', + noWritesTitle: 'Чтение вообще без записи в этой системе', noWrites: 'Строки читаются, но не записывается ни одной, поэтому у скорости чтения нет верхней границы. Это самый серьёзный показатель. Платформа отмечает всё, что выше {{threshold}}. Ничто не ограничивается и не блокируется; это отчёт, чтобы можно было проверить схему чтения.', }, // objectui#10439 — see the `en` pack for what raises each case. @@ -2383,7 +2383,7 @@ const ru = { auth: { setPassword: { title: "Задать резервный пароль", - description: "Вы вошли через единый вход. Задайте локальный пароль, чтобы входить в эту среду напрямую, если SSO станет недоступен.", + description: "Вы вошли через единый вход. Задайте локальный пароль, чтобы входить напрямую, если SSO станет недоступен.", email: "Электронная почта", newPassword: "Новый пароль", confirmPassword: "Подтвердите пароль", @@ -2468,7 +2468,7 @@ const ru = { orText: "или продолжите с электронной почтой", errors: { userExists: "Аккаунт с таким email уже существует. Попробуйте войти.", - selfRegistrationClosed: "Самостоятельная регистрация в этой среде закрыта. Обратитесь к администратору за приглашением.", + selfRegistrationClosed: "Самостоятельная регистрация в этой системе закрыта. Обратитесь к администратору за приглашением.", emailDomainNotAllowed: "Регистрация с адресами этого домена здесь не разрешена. Используйте email вашей организации или обратитесь к администратору за приглашением.", }, verifyInbox: { @@ -2545,7 +2545,7 @@ const ru = { checkSpam: "Не получили письмо? Проверьте папку \"Спам\" или обратитесь в поддержку.", or: "Или", // objectui#3546 slice three. - resendUnavailable: "Возможно, отправка писем не настроена для этой среды. Если проблема повторяется, обратитесь в поддержку.", + resendUnavailable: "Возможно, отправка писем не настроена для этой системы. Если проблема повторяется, обратитесь в поддержку.", }, setup: { welcomeTitle: "Добро пожаловать в ObjectStack", @@ -2589,7 +2589,7 @@ const ru = { disabledDescription: "В этой инсталляции авторизация устройств не включена, поэтому это устройство здесь одобрить нельзя.", }, shell: { - tenantHostHint: "Вы входите в это окружение", + tenantHostHint: "Вы входите в эту систему", }, layout: { headline: "Создавайте мощные бизнес-приложения быстрее.", @@ -2686,9 +2686,9 @@ const ru = { password: { changeTitle: "Изменить пароль", setTitle: "Задать локальный пароль", - changeDescription: "Обновите пароль, который вы используете для входа в эту среду.", + changeDescription: "Обновите пароль, который вы используете для входа.", setDescription: - "Вы вошли через единый вход (SSO). Задайте локальный пароль, чтобы также входить в эту среду по электронной почте и паролю.", + "Вы вошли через единый вход (SSO). Задайте локальный пароль, чтобы также входить по электронной почте и паролю.", current: "Текущий пароль", new: "Новый пароль", password: "Пароль", @@ -2697,7 +2697,7 @@ const ru = { mismatch: "Пароли не совпадают", enterCurrent: "Введите текущий пароль", changed: "Пароль изменён.", - localSet: "Локальный пароль задан. Теперь вы можете входить в эту среду по электронной почте и паролю.", + localSet: "Локальный пароль задан. Теперь вы можете входить по электронной почте и паролю.", changeAction: "Изменить пароль", setAction: "Задать пароль", }, @@ -2775,7 +2775,7 @@ const ru = { home: { build: { title: "Создать приложение", - noCapability: "Создание приложений недоступно в этом окружении — для этого нужно разрешение «Управление метаданными», которого нет у вашей учётной записи.", + noCapability: "Создание приложений недоступно в этой системе — для этого нужно разрешение «Управление метаданными», которого нет у вашей учётной записи.", }, template: { title: "Начать с шаблона", @@ -2785,7 +2785,7 @@ const ru = { welcomeAdminDescriptionNoBuild: "Настройте первое приложение через меню «Администрирование» слева. Когда появятся данные, ИИ-ассистент поможет их изучить.", welcomeAdminDescriptionNoAi: "Настройте первое приложение через меню «Администрирование» слева.", noAppsTitle: "Приложений пока нет", - noAppsDescription: "Ваше окружение настраивается — приложения, которыми поделится администратор, появятся здесь.", + noAppsDescription: "Система настраивается — приложения, которыми поделится администратор, появятся здесь.", buildWithAI: "Создать с помощью ИИ", askAI: "Спросить ИИ", recoveryReminder: { @@ -2837,7 +2837,7 @@ const ru = { notifications: "Уведомления", notificationsEmpty: "Нет непрочитанных уведомлений", }, - loading: "Загрузка окружения…", + loading: "Загрузка…", welcome: "Добро пожаловать в ObjectUI", welcomeDescription: "Начните с создания вашего первого приложения или настройки системы.", createFirstApp: "Создайте первое приложение", @@ -2848,7 +2848,7 @@ const ru = { manageObjects: "Управление объектами", manageObjectsDesc: "Настройте модели данных", systemSettings: "Системные настройки", - systemSettingsDesc: "Настройте окружение", + systemSettingsDesc: "Настройте систему", }, appCard: { noDescription: "Без описания", @@ -3333,10 +3333,10 @@ const ru = { body: 'Поверхность MCP выключена (OS_MCP_SERVER_ENABLED=false). Попросите оператора включить её снова.', }, url: { - title: 'MCP-эндпоинт этого окружения', + title: 'MCP-эндпоинт этой системы', body: 'Любой ИИ-клиент с поддержкой MCP подключается по этому URL. Идентификация — самообслуживание: развертывание само является сервером авторизации OAuth 2.1 — вы входите под своим именем, и каждый вызов выполняется в рамках ваших прав и строковой безопасности.', downloadSkill: 'Скачать SKILL.md', - skillHint: 'Переносимый навык агента: учит любого совместимого агента работать с этим окружением.', + skillHint: 'Переносимый навык агента: учит любого совместимого агента работать с этой системой.', }, claude: { body: 'Настройки → Коннекторы → Добавить пользовательский коннектор, вставьте этот URL и войдите через браузер.', @@ -3473,8 +3473,8 @@ const ru = { rowConversational: "Модель Build / Ask", rowStructured: "Структурированный (blueprint / seed)", rowReasoning: "Интенсивность рассуждений", - readFailed: "Не удалось прочитать действующую модель ИИ. В этом окружении может не быть запущен сервис ИИ, либо у вас нет разрешения ai:read.", - readFailedWithStatus: "Не удалось прочитать действующую модель ИИ (HTTP {{status}}). В этом окружении может не быть запущен сервис ИИ, либо у вас нет разрешения ai:read.", + readFailed: "Не удалось прочитать действующую модель ИИ. В этой системе может не быть запущен сервис ИИ, либо у вас нет разрешения ai:read.", + readFailedWithStatus: "Не удалось прочитать действующую модель ИИ (HTTP {{status}}). В этой системе может не быть запущен сервис ИИ, либо у вас нет разрешения ai:read.", overridesInEffect: "Действующие переопределения: ", noOverrides: "нет — используются значения по умолчанию развёрнутого кода.", adapter: "Адаптер: ", diff --git a/packages/i18n/src/locales/zh.ts b/packages/i18n/src/locales/zh.ts index e2551d6afd..4fced541eb 100644 --- a/packages/i18n/src/locales/zh.ts +++ b/packages/i18n/src/locales/zh.ts @@ -1781,14 +1781,14 @@ const zh = { }, settingsHub: { title: '设置', - subtitle: '配置环境、集成与功能开关。', + subtitle: '配置系统、集成与功能开关。', loadError: '加载设置失败', empty: '尚未注册任何设置。插件可通过 SettingsService 注册设置清单。', settingsCount: '{{n}} 项设置', beta: 'Beta', // 分类小标题,按 manifest 的 `category` 值取键;未知(插件自定义)分类回退到原始字符串。 categories: { - Workspace: '环境', + Workspace: '常规', Communication: '通讯', Security: '安全', Infrastructure: '基础设施', @@ -1829,12 +1829,12 @@ const zh = { unsupportedSpecifierType: '不支持的设置项类型:{{type}}', }, workspaceTimezonePrompt: { - title: '设置环境时区', - description: '此环境仍在使用平台默认时区 {{current}}。环境时区决定公式中“今天”的含义、报表如何按日期分组,以及日期和时间如何显示,对环境内所有人生效。下方已填入你的浏览器时区。', + title: '设置系统时区', + description: '本系统仍在使用平台默认时区 {{current}}。系统时区决定公式中“今天”的含义、报表如何按日期分组,以及日期和时间如何显示,对系统内所有人生效。下方已填入你的浏览器时区。', laterHint: '之后可随时在“设置”页面中修改。', decline: '保持默认', confirm: '设置时区', - saved: '环境时区已设置为 {{zone}}', + saved: '系统时区已设置为 {{zone}}', }, error: { connectionFailed: '无法连接到服务器', @@ -2172,9 +2172,9 @@ const zh = { }, // objectui#9954 — see the `en` pack for what raises each case. readRate: { - ratioTitle: '本环境读取量异常', + ratioTitle: '本系统读取量异常', ratio: '每写入 1 行就读取 {{ratio}} 行。平台会标记高于 {{threshold}} 的比率。没有任何东西被限制或阻断;这只是一份报告,便于检查读取方式。', - noWritesTitle: '本环境只有读取、完全没有写入', + noWritesTitle: '本系统只有读取、完全没有写入', noWrites: '有行被读取,却完全没有任何写入,因此读取比率没有上限。这是最严重的读数。平台会标记高于 {{threshold}} 的比率。没有任何东西被限制或阻断;这只是一份报告,便于检查读取方式。', }, // objectui#10439 — see the `en` pack for what raises each case. @@ -2418,7 +2418,7 @@ const zh = { orText: '或使用邮箱继续', errors: { userExists: '该邮箱已被注册,请直接登录或更换邮箱。', - selfRegistrationClosed: '本环境未开放自助注册,请联系管理员获取邀请。', + selfRegistrationClosed: '本系统未开放自助注册,请联系管理员获取邀请。', emailDomainNotAllowed: '该邮箱的域名不允许在此注册,请使用组织邮箱,或联系管理员获取邀请。', }, verifyInbox: { @@ -2459,7 +2459,7 @@ const zh = { }, setPassword: { title: '设置一个备用密码', - description: '您是通过单点登录进入的。设置一个本地密码,这样即使单点登录不可用,您仍能直接登录此环境。', + description: '您是通过单点登录进入的。设置一个本地密码,这样即使单点登录不可用,您仍能直接登录。', email: '邮箱', newPassword: '新密码', confirmPassword: '确认密码', @@ -2509,7 +2509,7 @@ const zh = { checkSpam: '没有收到邮件?请检查垃圾邮件文件夹或联系支持。', or: '或', // objectui#3546 slice three. - resendUnavailable: '此环境可能未配置邮件发送服务。如果问题持续存在,请联系支持。', + resendUnavailable: '本系统可能未配置邮件发送服务。如果问题持续存在,请联系支持。', }, setup: { welcomeTitle: '欢迎使用 ObjectStack', @@ -2553,7 +2553,7 @@ const zh = { disabledDescription: '此部署未启用设备授权,因此无法在此批准该设备。', }, shell: { - tenantHostHint: '您正在登录此环境', + tenantHostHint: '您正在登录本系统', }, layout: { headline: '更快地构建强大的业务应用。', @@ -2650,8 +2650,8 @@ const zh = { password: { changeTitle: '修改密码', setTitle: '设置本地密码', - changeDescription: '更新您在此环境登录所用的密码。', - setDescription: '您通过单点登录进入。设置本地密码后,也可以在此环境使用邮箱和密码登录。', + changeDescription: '更新您登录所用的密码。', + setDescription: '您通过单点登录进入。设置本地密码后,也可以使用邮箱和密码登录。', current: '当前密码', new: '新密码', password: '密码', @@ -2660,7 +2660,7 @@ const zh = { mismatch: '两次输入的密码不一致', enterCurrent: '请输入当前密码', changed: '密码已修改。', - localSet: '本地密码已设置。现在您可以在此环境使用邮箱和密码登录。', + localSet: '本地密码已设置。现在您可以使用邮箱和密码登录。', changeAction: '修改密码', setAction: '设置密码', }, @@ -2772,25 +2772,25 @@ const zh = { appOpened: '{{time}}打开', build: { title: '构建应用', - noCapability: '此环境不提供构建应用功能 — 它需要「管理元数据」权限,而你的账号没有该权限。', + noCapability: '本系统不提供构建应用功能 — 它需要「管理元数据」权限,而你的账号没有该权限。', }, template: { title: '从模板开始', marketplaceDisabled: '本运行时未配置应用市场,因此这里没有可安装的模板。', }, open: '打开', - loading: '正在加载环境…', + loading: '加载中…', welcome: '用 AI 搭建你的业务系统', welcomeDescription: '用一句话描述你的业务,AI 帮你生成对象、界面、API 和 agent 工具。也可以手动从零开始。', welcomeAdminDescription: '用一句话描述你的业务,AI 会为你生成对象、界面、API 和智能体工具;也可以从左侧菜单自行搭建。', welcomeAdminDescriptionNoBuild: '从左侧的「管理」菜单创建你的第一个应用。有了数据后,AI 助手可以帮你查询和分析。', welcomeAdminDescriptionNoAi: '从左侧的「管理」菜单创建你的第一个应用。', noAppsTitle: '还没有应用', - noAppsDescription: '环境正在准备中——管理员共享给你的应用会显示在这里。', + noAppsDescription: '系统正在准备中——管理员共享给你的应用会显示在这里。', buildWithAI: '用 AI 搭建', askAI: '问 AI', recoveryReminder: { - message: '建议设置一个备用密码,这样即使单点登录不可用,你仍能直接登录此环境。', + message: '建议设置一个备用密码,这样即使单点登录不可用,你仍能直接登录。', cta: '设置密码', dismiss: '关闭', }, @@ -2824,7 +2824,7 @@ const zh = { manageObjects: '管理对象', manageObjectsDesc: '配置数据模型', systemSettings: '系统设置', - systemSettingsDesc: '配置您的环境', + systemSettingsDesc: '配置您的系统', }, recentApps: { title: '最近访问', @@ -3332,10 +3332,10 @@ const zh = { body: 'MCP 服务已关闭(OS_MCP_SERVER_ENABLED=false),暂无可连接的端点。请联系运维人员重新启用。', }, url: { - title: '本环境的 MCP 端点', + title: '本系统的 MCP 端点', body: '任何支持 MCP 的 AI 客户端都用这个 URL 连接。身份是自助的:部署自身就是 OAuth 2.1 授权服务器,交互式客户端只需在浏览器登录——以你自己的身份连接,每次调用都受你的权限和行级安全约束。', downloadSkill: '下载 SKILL.md', - skillHint: '可移植的智能体技能文件:教会任何支持技能的智能体如何使用本环境。', + skillHint: '可移植的智能体技能文件:教会任何支持技能的智能体如何使用本系统。', }, claude: { body: '设置 → 连接器 → 添加自定义连接器,粘贴此 URL,按提示在浏览器登录。', @@ -3466,8 +3466,8 @@ const zh = { rowConversational: 'Build / Ask 模型', rowStructured: '结构化(蓝图 / 种子)', rowReasoning: '推理强度', - readFailed: '无法读取有效 AI 模型。该环境可能未运行 AI 服务,或你没有 ai:read 权限。', - readFailedWithStatus: '无法读取有效 AI 模型(HTTP {{status}})。该环境可能未运行 AI 服务,或你没有 ai:read 权限。', + readFailed: '无法读取有效 AI 模型。本系统可能未运行 AI 服务,或你没有 ai:read 权限。', + readFailedWithStatus: '无法读取有效 AI 模型(HTTP {{status}})。本系统可能未运行 AI 服务,或你没有 ai:read 权限。', overridesInEffect: '生效的 env 覆盖:', noOverrides: '无 —— 跑的是部署代码的默认值。', adapter: '适配器:',