diff --git a/.changeset/i18n-qa-pass-112.md b/.changeset/i18n-qa-pass-112.md new file mode 100644 index 00000000..f36f4d33 --- /dev/null +++ b/.changeset/i18n-qa-pass-112.md @@ -0,0 +1,6 @@ +--- +"@cloudhal/cli": patch +"@cloudhal/astro-renderer": patch +--- + +Corrections to the machine-drafted translations of collections, typed fields, listings, the OAuth consent screen, Connected agents, the setup-link sign-up text and the site status pages (#112), in all 18 non-English languages. The fixes cover changed meaning, security wording that had softened, mixed terms and mixed register. Examples: Indonesian said "not yet verified" for a self-registered agent, Polish dropped "you" from the loopback warning, and Japanese and Korean lost "never" in "never beyond your role". Korean used a formal register in the new screens while the rest of Studio uses its polite-informal one. Nothing else changes, and the languages remain AI drafts awaiting review by people who speak them. diff --git a/apps/studio/src/i18n/de.ts b/apps/studio/src/i18n/de.ts index 0c934829..3c76b4b6 100644 --- a/apps/studio/src/i18n/de.ts +++ b/apps/studio/src/i18n/de.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): de core messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 009322cbc9ddcd5d +// hash: 6137f81aef7c3570 import type { Messages } from "./en.ts"; export const messages: Messages = { @@ -1969,7 +1969,7 @@ export const messages: Messages = { glossary: { title: "Glossar", description: - "Begriffe, die Agenten beim Übersetzen beibehalten: Namen, die nie übersetzt werden, und das freigegebene Wort in jeder Sprache.", + "Begriffe, die Agents beim Übersetzen beibehalten: Namen, die nie übersetzt werden, und das freigegebene Wort in jeder Sprache.", empty: "Noch keine Begriffe", emptyDescription: "Fügen Sie Marken- und Produktnamen sowie Wörter mit fester Übersetzung hinzu.", @@ -1987,7 +1987,7 @@ export const messages: Messages = { title: "Übersetzungen", none: "Nur auf {language}", noneDescription: - "Agenten übersetzen Seiten und Artikel in die anderen Sprachen der Website; jede Fassung erscheint hier.", + "Agents übersetzen Seiten und Artikel in die anderen Sprachen der Website; jede Fassung erscheint hier.", current: "Diese Fassung", method: { original: "Original", diff --git a/apps/studio/src/i18n/fa.ts b/apps/studio/src/i18n/fa.ts index b36437bd..7ee34941 100644 --- a/apps/studio/src/i18n/fa.ts +++ b/apps/studio/src/i18n/fa.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): fa core messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: ec7b9eedf08692c6 +// hash: 33720bb9f0e7fd0a import type { Messages } from "./en.ts"; export const messages: Messages = { @@ -683,7 +683,7 @@ export const messages: Messages = { field_not_localized: "فیلد مشترک را فقط در نسخهٔ اصلی می‌شود تغییر داد.", required_field: "فیلدهای لازم برای انتشار خالی‌اند. آن‌ها را پر کنید یا پیش‌نویس نگه دارید.", too_many_fields: "این تعداد فیلد بیش از حدی است که یک مجموعه یا سایت می‌تواند داشته باشد.", - field_key_reserved: "این کلید فیلد برای خود مطلب رزرو شده است.", + field_key_reserved: "این کلید فیلد برای خود ورودی رزرو شده است.", field_key_duplicate: "دو فیلد از یک کلید استفاده می‌کنند.", field_option_duplicate: "دو گزینهٔ یک فیلد انتخابی مقدار یکسان دارند.", field_bounds: "کمینهٔ یک فیلد عددی از بیشینه‌اش بزرگ‌تر است.", @@ -691,7 +691,7 @@ export const messages: Messages = { "این تغییر روی مقدارهای ذخیره‌شده اثر می‌گذارد. برای تغییر نام، نوع یا حذف، از منوی فیلد استفاده کنید.", operation_in_progress: "تغییر دیگری روی فیلدهای این مجموعه هنوز در جریان است.", field_values_unconvertible: - "برخی مقدارها قابل تبدیل نیستند. اجازهٔ پاک‌کردنشان را بدهید یا اول آن مطالب را تغییر دهید.", + "برخی مقدارها قابل تبدیل نیستند. اجازهٔ پاک‌کردنشان را بدهید یا اول آن ورودی‌ها را تغییر دهید.", field_operation_incomplete: "این تغییر فیلد هنوز تمام نشده یا قبلاً برگردانده شده است.", invalid_query: "این فیلتر یا ترتیب جور نیست: از فیلدهای فهرست مجموعه و شرط‌های آن‌ها استفاده کنید.", diff --git a/apps/studio/src/i18n/fr.ts b/apps/studio/src/i18n/fr.ts index d6d301ef..ddb99b34 100644 --- a/apps/studio/src/i18n/fr.ts +++ b/apps/studio/src/i18n/fr.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): fr core messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 804ad3e05719e4f5 +// hash: 6f0fd7cd3765dd5e import type { Messages } from "./en.ts"; export const messages: Messages = { @@ -705,22 +705,22 @@ export const messages: Messages = { too_large: "Cette modification est trop volumineuse pour une seule opération. Divisez-la.", state_changed: "Ceci a changé entre-temps. Rechargez et réessayez.", invalid_fields: - "Certains champs ne respectent pas leurs règles. Vérifie les champs signalés.", + "Certains champs ne respectent pas leurs règles. Vérifiez les champs signalés.", unknown_field: "Cette collection n’a aucun champ avec cette clé.", field_not_localized: "Un champ partagé ne peut être modifié que sur l’original.", required_field: - "Des champs nécessaires à la publication sont vides. Remplis-les ou garde-le en brouillon.", + "Des champs nécessaires à la publication sont vides. Remplissez-les ou gardez-le en brouillon.", too_many_fields: "C’est plus de champs qu’une collection ou un site ne peut en avoir.", field_key_reserved: "Cette clé de champ est réservée à l’entrée elle-même.", field_key_duplicate: "Deux champs utilisent la même clé.", field_option_duplicate: "Deux options d’un champ de choix ont la même valeur.", field_bounds: "Le minimum d’un champ numérique dépasse son maximum.", field_change_needs_operation: - "Ce changement toucherait des valeurs enregistrées. Utilise le menu du champ pour le renommer, changer son type ou le retirer.", + "Ce changement toucherait des valeurs enregistrées. Utilisez le menu du champ pour le renommer, changer son type ou le retirer.", operation_in_progress: "Un autre changement de champ est encore en cours dans cette collection.", field_values_unconvertible: - "Certaines valeurs ne peuvent pas être converties. Autorise leur effacement ou modifie d’abord ces entrées.", + "Certaines valeurs ne peuvent pas être converties. Autorisez leur effacement ou modifiez d’abord ces entrées.", field_operation_incomplete: "Ce changement de champ n’est pas terminé ou a déjà été annulé.", invalid_query: "Ce filtre ou ce tri ne convient pas : utilisez les champs de liste de la collection et leurs conditions.", diff --git a/apps/studio/src/i18n/he.ts b/apps/studio/src/i18n/he.ts index b876b1a4..4764ac2a 100644 --- a/apps/studio/src/i18n/he.ts +++ b/apps/studio/src/i18n/he.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): he core messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: b942eaf4d59c74c4 +// hash: 66ad78b266ca3c48 import type { Messages } from "./en.ts"; export const messages: Messages = { @@ -1277,12 +1277,12 @@ export const messages: Messages = { }, collections: { description: - "היכן נמצאים הפריטים של כל אוסף באתר. שינוי קידומת מעביר את הכתובת של כל פריט באוסף; הכתובות הישנות ממשיכות לעבוד באמצעות הפניה קבועה. השאירו שדה ריק לברירת המחדל, שם האוסף עצמו. הכתובות החדשות עולות לאוויר בפרסום הבא.", - preview: "הפריטים נמצאים בכתובות כמו {url}", - previewMoved: "הפריטים יהיו בכתובות כמו {url}. הכתובת הישנה {old} מפנה לשם.", + "היכן נמצאות הרשומות של כל אוסף באתר. שינוי קידומת מעביר את הכתובת של כל רשומה באוסף; הכתובות הישנות ממשיכות לעבוד באמצעות הפניה קבועה. השאירו שדה ריק לברירת המחדל, שם האוסף עצמו. הכתובות החדשות עולות לאוויר בפרסום הבא.", + preview: "הרשומות נמצאות בכתובות כמו {url}", + previewMoved: "הרשומות יהיו בכתובות כמו {url}. הכתובת הישנה {old} מפנה לשם.", exampleSlug: "my-article", empty: "אין עדיין אוספים", - emptyDescription: "אוספים יופיעו כאן כשיהיו באתר מאמרים או פריטים אחרים.", + emptyDescription: "אוספים יופיעו כאן כשיהיו באתר מאמרים או רשומות אחרות.", saved: "האוספים נשמרו", failed: "לא ניתן היה לשמור את האוספים", errors: { diff --git a/apps/studio/src/i18n/hi.ts b/apps/studio/src/i18n/hi.ts index 97ddea27..a68c8c4d 100644 --- a/apps/studio/src/i18n/hi.ts +++ b/apps/studio/src/i18n/hi.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): hi core messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: b397c1c1d1b280c9 +// hash: 4b54c6481ccc7a4f import type { Messages } from "./en.ts"; export const messages: Messages = { @@ -104,7 +104,7 @@ export const messages: Messages = { }, articles: { title: "लेख", - description: "पोस्ट और अन्य प्रविष्टियाँ, जो लोगों या एजेंटों ने लिखीं और साइट के साथ प्रकाशित होती हैं।", + description: "पोस्ट और अन्य एंट्री, जो लोगों या एजेंटों ने लिखीं और साइट के साथ प्रकाशित होती हैं।", }, snapshots: { title: "स्नैपशॉट", @@ -302,10 +302,10 @@ export const messages: Messages = { }, }, collectionList: { - description: "“{key}” संग्रह की प्रविष्टियाँ।", - newEntry: "नई प्रविष्टि", - search: "प्रविष्टियाँ खोजें", - empty: "अभी कोई प्रविष्टि नहीं", + description: "“{key}” संग्रह की एंट्री।", + newEntry: "नई एंट्री", + search: "एंट्री खोजें", + empty: "अभी कोई एंट्री नहीं", settings: "सेटिंग्स", }, articleCorrections: { @@ -668,17 +668,17 @@ export const messages: Messages = { too_large: "यह बदलाव एक ऑपरेशन के लिए बहुत बड़ा है। इसे बाँटें।", state_changed: "इस बीच यह बदल गया। फिर से लोड करें और दोबारा कोशिश करें।", invalid_fields: "कुछ फ़ील्ड अपने नियमों पर खरे नहीं उतरते। चिह्नित फ़ील्ड जाँचें।", - unknown_field: "इस कलेक्शन में इस कुंजी वाला कोई फ़ील्ड नहीं है।", + unknown_field: "इस संग्रह में इस कुंजी वाला कोई फ़ील्ड नहीं है।", field_not_localized: "साझा फ़ील्ड केवल मूल में बदला जा सकता है।", required_field: "प्रकाशित करने के लिए ज़रूरी फ़ील्ड खाली हैं। उन्हें भरें या ड्राफ़्ट ही रहने दें।", - too_many_fields: "यह किसी कलेक्शन या साइट की सीमा से ज़्यादा फ़ील्ड हैं।", + too_many_fields: "यह किसी संग्रह या साइट की सीमा से ज़्यादा फ़ील्ड हैं।", field_key_reserved: "यह फ़ील्ड कुंजी एंट्री के लिए आरक्षित है।", field_key_duplicate: "दो फ़ील्ड एक ही कुंजी इस्तेमाल करते हैं।", field_option_duplicate: "किसी विकल्प फ़ील्ड के दो विकल्पों का मान एक जैसा है।", field_bounds: "किसी संख्या फ़ील्ड का न्यूनतम उसके अधिकतम से ज़्यादा है।", field_change_needs_operation: "यह बदलाव सहेजे गए मानों पर असर डालेगा। नाम, प्रकार बदलने या हटाने के लिए फ़ील्ड का मेन्यू इस्तेमाल करें।", - operation_in_progress: "इस कलेक्शन में एक और फ़ील्ड बदलाव अभी चल रहा है।", + operation_in_progress: "इस संग्रह में एक और फ़ील्ड बदलाव अभी चल रहा है।", field_values_unconvertible: "कुछ मान बदले नहीं जा सकते। उन्हें मिटाने की अनुमति दें या पहले उन एंट्री को बदलें।", field_operation_incomplete: "वह फ़ील्ड बदलाव अभी पूरा नहीं हुआ है, या पहले ही वापस लिया जा चुका है।", @@ -1274,12 +1274,12 @@ export const messages: Messages = { }, collections: { description: - "साइट पर हर संग्रह की प्रविष्टियाँ कहाँ रहती हैं। उपसर्ग बदलने से उस संग्रह की हर प्रविष्टि का पता बदल जाता है; पुराने पते स्थायी रीडायरेक्ट के ज़रिए काम करते रहते हैं। डिफ़ॉल्ट, यानी संग्रह के अपने नाम के लिए फ़ील्ड खाली छोड़ें। नए पते अगले प्रकाशन के साथ लाइव होते हैं।", - preview: "प्रविष्टियाँ {url} जैसे पतों पर हैं", - previewMoved: "प्रविष्टियाँ {url} जैसे पतों पर होंगी। पुराना पता {old} वहाँ रीडायरेक्ट करता है।", + "साइट पर हर संग्रह की एंट्री कहाँ रहती हैं। उपसर्ग बदलने से उस संग्रह की हर एंट्री का पता बदल जाता है; पुराने पते स्थायी रीडायरेक्ट के ज़रिए काम करते रहते हैं। डिफ़ॉल्ट, यानी संग्रह के अपने नाम के लिए फ़ील्ड खाली छोड़ें। नए पते अगले प्रकाशन के साथ लाइव होते हैं।", + preview: "एंट्री {url} जैसे पतों पर हैं", + previewMoved: "एंट्री {url} जैसे पतों पर होंगी। पुराना पता {old} वहाँ रीडायरेक्ट करता है।", exampleSlug: "my-article", empty: "अभी कोई संग्रह नहीं", - emptyDescription: "साइट पर लेख या अन्य प्रविष्टियाँ होने पर संग्रह यहाँ दिखते हैं।", + emptyDescription: "साइट पर लेख या अन्य एंट्री होने पर संग्रह यहाँ दिखते हैं।", saved: "संग्रह सहेजे गए", failed: "संग्रह सहेजे नहीं जा सके", errors: { @@ -1697,9 +1697,9 @@ export const messages: Messages = { get_entry: "लेख प्राप्त करें", create_entry: "लेख बनाएँ", update_entry: "लेख अपडेट करें", - list_collections: "कलेक्शन की सूची", - create_collection: "कलेक्शन बनाएँ", - update_collection: "कलेक्शन बदलें", + list_collections: "संग्रहों की सूची", + create_collection: "संग्रह बनाएँ", + update_collection: "संग्रह बदलें", rename_field: "फ़ील्ड का नाम बदलें", change_field_type: "फ़ील्ड का प्रकार बदलें", set_field_localized: "फ़ील्ड की भाषाएँ बदलें", diff --git a/apps/studio/src/i18n/ko.ts b/apps/studio/src/i18n/ko.ts index 0981ec7c..7c1358ab 100644 --- a/apps/studio/src/i18n/ko.ts +++ b/apps/studio/src/i18n/ko.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): ko core messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 207e3531378284cc +// hash: 018c86583b4fae9d import type { Messages } from "./en.ts"; export const messages: Messages = { @@ -302,10 +302,10 @@ export const messages: Messages = { }, }, collectionList: { - description: "“{key}” 컬렉션의 항목입니다.", + description: "“{key}” 컬렉션의 항목이에요.", newEntry: "새 항목", search: "항목 검색", - empty: "아직 항목이 없습니다", + empty: "아직 항목이 없어요", settings: "설정", }, articleCorrections: { @@ -670,21 +670,21 @@ export const messages: Messages = { quota_exceeded: "저장 공간 할당량이 가득 찼어요.", too_large: "이 변경은 한 번에 처리하기에 너무 커요. 나눠서 하세요.", state_changed: "그사이 변경됐어요. 새로고침하고 다시 시도하세요.", - invalid_fields: "규칙에 맞지 않는 필드가 있습니다. 표시된 필드를 확인하세요.", - unknown_field: "이 컬렉션에는 그 키의 필드가 없습니다.", - field_not_localized: "공유 필드는 원본에서만 바꿀 수 있습니다.", - required_field: "게시에 필요한 필드가 비어 있습니다. 채우거나 초안으로 두세요.", - too_many_fields: "컬렉션이나 사이트가 가질 수 있는 필드 수를 넘었습니다.", - field_key_reserved: "이 필드 키는 항목 자체에 예약되어 있습니다.", - field_key_duplicate: "두 필드가 같은 키를 사용합니다.", - field_option_duplicate: "선택 필드의 두 옵션 값이 같습니다.", - field_bounds: "숫자 필드의 최솟값이 최댓값보다 큽니다.", + invalid_fields: "규칙에 맞지 않는 필드가 있어요. 표시된 필드를 확인하세요.", + unknown_field: "이 컬렉션에는 그 키의 필드가 없어요.", + field_not_localized: "공유 필드는 원본에서만 바꿀 수 있어요.", + required_field: "게시에 필요한 필드가 비어 있어요. 채우거나 초안으로 두세요.", + too_many_fields: "컬렉션이나 사이트가 가질 수 있는 필드 수를 넘었어요.", + field_key_reserved: "이 필드 키는 항목 자체에 예약되어 있어요.", + field_key_duplicate: "두 필드가 같은 키를 사용해요.", + field_option_duplicate: "선택 필드의 두 옵션 값이 같아요.", + field_bounds: "숫자 필드의 최솟값이 최댓값보다 커요.", field_change_needs_operation: - "이 변경은 저장된 값에 영향을 줍니다. 필드 메뉴에서 이름 변경, 유형 변경, 삭제를 하세요.", - operation_in_progress: "이 컬렉션에서 다른 필드 변경이 아직 진행 중입니다.", + "이 변경은 저장된 값에 영향을 줘요. 필드 메뉴에서 이름 변경, 유형 변경, 삭제를 하세요.", + operation_in_progress: "이 컬렉션에서 다른 필드 변경이 아직 진행 중이에요.", field_values_unconvertible: - "변환할 수 없는 값이 있습니다. 지우기를 허용하거나 먼저 해당 항목을 바꾸세요.", - field_operation_incomplete: "그 필드 변경은 아직 끝나지 않았거나 이미 되돌려졌습니다.", + "변환할 수 없는 값이 있어요. 지우기를 허용하거나 먼저 해당 항목을 바꾸세요.", + field_operation_incomplete: "그 필드 변경은 아직 끝나지 않았거나 이미 되돌려졌어요.", invalid_query: "이 필터나 정렬은 맞지 않아요. 컬렉션의 목록 필드와 그 조건을 사용하세요.", structured_data_invalid: "구조화된 데이터 설정이 이 컬렉션의 필드와 맞지 않아요. 표시된 속성을 확인하세요.", @@ -1240,7 +1240,7 @@ export const messages: Messages = { agentKeys: "에이전트와 CI 작업은 내가 만든 키로 로그인해요.", mcp: "에이전트는 /mcp로 연결해요.", mcpOauth: - "이 Studio에 등록된 MCP 클라이언트는 /mcp에서 OAuth로 로그인하며, 연결마다 내가 승인합니다.", + "이 Studio에 등록된 MCP 클라이언트는 /mcp에서 OAuth로 로그인하며, 연결마다 내가 승인해요.", activity: "모든 도구 호출이 사이트별로 기록돼요.", previewLinks: "배포된 사이트에서 초안을 보여 주는 서명된 링크예요.", deployTransfer: "cloudhal push와 pull로 이 서버에 접근할 수 있어요.", diff --git a/apps/studio/src/i18n/lazy/collections.ar.ts b/apps/studio/src/i18n/lazy/collections.ar.ts index efef922c..5a5bbfd1 100644 --- a/apps/studio/src/i18n/lazy/collections.ar.ts +++ b/apps/studio/src/i18n/lazy/collections.ar.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): ar `collections.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: f6caa72a5639c2fc +// hash: b243fbd1d3dc404f import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"collections"> = { @@ -88,13 +88,13 @@ export const messages: NamespaceMessages<"collections"> = { noTaxonomies: "لا توجد تصنيفات في هذا الموقع.", comments: "التعليقات", commentsDescription: - "هل يمكن للقرّاء التعليق على عناصر هذه المجموعة، ومتى تُغلق السلاسل. تُحفظ مع إعدادات التعليقات في الموقع.", + "هل يمكن للقرّاء التعليق على إدخالات هذه المجموعة، ومتى تُغلق السلاسل. تُحفظ مع إعدادات التعليقات في الموقع.", commentsEnabled: "قبول التعليقات", commentsEnabledHint: - "يمكن للقرّاء التعليق على العناصر المنشورة. ويظل بإمكان كل عنصر فتح سلسلته أو إغلاقها أو إخفاؤها.", + "يمكن للقرّاء التعليق على الإدخالات المنشورة. ويظل بإمكان كل إدخال فتح سلسلته أو إغلاقها أو إخفاؤها.", commentsCloseAfter: "إغلاق السلاسل بعد", commentsCloseAfterHint: - "تُحسب من تاريخ نشر كل عنصر. «مثل الموقع» يتبع إعدادات الموقع › التعليقات.", + "تُحسب من تاريخ نشر كل إدخال. «مثل الموقع» يتبع إعدادات الموقع › التعليقات.", commentsSiteOff: "التعليقات متوقفة في الموقع كله", commentsSiteOffDescription: "لن يرى القرّاء نموذج التعليق حتى يُفعَّل «قبول التعليقات» في إعدادات الموقع › التعليقات.", diff --git a/apps/studio/src/i18n/lazy/collections.fa.ts b/apps/studio/src/i18n/lazy/collections.fa.ts index 2bbadc86..279fda8d 100644 --- a/apps/studio/src/i18n/lazy/collections.fa.ts +++ b/apps/studio/src/i18n/lazy/collections.fa.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): fa `collections.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: c297ef3a540c098e +// hash: b024e91a1b1b0ab3 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"collections"> = { @@ -89,13 +89,13 @@ export const messages: NamespaceMessages<"collections"> = { noTaxonomies: "این سایت طبقه‌بندی ندارد.", comments: "دیدگاه‌ها", commentsDescription: - "اینکه خوانندگان بتوانند برای مطالب این مجموعه دیدگاه بگذارند و گفتگوها کی بسته شوند. همراه تنظیمات دیدگاه سایت ذخیره می‌شود.", + "اینکه خوانندگان بتوانند برای ورودی‌های این مجموعه دیدگاه بگذارند و گفتگوها کی بسته شوند. همراه تنظیمات دیدگاه سایت ذخیره می‌شود.", commentsEnabled: "پذیرش دیدگاه", commentsEnabledHint: - "خوانندگان می‌توانند برای مطالب منتشرشده دیدگاه بگذارند. هر مطلب همچنان می‌تواند گفتگوی خودش را باز، بسته یا پنهان کند.", + "خوانندگان می‌توانند برای ورودی‌های منتشرشده دیدگاه بگذارند. هر ورودی همچنان می‌تواند گفتگوی خودش را باز، بسته یا پنهان کند.", commentsCloseAfter: "بستن گفتگوها پس از", commentsCloseAfterHint: - "از تاریخ انتشار هر مطلب حساب می‌شود. «مانند سایت» از تنظیمات سایت › دیدگاه‌ها پیروی می‌کند.", + "از تاریخ انتشار هر ورودی حساب می‌شود. «مانند سایت» از تنظیمات سایت › دیدگاه‌ها پیروی می‌کند.", commentsSiteOff: "دیدگاه‌ها برای کل سایت خاموش است", commentsSiteOffDescription: "خوانندگان تا وقتی «پذیرش دیدگاه» در تنظیمات سایت › دیدگاه‌ها روشن نشود فرم دیدگاه را نمی‌بینند.", diff --git a/apps/studio/src/i18n/lazy/collections.he.ts b/apps/studio/src/i18n/lazy/collections.he.ts index e25c93ab..2070b208 100644 --- a/apps/studio/src/i18n/lazy/collections.he.ts +++ b/apps/studio/src/i18n/lazy/collections.he.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): he `collections.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 7a433af1346a457b +// hash: 7e1d5c318c8227a0 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"collections"> = { @@ -87,13 +87,13 @@ export const messages: NamespaceMessages<"collections"> = { noTaxonomies: "לאתר הזה אין טקסונומיות.", comments: "תגובות", commentsDescription: - "האם קוראים יכולים להגיב לפריטים באוסף הזה, ומתי שרשורים נסגרים. נשמר עם הגדרות התגובות של האתר.", + "האם קוראים יכולים להגיב לרשומות באוסף הזה, ומתי שרשורים נסגרים. נשמר עם הגדרות התגובות של האתר.", commentsEnabled: "קבלת תגובות", commentsEnabledHint: - "קוראים יכולים להגיב לפריטים שפורסמו. כל פריט עדיין יכול לפתוח, לסגור או להסתיר את השרשור שלו.", + "קוראים יכולים להגיב לרשומות שפורסמו. כל רשומה עדיין יכולה לפתוח, לסגור או להסתיר את השרשור שלה.", commentsCloseAfter: "סגירת שרשורים אחרי", commentsCloseAfterHint: - "נספר מתאריך הפרסום של כל פריט. „כמו באתר” פועל לפי הגדרות האתר › תגובות.", + "נספר מתאריך הפרסום של כל רשומה. „כמו באתר” פועל לפי הגדרות האתר › תגובות.", commentsSiteOff: "התגובות כבויות בכל האתר", commentsSiteOffDescription: "קוראים לא יראו טופס תגובה עד ש„קבלת תגובות” תופעל בהגדרות האתר › תגובות.", diff --git a/apps/studio/src/i18n/lazy/collections.hi.ts b/apps/studio/src/i18n/lazy/collections.hi.ts index 485eb07b..eb49741d 100644 --- a/apps/studio/src/i18n/lazy/collections.hi.ts +++ b/apps/studio/src/i18n/lazy/collections.hi.ts @@ -1,35 +1,35 @@ // Generated by `pnpm i18n:import` (ADR-0034): hi `collections.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 1baac5d4a8f596c8 +// hash: b8eaf30aa3d7d567 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"collections"> = { collections: { title: "संग्रह", description: - "साइट में रखी जाने वाली सामग्री के प्रकार: लेख, इवेंट, टीम, जॉब, या अपनी प्रविष्टियों वाली कोई भी चीज़। हर संग्रह की अपनी सूची, अपना पता और अपनी सेटिंग्स होती हैं।", + "साइट में रखी जाने वाली सामग्री के प्रकार: लेख, इवेंट, टीम, जॉब, या अपनी एंट्री वाली कोई भी चीज़। हर संग्रह की अपनी सूची, अपना पता और अपनी सेटिंग्स होती हैं।", newCollection: "नया संग्रह", search: "संग्रह खोजें", columns: { name: "नाम", address: "पता", - entries: "प्रविष्टियाँ", + entries: "एंट्री", state: "स्थिति", }, - entries: "{count, plural, one {# प्रविष्टि} other {# प्रविष्टियाँ}}", + entries: "{count, plural, one {# एंट्री} other {# एंट्री}}", declared: "नाम दिया गया", inferred: "अभी नाम नहीं दिया गया", inferredHint: - "प्रविष्टियाँ मौजूद हैं, लेकिन इस संग्रह को अभी तक नाम नहीं दिया गया है। नाम देने के लिए इसकी सेटिंग्स खोलें।", + "एंट्री मौजूद हैं, लेकिन इस संग्रह को अभी तक नाम नहीं दिया गया है। नाम देने के लिए इसकी सेटिंग्स खोलें।", empty: "अभी कोई संग्रह नहीं", emptyDescription: "इवेंट, टीम के सदस्यों, जॉब या किसी और चीज़ के लिए एक बनाएँ।", create: { title: "नया संग्रह", description: - "सामग्री का एक नया प्रकार, जिसकी अपनी सूची साइडबार में दिखती है। संग्रह बनने के बाद एजेंट उसमें प्रविष्टियाँ लिख सकते हैं।", + "सामग्री का एक नया प्रकार, जिसकी अपनी सूची साइडबार में दिखती है। संग्रह बनने के बाद एजेंट उसमें एंट्री लिख सकते हैं।", plural: "नाम", pluralHint: "बहुवचन, जैसा साइडबार में दिखता है, जैसे इवेंट।", - singular: "एक प्रविष्टि को कहा जाता है", + singular: "एक एंट्री को कहा जाता है", singularHint: "एकवचन, जैसे इवेंट।", key: "कुंजी", keyHint: @@ -38,11 +38,11 @@ export const messages: NamespaceMessages<"collections"> = { required: "आवश्यक", icon: "आइकन", address: "पता", - addressHint: "प्रविष्टियाँ इस उपसर्ग और उसके बाद अपने स्लग पर रहती हैं।", + addressHint: "एंट्री इस उपसर्ग और उसके बाद अपने स्लग पर रहती हैं।", submit: "संग्रह बनाएँ", failed: "संग्रह नहीं बनाया गया", created: "संग्रह बन गया", - createdDescription: "{name} साइडबार में है। उसकी पहली प्रविष्टि जोड़ें।", + createdDescription: "{name} साइडबार में है। उसकी पहली एंट्री जोड़ें।", }, icons: { article: "लेख", @@ -60,8 +60,7 @@ export const messages: NamespaceMessages<"collections"> = { }, settings: { title: "{name} की सेटिंग्स", - description: - "इस संग्रह का नाम कैसे रखा जाता है, उसकी प्रविष्टियाँ कहाँ रहती हैं और उन्हें कौन सूचीबद्ध करता है।", + description: "इस संग्रह का नाम कैसे रखा जाता है, उसकी एंट्री कहाँ रहती हैं और वे कहाँ सूचीबद्ध होती हैं।", names: "नाम", namesDescription: "साइट की हर भाषा में। Studio, एजेंट और थीम कुंजी की जगह ये दिखाते हैं।", descriptionField: "विवरण", @@ -69,11 +68,11 @@ export const messages: NamespaceMessages<"collections"> = { appearance: "आइकन", appearanceDescription: "साइडबार में संग्रह का आइकन।", listing: "सूची", - listingDescription: "संग्रह की प्रविष्टियाँ सार्वजनिक साइट पर कहाँ दिखती हैं।", + listingDescription: "संग्रह की एंट्री सार्वजनिक साइट पर कहाँ दिखती हैं।", feed: "RSS फ़ीड में शामिल करें", - feedHint: "साइट की फ़ीड में, यह चालू रखने वाले हर संग्रह की सबसे नई प्रविष्टियाँ आती हैं।", + feedHint: "साइट की फ़ीड में, यह चालू रखने वाले हर संग्रह की सबसे नई एंट्री आती हैं।", sitemap: "साइटमैप में शामिल करें", - sitemapHint: "खोज इंजन प्रकाशित प्रविष्टियाँ sitemap.xml से खोजते हैं।", + sitemapHint: "खोज इंजन प्रकाशित एंट्री sitemap.xml से खोजते हैं।", sort: "डिफ़ॉल्ट क्रम", sortHint: "जिन Studio सूची और थीम सूचियों में कोई क्रम नहीं बताया गया, वे इसका उपयोग करती हैं।", sorts: { @@ -83,25 +82,25 @@ export const messages: NamespaceMessages<"collections"> = { }, taxonomies: "श्रेणियाँ और टैग", taxonomiesDescription: - "इस संग्रह की प्रविष्टियाँ कौन-से वर्गीकरण उपयोग करती हैं। जिस वर्गीकरण में संग्रहों की सूची नहीं है, वह सभी पर लागू होता है।", + "इस संग्रह की एंट्री कौन-से वर्गीकरण उपयोग करती हैं। जिस वर्गीकरण में संग्रहों की सूची नहीं है, वह सभी पर लागू होता है।", taxonomyAll: "{label} (हर संग्रह)", noTaxonomies: "इस साइट में कोई वर्गीकरण नहीं है।", comments: "टिप्पणियाँ", commentsDescription: - "क्या पाठक इस संग्रह की प्रविष्टियों पर टिप्पणी कर सकते हैं, और थ्रेड कब बंद होते हैं। साइट की टिप्पणी सेटिंग्स के साथ सहेजा जाता है।", + "क्या पाठक इस संग्रह की एंट्री पर टिप्पणी कर सकते हैं, और थ्रेड कब बंद होते हैं। साइट की टिप्पणी सेटिंग्स के साथ सहेजा जाता है।", commentsEnabled: "टिप्पणियाँ स्वीकार करें", commentsEnabledHint: - "पाठक प्रकाशित प्रविष्टियों पर टिप्पणी कर सकते हैं। हर प्रविष्टि अब भी अपना थ्रेड खोल, बंद या छिपा सकती है।", + "पाठक प्रकाशित एंट्री पर टिप्पणी कर सकते हैं। हर एंट्री अब भी अपना थ्रेड खोल, बंद या छिपा सकती है।", commentsCloseAfter: "इतने समय बाद थ्रेड बंद करें", commentsCloseAfterHint: - "हर प्रविष्टि की प्रकाशन तिथि से गिना जाता है। “साइट के समान” साइट सेटिंग्स › टिप्पणियाँ का पालन करता है।", + "हर एंट्री की प्रकाशन तिथि से गिना जाता है। “साइट के समान” साइट सेटिंग्स › टिप्पणियाँ का पालन करता है।", commentsSiteOff: "पूरी साइट के लिए टिप्पणियाँ बंद हैं", commentsSiteOffDescription: "जब तक साइट सेटिंग्स › टिप्पणियाँ में “टिप्पणियाँ स्वीकार करें” चालू नहीं होता, पाठकों को टिप्पणी फ़ॉर्म नहीं दिखता।", commentsLink: "सभी टिप्पणी सेटिंग्स", address: "पता", addressDescription: - "प्रविष्टियाँ कहाँ रहती हैं। इसे बदलने से उनके सार्वजनिक URL बदल जाते हैं: पुराने पते स्थायी रीडायरेक्ट से उत्तर देते हैं।", + "एंट्री कहाँ रहती हैं। इसे बदलने से उनके सार्वजनिक URL बदल जाते हैं: पुराने पते स्थायी रीडायरेक्ट से उत्तर देते हैं।", addressLink: "इसे साइट सेटिंग्स › संग्रह में बदलें।", save: "सहेजें", saved: "संग्रह सहेजा गया", diff --git a/apps/studio/src/i18n/lazy/collections.id.ts b/apps/studio/src/i18n/lazy/collections.id.ts index 158e4b5e..7169245f 100644 --- a/apps/studio/src/i18n/lazy/collections.id.ts +++ b/apps/studio/src/i18n/lazy/collections.id.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): id `collections.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 1d240101d263579f +// hash: fd203bea368c7f18 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"collections"> = { @@ -61,7 +61,7 @@ export const messages: NamespaceMessages<"collections"> = { settings: { title: "Pengaturan {name}", description: - "Bagaimana koleksi ini dinamai, di mana entrinya berada, dan apa yang mendaftarkannya.", + "Bagaimana koleksi ini dinamai, di mana entrinya berada, dan apa yang mencantumkannya.", names: "Nama", namesDescription: "Dalam setiap bahasa situs. Studio, agen, dan tema menampilkan nama ini, bukan kuncinya.", @@ -69,7 +69,7 @@ export const messages: NamespaceMessages<"collections"> = { descriptionHint: "Opsional. Tampil di bawah judul daftar koleksi.", appearance: "Ikon", appearanceDescription: "Ikon koleksi di bilah sisi.", - listing: "Pendaftaran", + listing: "Pencantuman", listingDescription: "Di mana entri koleksi muncul di situs publik.", feed: "Sertakan di feed RSS", feedHint: "Feed situs mencantumkan entri terbaru dari setiap koleksi yang mengaktifkan ini.", diff --git a/apps/studio/src/i18n/lazy/collections.ko.ts b/apps/studio/src/i18n/lazy/collections.ko.ts index c77efad1..84f8e4a1 100644 --- a/apps/studio/src/i18n/lazy/collections.ko.ts +++ b/apps/studio/src/i18n/lazy/collections.ko.ts @@ -1,13 +1,13 @@ // Generated by `pnpm i18n:import` (ADR-0034): ko `collections.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: b5cba6679ee75964 +// hash: 40fe15535c170126 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"collections"> = { collections: { title: "컬렉션", description: - "이 사이트가 보관하는 콘텐츠의 종류입니다. 글, 이벤트, 팀, 채용 등 자체 항목이 있는 무엇이든 둘 수 있습니다. 컬렉션마다 고유한 목록, 주소, 설정이 있습니다.", + "이 사이트가 보관하는 콘텐츠의 종류예요. 글, 이벤트, 팀, 채용 등 자체 항목이 있는 무엇이든 둘 수 있어요. 컬렉션마다 고유한 목록, 주소, 설정이 있어요.", newCollection: "새 컬렉션", search: "컬렉션 검색", columns: { @@ -20,28 +20,28 @@ export const messages: NamespaceMessages<"collections"> = { declared: "이름 있음", inferred: "이름 없음", inferredHint: - "항목은 있지만 아직 이 컬렉션에 이름이 지정되지 않았습니다. 설정을 열어 이름을 지정하세요.", - empty: "아직 컬렉션이 없습니다", + "항목은 있지만 아직 이 컬렉션에 이름이 지정되지 않았어요. 설정을 열어 이름을 지정하세요.", + empty: "아직 컬렉션이 없어요", emptyDescription: "이벤트, 팀원, 채용 등을 위한 컬렉션을 만드세요.", create: { title: "새 컬렉션", description: - "사이드바에 자체 목록이 생기는 새로운 콘텐츠 종류입니다. 만들고 나면 에이전트가 항목을 작성할 수 있습니다.", + "사이드바에 자체 목록이 생기는 새로운 콘텐츠 종류예요. 만들고 나면 에이전트가 항목을 작성할 수 있어요.", plural: "이름", - pluralHint: "복수형으로, 사이드바에 표시되는 이름입니다. 예: 이벤트.", + pluralHint: "복수형으로, 사이드바에 표시되는 이름이에요. 예: 이벤트.", singular: "항목 하나의 이름", - singularHint: "단수형입니다. 예: 이벤트.", + singularHint: "단수형이에요. 예: 이벤트.", key: "키", - keyHint: "소문자, 숫자, 하이픈. 테마, 필터, 에이전트가 사용하며 나중에 변경할 수 없습니다.", + keyHint: "소문자, 숫자, 하이픈. 테마, 필터, 에이전트가 사용하며 나중에 변경할 수 없어요.", keyInvalid: "소문자, 숫자, 하이픈을 사용하세요.", required: "필수", icon: "아이콘", address: "주소", - addressHint: "항목은 이 접두사 뒤에 슬러그가 붙은 위치에 있습니다.", + addressHint: "항목은 이 접두사 뒤에 슬러그가 붙은 위치에 있어요.", submit: "컬렉션 만들기", - failed: "컬렉션을 만들지 못했습니다", - created: "컬렉션을 만들었습니다", - createdDescription: "{name}이(가) 사이드바에 추가되었습니다. 첫 항목을 추가하세요.", + failed: "컬렉션을 만들지 못했어요", + created: "컬렉션을 만들었어요", + createdDescription: "{name}이(가) 사이드바에 추가되었어요. 첫 항목을 추가하세요.", }, icons: { article: "글", @@ -59,22 +59,22 @@ export const messages: NamespaceMessages<"collections"> = { }, settings: { title: "{name} 설정", - description: "이 컬렉션의 이름, 항목이 위치할 곳, 항목을 나열하는 방식을 설정합니다.", + description: "이 컬렉션의 이름, 항목이 위치할 곳, 항목을 나열하는 방식을 설정해요.", names: "이름", namesDescription: - "사이트의 모든 언어로 입력합니다. Studio, 에이전트, 테마는 키 대신 이 이름을 표시합니다.", + "사이트의 모든 언어로 입력해요. Studio, 에이전트, 테마는 키 대신 이 이름을 표시해요.", descriptionField: "설명", - descriptionHint: "선택 사항입니다. 컬렉션 목록의 제목 아래에 표시됩니다.", + descriptionHint: "선택 사항이에요. 컬렉션 목록의 제목 아래에 표시돼요.", appearance: "아이콘", - appearanceDescription: "사이드바에 표시되는 컬렉션 아이콘입니다.", + appearanceDescription: "사이드바에 표시되는 컬렉션 아이콘이에요.", listing: "목록", - listingDescription: "컬렉션의 항목이 공개 사이트의 어디에 나타날지 설정합니다.", + listingDescription: "컬렉션의 항목이 공개 사이트의 어디에 나타날지 설정해요.", feed: "RSS 피드에 포함", - feedHint: "이 옵션을 켠 모든 컬렉션의 최신 항목이 사이트 피드에 나열됩니다.", + feedHint: "이 옵션을 켠 모든 컬렉션의 최신 항목이 사이트 피드에 나열돼요.", sitemap: "사이트맵에 포함", - sitemapHint: "검색 엔진은 sitemap.xml을 통해 게시된 항목을 찾습니다.", + sitemapHint: "검색 엔진은 sitemap.xml을 통해 게시된 항목을 찾아요.", sort: "기본 정렬", - sortHint: "정렬 기준을 지정하지 않은 Studio 목록과 테마 목록에서 사용합니다.", + sortHint: "정렬 기준을 지정하지 않은 Studio 목록과 테마 목록에서 사용해요.", sorts: { newest: "최신순", oldest: "오래된 순", @@ -82,9 +82,9 @@ export const messages: NamespaceMessages<"collections"> = { }, taxonomies: "카테고리와 태그", taxonomiesDescription: - "이 컬렉션의 항목이 사용하는 분류입니다. 컬렉션 목록이 없는 분류는 모든 컬렉션에 적용됩니다.", + "이 컬렉션의 항목이 사용하는 분류예요. 컬렉션 목록이 없는 분류는 모든 컬렉션에 적용돼요.", taxonomyAll: "{label} (모든 컬렉션)", - noTaxonomies: "이 사이트에는 분류가 없습니다.", + noTaxonomies: "이 사이트에는 분류가 없어요.", comments: "댓글", commentsDescription: "독자가 이 컬렉션의 항목에 댓글을 달 수 있는지, 스레드를 언제 닫을지 정해요. 사이트의 댓글 설정과 함께 저장돼요.", @@ -100,10 +100,10 @@ export const messages: NamespaceMessages<"collections"> = { commentsLink: "모든 댓글 설정", address: "주소", addressDescription: - "항목이 위치하는 곳입니다. 변경하면 공개 URL이 이동하며, 이전 주소는 영구 리디렉션으로 응답합니다.", + "항목이 위치하는 곳이에요. 변경하면 공개 URL이 이동하며, 이전 주소는 영구 리디렉션으로 응답해요.", addressLink: "사이트 설정 › 컬렉션에서 변경하세요.", save: "저장", - saved: "컬렉션을 저장했습니다", + saved: "컬렉션을 저장했어요", key: "키: {key}", }, }, diff --git a/apps/studio/src/i18n/lazy/collections.ru.ts b/apps/studio/src/i18n/lazy/collections.ru.ts index 3578ba8b..24b1925a 100644 --- a/apps/studio/src/i18n/lazy/collections.ru.ts +++ b/apps/studio/src/i18n/lazy/collections.ru.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): ru `collections.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 9f5777ca5596d211 +// hash: 4539e16a7238e333 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"collections"> = { @@ -72,7 +72,7 @@ export const messages: NamespaceMessages<"collections"> = { feed: "Включать в RSS-ленты", feedHint: "В лентах сайта выводятся новейшие записи каждой коллекции, у которой это включено.", - sitemap: "Включать в sitemap", + sitemap: "Включать в карту сайта", sitemapHint: "Поисковые системы находят опубликованные записи через sitemap.xml.", sort: "Порядок по умолчанию", sortHint: "Его используют список в Studio и списки тем, в которых порядок не задан.", diff --git a/apps/studio/src/i18n/lazy/collections.uk.ts b/apps/studio/src/i18n/lazy/collections.uk.ts index 8e007433..7a2442f3 100644 --- a/apps/studio/src/i18n/lazy/collections.uk.ts +++ b/apps/studio/src/i18n/lazy/collections.uk.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): uk `collections.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 33476137f27a9b49 +// hash: e92d0f2b0b4d9684 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"collections"> = { @@ -72,7 +72,7 @@ export const messages: NamespaceMessages<"collections"> = { feed: "Додавати до RSS-стрічок", feedHint: "У стрічках сайту виводяться найновіші записи кожної колекції, в якої це ввімкнено.", - sitemap: "Додавати до sitemap", + sitemap: "Додавати до мапи сайту", sitemapHint: "Пошукові системи знаходять опубліковані записи через sitemap.xml.", sort: "Порядок за замовчуванням", sortHint: "Його використовують список у Studio та списки тем, у яких порядок не задано.", diff --git a/apps/studio/src/i18n/lazy/connectedAgents.fa.ts b/apps/studio/src/i18n/lazy/connectedAgents.fa.ts index 9c2a778e..ad730a4b 100644 --- a/apps/studio/src/i18n/lazy/connectedAgents.fa.ts +++ b/apps/studio/src/i18n/lazy/connectedAgents.fa.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): fa `connectedAgents.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 8652b676cf654436 +// hash: 3d4c4f962616cb97 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"connectedAgents"> = { @@ -34,7 +34,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { allEmpty: "هنوز کسی عاملی را با URL متصل نکرده است", setup: { description: - "نشانی MCP این Studio را به یک برنامه بده و وقتی درخواست کرد تأییدش کن، یا برای اسکریپت‌ها و کلاینت‌هایی که نمی‌توانند وارد شوند یک کلید agent بساز.", + "MCP URL این Studio را به یک برنامه بدهید و وقتی درخواست کرد تأییدش کنید، یا برای اسکریپت‌ها و کلاینت‌هایی که نمی‌توانند وارد شوند یک کلید عامل بسازید.", tabs: { key: "با کلید عامل", url: "اتصال با URL", @@ -59,7 +59,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { codex: "Codex: هر دو خط را اجرا کنید؛ خط دوم برای تأیید، Studio را باز می‌کند. ChatGPT: در تنظیماتش یک کانکتور با این URL اضافه کنید.", cursor: - "آن را در ~/.cursor/mcp.json یا در یک پروژه در .cursor/mcp.json ذخیره کن، سپس وقتی Cursor خواست وارد شو. Studio برای تأیید باز می‌شود.", + "آن را در ~/.cursor/mcp.json یا در یک پروژه در .cursor/mcp.json ذخیره کنید، سپس وقتی Cursor خواست وارد شوید. Studio برای تأیید باز می‌شود.", vscode: "آن را در پروژه‌تان به‌صورت .vscode/mcp.json ذخیره کنید، سپس سرور را راه بیندازید. VS Code از شما می‌خواهد وارد شوید و Studio را باز می‌کند.", inspector: diff --git a/apps/studio/src/i18n/lazy/connectedAgents.fr.ts b/apps/studio/src/i18n/lazy/connectedAgents.fr.ts index 280abda9..cfb12363 100644 --- a/apps/studio/src/i18n/lazy/connectedAgents.fr.ts +++ b/apps/studio/src/i18n/lazy/connectedAgents.fr.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): fr `connectedAgents.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: ddc411114a059144 +// hash: 77560300e70a2234 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"connectedAgents"> = { @@ -68,7 +68,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { needsDcr: "{client} s’enregistre lui-même (enregistrement dynamique de clients), ce qui est désactivé sur ce serveur. Demandez à son opérateur de réactiver CLOUDHAL_MCP_DCR, ou utilisez une clé d’agent.", needsPublicUrl: - "Claude.ai et ChatGPT se connectent depuis leurs propres serveurs, qui ne peuvent pas joindre {url}. Lance Studio avec --base-url sur une adresse https:// publique, ou utilise une app sur cet ordinateur, comme Claude Code ou Codex.", + "Claude.ai et ChatGPT se connectent depuis leurs propres serveurs, qui ne peuvent pas joindre {url}. Lancez Studio avec --base-url sur une adresse https:// publique, ou utilisez une app sur cet ordinateur, comme Claude Code ou Codex.", unavailable: "Aucun des moyens par lesquels une app peut s’identifier n’est activé ici (documents de métadonnées et enregistrement dynamique). Demandez à l’opérateur de ce serveur, ou utilisez une clé d’agent.", }, diff --git a/apps/studio/src/i18n/lazy/connectedAgents.he.ts b/apps/studio/src/i18n/lazy/connectedAgents.he.ts index a3715ccc..f1ad2309 100644 --- a/apps/studio/src/i18n/lazy/connectedAgents.he.ts +++ b/apps/studio/src/i18n/lazy/connectedAgents.he.ts @@ -1,13 +1,13 @@ // Generated by `pnpm i18n:import` (ADR-0034): he `connectedAgents.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 4a1dab408d25ca9e +// hash: 58861c3fba4f4924 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"connectedAgents"> = { connectedAgents: { title: "סוכנים מחוברים", description: - "אפליקציות שחיברת באמצעות URL, כמו Claude,‏ ChatGPT או Cursor. כל אחת פועלת בשמך, אף פעם לא מעבר לתפקיד שלך, עד שתנתק אותה.", + "אפליקציות שחיברת באמצעות URL, כמו Claude,‏ ChatGPT או Cursor. כל אחת פועלת בשמך, אף פעם לא מעבר לתפקיד שלך, עד שהיא מנותקת.", allTitle: "הסוכנים המחוברים של כולם", allDescription: "החיבורים של כל חברי הצוות. ניתוק חיבור מסיים אותו מיד; חבר הצוות שלו יכול לחבר אותו שוב.", @@ -34,7 +34,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { allEmpty: "אף אחד עדיין לא חיבר סוכן באמצעות URL", setup: { description: - "תן לאפליקציה את כתובת ה-MCP של ה-Studio הזה ואשר אותה כשהיא מבקשת, או צור מפתח סוכן לסקריפטים וללקוחות שלא יכולים להתחבר.", + "תנו לאפליקציה את ה-MCP URL של ה-Studio הזה ואשרו אותה כשהיא מבקשת, או צרו מפתח סוכן לסקריפטים וללקוחות שלא יכולים להתחבר.", tabs: { key: "עם מפתח סוכן", url: "חיבור באמצעות URL", @@ -59,7 +59,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { codex: "Codex: מריצים את שתי השורות; השנייה פותחת את Studio לאישור. ChatGPT: מוסיפים בהגדרות שלו מחבר עם ה-URL הזה.", cursor: - "שמור אותו בתור ~/.cursor/mcp.json, או ‎.cursor/mcp.json בפרויקט, ואז התחבר כש-Cursor מבקש. ‏Studio נפתח לאישור.", + "שומרים אותו בתור ~/.cursor/mcp.json, או ‎.cursor/mcp.json בפרויקט, ואז מתחברים כש-Cursor מבקש. ‏Studio נפתח לאישור.", vscode: "שומרים בשם .vscode/mcp.json בפרויקט, ואז מפעילים את השרת. VS Code מבקש להתחבר ופותח את Studio.", inspector: diff --git a/apps/studio/src/i18n/lazy/connectedAgents.hi.ts b/apps/studio/src/i18n/lazy/connectedAgents.hi.ts index a83aa8d8..a4754ab6 100644 --- a/apps/studio/src/i18n/lazy/connectedAgents.hi.ts +++ b/apps/studio/src/i18n/lazy/connectedAgents.hi.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): hi `connectedAgents.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 1e125b5a50bf91f2 +// hash: 1860ed3786a2fea5 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"connectedAgents"> = { @@ -34,7 +34,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { allEmpty: "किसी ने भी URL से एजेंट कनेक्ट नहीं किया है", setup: { description: - "किसी ऐप को इस Studio का MCP URL दें और उसके पूछने पर स्वीकृत करें, या उन स्क्रिप्ट और क्लाइंट के लिए एजेंट कुंजी बनाएं जो साइन इन नहीं कर सकते।", + "किसी ऐप को इस Studio का MCP URL दें और उसके पूछने पर मंज़ूरी दें, या उन स्क्रिप्ट और क्लाइंट के लिए एजेंट कुंजी बनाएं जो साइन इन नहीं कर सकते।", tabs: { key: "एजेंट कुंजी से", url: "URL से कनेक्ट करें", @@ -59,7 +59,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { codex: "Codex: दोनों लाइनें चलाएँ; दूसरी मंज़ूरी के लिए Studio खोलती है। ChatGPT: उसकी सेटिंग्स में इस URL के साथ एक कनेक्टर जोड़ें।", cursor: - "इसे ~/.cursor/mcp.json या किसी प्रोजेक्ट में .cursor/mcp.json के रूप में सहेजें, फिर Cursor के कहने पर साइन इन करें। स्वीकृति के लिए Studio खुलता है।", + "इसे ~/.cursor/mcp.json या किसी प्रोजेक्ट में .cursor/mcp.json के रूप में सहेजें, फिर Cursor के कहने पर साइन इन करें। मंज़ूरी के लिए Studio खुलता है।", vscode: "इसे अपने प्रोजेक्ट में .vscode/mcp.json के रूप में सहेजें, फिर सर्वर शुरू करें। VS Code आपसे साइन इन करने को कहता है और Studio खोलता है।", inspector: diff --git a/apps/studio/src/i18n/lazy/connectedAgents.id.ts b/apps/studio/src/i18n/lazy/connectedAgents.id.ts index 90a5db68..dc8f354c 100644 --- a/apps/studio/src/i18n/lazy/connectedAgents.id.ts +++ b/apps/studio/src/i18n/lazy/connectedAgents.id.ts @@ -1,16 +1,16 @@ // Generated by `pnpm i18n:import` (ADR-0034): id `connectedAgents.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: f87f8dcc71491397 +// hash: 6cb551c56e0514e0 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"connectedAgents"> = { connectedAgents: { title: "Agen terhubung", description: - "Aplikasi yang Anda hubungkan lewat URL, seperti Claude, ChatGPT, atau Cursor. Masing-masing bekerja sebagai Anda, tidak pernah melampaui peran Anda, sampai Anda memutuskannya.", + "Aplikasi yang Anda hubungkan lewat URL, seperti Claude, ChatGPT, atau Cursor. Masing-masing bekerja sebagai Anda, tidak pernah melampaui peran Anda, sampai Anda memutus koneksinya.", allTitle: "Agen terhubung milik semua orang", allDescription: - "Koneksi setiap anggota. Memutuskan salah satunya langsung mengakhirinya; anggotanya dapat menghubungkannya lagi.", + "Koneksi setiap anggota. Memutus koneksi salah satunya langsung mengakhirinya; anggotanya dapat menghubungkannya lagi.", columns: { agent: "Agen", owner: "Anggota", @@ -19,11 +19,11 @@ export const messages: NamespaceMessages<"connectedAgents"> = { connected: "Terhubung", }, identifiedBy: "Diidentifikasi oleh {host}", - selfRegistered: "Terdaftar sendiri, belum diverifikasi", - lookalike: "Tampak seperti {client}, tetapi belum diverifikasi sebagai aplikasi tersebut", + selfRegistered: "Terdaftar sendiri, tidak terverifikasi", + lookalike: "Tampak seperti {client}, tetapi tidak terverifikasi sebagai aplikasi tersebut", never: "Tidak pernah", - disconnect: "Putuskan", - disconnectLabel: "Putuskan {client}", + disconnect: "Putuskan koneksi", + disconnectLabel: "Putuskan koneksi {client}", resource: "koneksi", disconnected: "Terputus", disconnectedDescription: diff --git a/apps/studio/src/i18n/lazy/connectedAgents.ja.ts b/apps/studio/src/i18n/lazy/connectedAgents.ja.ts index 1162cd7d..cbe8c919 100644 --- a/apps/studio/src/i18n/lazy/connectedAgents.ja.ts +++ b/apps/studio/src/i18n/lazy/connectedAgents.ja.ts @@ -1,13 +1,13 @@ // Generated by `pnpm i18n:import` (ADR-0034): ja `connectedAgents.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 462771123be166f9 +// hash: 13b66d403c0e31ef import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"connectedAgents"> = { connectedAgents: { title: "接続済みのエージェント", description: - "Claude、ChatGPT、Cursor など、URL で接続したアプリです。接続を解除するまで、それぞれがあなたとして、あなたのロールの範囲内で動作します。", + "Claude、ChatGPT、Cursor など、URL で接続したアプリです。接続を解除するまで、それぞれがあなたとして動作し、あなたのロールを超えることは決してありません。", allTitle: "全員の接続済みエージェント", allDescription: "すべてのメンバーの接続です。接続を解除するとすぐに終了します。そのメンバーは再び接続できます。", diff --git a/apps/studio/src/i18n/lazy/connectedAgents.ko.ts b/apps/studio/src/i18n/lazy/connectedAgents.ko.ts index 1bd6d311..c89693ae 100644 --- a/apps/studio/src/i18n/lazy/connectedAgents.ko.ts +++ b/apps/studio/src/i18n/lazy/connectedAgents.ko.ts @@ -1,16 +1,16 @@ // Generated by `pnpm i18n:import` (ADR-0034): ko `connectedAgents.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 974c07fee923464b +// hash: 74aa657e956b2c95 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"connectedAgents"> = { connectedAgents: { title: "연결된 에이전트", description: - "Claude, ChatGPT, Cursor처럼 URL로 연결한 앱입니다. 연결을 해제할 때까지 각 앱은 내 역할을 넘지 않는 범위에서 나로서 작업합니다.", + "Claude, ChatGPT, Cursor처럼 URL로 연결한 앱이에요. 연결을 해제할 때까지 각 앱은 나로서 작업하며, 절대 내 역할을 넘지 않아요.", allTitle: "모든 멤버의 연결된 에이전트", allDescription: - "모든 멤버의 연결입니다. 연결을 해제하면 즉시 끝나며, 해당 멤버는 다시 연결할 수 있습니다.", + "모든 멤버의 연결이에요. 연결을 해제하면 즉시 끝나며, 해당 멤버는 다시 연결할 수 있어요.", columns: { agent: "에이전트", owner: "멤버", @@ -27,11 +27,11 @@ export const messages: NamespaceMessages<"connectedAgents"> = { resource: "연결", disconnected: "연결 해제됨", disconnectedDescription: - "{client}은(는) 더 이상 이 Studio에서 작업할 수 없습니다. 다시 연결을 요청하면 다시 결정하게 됩니다.", - empty: "URL로 연결된 에이전트가 없습니다", + "{client}은(는) 더 이상 이 Studio에서 작업할 수 없어요. 다시 연결을 요청하면 다시 결정하게 돼요.", + empty: "URL로 연결된 에이전트가 없어요", emptyDescription: - "이 Studio의 MCP URL을 Claude, ChatGPT, Cursor 또는 VS Code에 추가하세요. 각 연결은 여기에서 승인합니다.", - allEmpty: "아직 아무도 URL로 에이전트를 연결하지 않았습니다", + "이 Studio의 MCP URL을 Claude, ChatGPT, Cursor 또는 VS Code에 추가하세요. 각 연결은 여기에서 승인해요.", + allEmpty: "아직 아무도 URL로 에이전트를 연결하지 않았어요", setup: { description: "앱에 이 Studio의 MCP URL을 주고 요청하면 승인하세요. 로그인할 수 없는 스크립트와 클라이언트에는 에이전트 키를 만드세요.", @@ -41,7 +41,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { }, url: "MCP URL", urlDescription: - "앱이 브라우저에서 이 Studio를 열면 로그인하고 앱이 할 수 있는 일을 승인합니다. 복사할 키가 없습니다.", + "앱이 브라우저에서 이 Studio를 열면 로그인하고 앱이 할 수 있는 일을 승인해요. 복사할 키가 없어요.", client: "앱", clients: { claudeAi: "Claude.ai, 데스크톱 및 모바일", @@ -53,24 +53,24 @@ export const messages: NamespaceMessages<"connectedAgents"> = { }, hints: { claudeAi: - "Claude에서 Settings를 열고 Connectors로 이동한 뒤 이 URL로 사용자 지정 커넥터를 추가하세요. Claude가 승인을 위해 Studio를 엽니다.", + "Claude에서 Settings를 열고 Connectors로 이동한 뒤 이 URL로 사용자 지정 커넥터를 추가하세요. Claude가 승인을 위해 Studio를 열어요.", claudeCode: - "터미널에서 실행한 다음 Claude Code에서 /mcp를 입력하고 Authenticate를 선택하세요. 브라우저가 승인을 위해 Studio를 엽니다.", + "터미널에서 실행한 다음 Claude Code에서 /mcp를 입력하고 Authenticate를 선택하세요. 브라우저가 승인을 위해 Studio를 열어요.", codex: - "Codex: 두 줄을 모두 실행하세요. 두 번째 줄이 승인을 위해 Studio를 엽니다. ChatGPT: 설정에서 이 URL로 커넥터를 추가하세요.", + "Codex: 두 줄을 모두 실행하세요. 두 번째 줄이 승인을 위해 Studio를 열어요. ChatGPT: 설정에서 이 URL로 커넥터를 추가하세요.", cursor: - "~/.cursor/mcp.json 또는 프로젝트의 .cursor/mcp.json으로 저장한 뒤 Cursor가 요청하면 로그인하세요. 승인을 위해 Studio가 열립니다.", + "~/.cursor/mcp.json 또는 프로젝트의 .cursor/mcp.json으로 저장한 뒤 Cursor가 요청하면 로그인하세요. 승인을 위해 Studio가 열려요.", vscode: - "프로젝트에 .vscode/mcp.json으로 저장한 다음 서버를 시작하세요. VS Code가 로그인을 요청하고 Studio를 엽니다.", + "프로젝트에 .vscode/mcp.json으로 저장한 다음 서버를 시작하세요. VS Code가 로그인을 요청하고 Studio를 열어요.", inspector: - "실행한 뒤 Streamable HTTP를 선택하고 URL을 붙여 넣은 다음 Auth Settings를 열고 Quick OAuth Flow를 실행하세요. 연결을 확인할 때 유용합니다.", + "실행한 뒤 Streamable HTTP를 선택하고 URL을 붙여 넣은 다음 Auth Settings를 열고 Quick OAuth Flow를 실행하세요. 연결을 확인할 때 유용해요.", }, needsDcr: - "{client}은(는) 스스로 등록하는데(동적 클라이언트 등록), 이 서버에서는 꺼져 있습니다. 운영자에게 CLOUDHAL_MCP_DCR을 다시 켜 달라고 요청하거나 에이전트 키를 사용하세요.", + "{client}은(는) 스스로 등록하는데(동적 클라이언트 등록), 이 서버에서는 꺼져 있어요. 운영자에게 CLOUDHAL_MCP_DCR을 다시 켜 달라고 요청하거나 에이전트 키를 사용하세요.", needsPublicUrl: - "Claude.ai와 ChatGPT는 자체 서버에서 연결하므로 {url}에 접근할 수 없습니다. --base-url을 공개 https:// 주소로 설정해 Studio를 시작하거나, Claude Code나 Codex처럼 이 컴퓨터의 앱을 사용하세요.", + "Claude.ai와 ChatGPT는 자체 서버에서 연결하므로 {url}에 접근할 수 없어요. --base-url을 공개 https:// 주소로 설정해 Studio를 시작하거나, Claude Code나 Codex처럼 이 컴퓨터의 앱을 사용하세요.", unavailable: - "앱이 자신을 식별하는 두 가지 방법(메타데이터 문서와 동적 등록)이 모두 여기에서 꺼져 있습니다. 이 서버의 운영자에게 문의하거나 에이전트 키를 사용하세요.", + "앱이 자신을 식별하는 두 가지 방법(메타데이터 문서와 동적 등록)이 모두 여기에서 꺼져 있어요. 이 서버의 운영자에게 문의하거나 에이전트 키를 사용하세요.", }, }, }; diff --git a/apps/studio/src/i18n/lazy/connectedAgents.ru.ts b/apps/studio/src/i18n/lazy/connectedAgents.ru.ts index 96f7909e..ed7fa1b7 100644 --- a/apps/studio/src/i18n/lazy/connectedAgents.ru.ts +++ b/apps/studio/src/i18n/lazy/connectedAgents.ru.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): ru `connectedAgents.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 54b520270734ea3a +// hash: 7e62c81615d6ef67 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"connectedAgents"> = { @@ -19,8 +19,8 @@ export const messages: NamespaceMessages<"connectedAgents"> = { connected: "Подключён", }, identifiedBy: "Идентифицирован через {host}", - selfRegistered: "Зарегистрирован сам, не проверен", - lookalike: "Похож на {client}, но не подтверждён как он", + selfRegistered: "Зарегистрировался сам, не проверен", + lookalike: "Похож на {client}, но не проверено, что это он", never: "Никогда", disconnect: "Отключить", disconnectLabel: "Отключить {client}", @@ -59,7 +59,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { codex: "Codex: выполните обе строки; вторая откроет Studio для одобрения. ChatGPT: добавьте в его настройках коннектор с этим URL.", cursor: - "Сохраните как ~/.cursor/mcp.json или .cursor/mcp.json в проекте, затем войдите, когда Cursor попросит. Studio откроется для подтверждения.", + "Сохраните как ~/.cursor/mcp.json или .cursor/mcp.json в проекте, затем войдите, когда Cursor попросит. Studio откроется для одобрения.", vscode: "Сохраните это как .vscode/mcp.json в проекте, затем запустите сервер. VS Code попросит вас войти и откроет Studio.", inspector: diff --git a/apps/studio/src/i18n/lazy/connectedAgents.tr.ts b/apps/studio/src/i18n/lazy/connectedAgents.tr.ts index 3da516fb..11d43246 100644 --- a/apps/studio/src/i18n/lazy/connectedAgents.tr.ts +++ b/apps/studio/src/i18n/lazy/connectedAgents.tr.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): tr `connectedAgents.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 41a34e329c2ef121 +// hash: 1cce379f51724a08 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"connectedAgents"> = { @@ -34,14 +34,14 @@ export const messages: NamespaceMessages<"connectedAgents"> = { allEmpty: "Henüz kimse URL ile agent bağlamadı", setup: { description: - "Bir uygulamaya bu Studio'nun MCP URL'sini ver ve istediğinde onayla ya da oturum açamayan betikler ve istemciler için bir agent anahtarı oluştur.", + "Bir uygulamaya bu Studio'nun MCP URL'sini ver ve istediğinde onayla ya da giriş yapamayan betikler ve istemciler için bir agent anahtarı oluştur.", tabs: { key: "Agent anahtarıyla", url: "URL ile bağlan", }, url: "MCP URL'si", urlDescription: - "Uygulama bu Studio'yu tarayıcında açar; giriş yapar ve neler yapabileceğini onaylarsın. Kopyalanacak anahtar yok.", + "Uygulama bu Studio'yu tarayıcında açar; giriş yapıp neler yapabileceğini onaylarsın. Kopyalanacak anahtar yok.", client: "Uygulama", clients: { claudeAi: "Claude.ai, masaüstü ve mobil", @@ -59,7 +59,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { codex: "Codex: iki satırı da çalıştır; ikincisi onay için Studio'yu açar. ChatGPT: ayarlarında bu URL ile bir bağlayıcı ekle.", cursor: - "~/.cursor/mcp.json ya da bir projede .cursor/mcp.json olarak kaydet, sonra Cursor isteyince oturum aç. Onaylaman için Studio açılır.", + "~/.cursor/mcp.json ya da bir projede .cursor/mcp.json olarak kaydet, sonra Cursor isteyince giriş yap. Onaylaman için Studio açılır.", vscode: "Projende .vscode/mcp.json olarak kaydet, sonra sunucuyu başlat. VS Code giriş yapmanı ister ve Studio'yu açar.", inspector: diff --git a/apps/studio/src/i18n/lazy/connectedAgents.uk.ts b/apps/studio/src/i18n/lazy/connectedAgents.uk.ts index 74280bac..c994f893 100644 --- a/apps/studio/src/i18n/lazy/connectedAgents.uk.ts +++ b/apps/studio/src/i18n/lazy/connectedAgents.uk.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): uk `connectedAgents.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: ce83ca13a5de2c10 +// hash: 50656739fe3efc22 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"connectedAgents"> = { @@ -20,7 +20,7 @@ export const messages: NamespaceMessages<"connectedAgents"> = { }, identifiedBy: "Ідентифікований через {host}", selfRegistered: "Зареєструвався сам, не перевірений", - lookalike: "Схожий на {client}, але не підтверджений як він", + lookalike: "Схожий на {client}, але не перевірено, що це він", never: "Ніколи", disconnect: "Від'єднати", disconnectLabel: "Від'єднати {client}", diff --git a/apps/studio/src/i18n/lazy/fields.ar.ts b/apps/studio/src/i18n/lazy/fields.ar.ts index 5bb4f99b..38bc932f 100644 --- a/apps/studio/src/i18n/lazy/fields.ar.ts +++ b/apps/studio/src/i18n/lazy/fields.ar.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): ar `fields.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: c8046338c135f91c +// hash: ae52d84482f69224 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"fields"> = { @@ -100,7 +100,7 @@ export const messages: NamespaceMessages<"fields"> = { helpIn: "نص المساعدة ({language})", key: "المفتاح", keyHint: - "الاسم الذي يستخدمه الوكلاء والقوالب لهذا الحقل. بصيغة lowerCamelCase مثل startsAt؛ ولا يمكن تعديله بعد الحفظ.", + "الاسم الذي يستخدمه الوكلاء والسمات لهذا الحقل. بصيغة lowerCamelCase مثل startsAt؛ ولا يمكن تعديله بعد الحفظ.", keySaved: "لا تتغير المفاتيح المحفوظة إلا عبر إعادة التسمية.", needsOperation: "في الحقول المحفوظة يتغير هذا من قائمة الحقل، التي تفحص الإدخالات أولًا.", localized: "قيمة لكل لغة", @@ -158,7 +158,7 @@ export const messages: NamespaceMessages<"fields"> = { descriptions: { rename_field: "تنتقل قيمة كل إدخال إلى المفتاح الجديد. لا يُحوَّل شيء.", change_field_type: "تُحوَّل قيمة كل إدخال إلى النوع الجديد. راجع ما سيتغير قبل التشغيل.", - remove_field: "ستُزال الحقل وقيمته في كل إدخال.", + remove_field: "سيُزال الحقل وقيمته في كل إدخال.", }, toShared: "ستعرض الترجمات قيمة الأصل. تُزال قيمها الخاصة؛ وتبقى قيم الأصل.", toLocalized: "ستحصل كل ترجمة على قيمتها الخاصة. وإلى أن تُضبط، تعرض قيمة الأصل.", @@ -169,7 +169,7 @@ export const messages: NamespaceMessages<"fields"> = { clear: "{count, plural, zero {امسح # قيمة لا يمكن تحويلها} one {امسح قيمة واحدة لا يمكن تحويلها} two {امسح قيمتين لا يمكن تحويلهما} few {امسح # قيم لا يمكن تحويلها} many {امسح # قيمةً لا يمكن تحويلها} other {امسح # قيمة لا يمكن تحويلها}}", themeWarning: - "القوالب التي تقرأ entry.fields.{key} مباشرة تتوقف عن عرضه حتى تُحدَّث. القوالب التي تستخدم entryFields تستمر في العمل.", + "السمات التي تقرأ entry.fields.{key} مباشرة تتوقف عن عرضه حتى تُحدَّث. السمات التي تستخدم entryFields تستمر في العمل.", snapshotNote: "تُلتقط لقطة قبل التغيير وبعده، لذا يمكنك التراجع. لا يتغير الموقع المباشر إلا عند النشر.", confirm: { diff --git a/apps/studio/src/i18n/lazy/fields.de.ts b/apps/studio/src/i18n/lazy/fields.de.ts index e2f8b903..61abce18 100644 --- a/apps/studio/src/i18n/lazy/fields.de.ts +++ b/apps/studio/src/i18n/lazy/fields.de.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): de `fields.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: d53c152d9e91106a +// hash: a95de246e7b0f658 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"fields"> = { @@ -63,7 +63,7 @@ export const messages: NamespaceMessages<"fields"> = { builder: { title: "Felder", description: - "Eigene Felder für die Einträge dieser Sammlung, in der Reihenfolge des Editors. Agenten lesen sie auch.", + "Eigene Felder für die Einträge dieser Sammlung, in der Reihenfolge des Editors. Agents lesen sie auch.", add: "Feld hinzufügen", empty: "Noch keine Felder", emptyDescription: @@ -94,7 +94,7 @@ export const messages: NamespaceMessages<"fields"> = { addTitle: "Feld hinzufügen", editTitle: "Feld bearbeiten", description: - "Beschriftungen und Hilfetexte erscheinen im Editor und sagen Agenten, was sie schreiben sollen. Jeder Eintrag hat seinen eigenen Wert.", + "Beschriftungen und Hilfetexte erscheinen im Editor und sagen Agents, was sie schreiben sollen. Jeder Eintrag hat seinen eigenen Wert.", type: "Typ", label: "Beschriftung", labelIn: "Beschriftung ({language})", @@ -102,7 +102,7 @@ export const messages: NamespaceMessages<"fields"> = { helpIn: "Hilfetext ({language})", key: "Schlüssel", keyHint: - "So nennen Agenten und Themes dieses Feld. lowerCamelCase wie startsAt; nach dem Speichern nicht mehr änderbar.", + "So nennen Agents und Themes dieses Feld. lowerCamelCase wie startsAt; nach dem Speichern nicht mehr änderbar.", keySaved: "Gespeicherte Schlüssel ändern sich nur über Umbenennen.", needsOperation: "Bei gespeicherten Feldern änderst du das über das Feldmenü, das zuerst die Einträge prüft.", @@ -124,7 +124,7 @@ export const messages: NamespaceMessages<"fields"> = { integerHint: "Lehnt Dezimalzahlen wie 2,5 ab.", options: "Optionen", optionsHint: - "Woraus Redaktion und Agenten wählen. Der Wert wird gespeichert; Leser sehen die Beschriftung.", + "Woraus Redaktion und Agents wählen. Der Wert wird gespeichert; Leser sehen die Beschriftung.", optionLabel: "Beschriftung", optionLabelIn: "Beschriftung ({language})", optionValue: "Wert", diff --git a/apps/studio/src/i18n/lazy/fields.es.ts b/apps/studio/src/i18n/lazy/fields.es.ts index b9684b36..327e73e2 100644 --- a/apps/studio/src/i18n/lazy/fields.es.ts +++ b/apps/studio/src/i18n/lazy/fields.es.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): es `fields.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: f46eeae1dd8ee277 +// hash: 751b5c912daf3e71 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"fields"> = { @@ -70,7 +70,7 @@ export const messages: NamespaceMessages<"fields"> = { "Añade una fecha, un precio, un ponente o cualquier otra cosa que deba tener cada entrada.", localized: "Por idioma", unsaved: "Sin guardar", - changing: "En cambio", + changing: "Cambio en curso", moveUp: "Subir {name}", moveDown: "Bajar {name}", menu: "Acciones del campo", diff --git a/apps/studio/src/i18n/lazy/fields.fa.ts b/apps/studio/src/i18n/lazy/fields.fa.ts index dcd4eddc..6058acd3 100644 --- a/apps/studio/src/i18n/lazy/fields.fa.ts +++ b/apps/studio/src/i18n/lazy/fields.fa.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): fa `fields.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 2fcca25d8b8df7c7 +// hash: fcc0e8a4b354aba1 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"fields"> = { @@ -50,8 +50,8 @@ export const messages: NamespaceMessages<"fields"> = { invalid_value: "این مقدار با فیلد جور نیست. محدودیت‌هایش را بررسی کنید.", unknown_field: "این مجموعه چنین فیلدی ندارد.", field_not_localized: "این فیلد بین همهٔ زبان‌ها مشترک است. آن را در نسخهٔ اصلی تغییر دهید.", - required_field: "لازم برای انتشار. مقداری وارد کنید یا مطلب را پیش‌نویس نگه دارید.", - too_large: "فیلدهای این مطلب روی هم خیلی بزرگ‌اند.", + required_field: "لازم برای انتشار. مقداری وارد کنید یا ورودی را پیش‌نویس نگه دارید.", + too_large: "فیلدهای این ورودی روی هم خیلی بزرگ‌اند.", }, image: { empty: "بدون تصویر", @@ -62,10 +62,10 @@ export const messages: NamespaceMessages<"fields"> = { builder: { title: "فیلدها", description: - "فیلدهای اختصاصی مطالب این مجموعه، به ترتیبی که ویرایشگر نشان می‌دهد. عامل‌ها هم آن‌ها را می‌خوانند.", + "فیلدهای اختصاصی ورودی‌های این مجموعه، به ترتیبی که ویرایشگر نشان می‌دهد. عامل‌ها هم آن‌ها را می‌خوانند.", add: "افزودن فیلد", empty: "هنوز فیلدی نیست", - emptyDescription: "تاریخ، قیمت، سخنران یا هر چیزی که هر مطلب باید داشته باشد اضافه کنید.", + emptyDescription: "تاریخ، قیمت، سخنران یا هر چیزی که هر ورودی باید داشته باشد اضافه کنید.", localized: "برای هر زبان", unsaved: "ذخیره‌نشده", changing: "در حال تغییر", @@ -84,14 +84,14 @@ export const messages: NamespaceMessages<"fields"> = { saveFirst: "پیش از تغییر نام، تغییر نوع یا حذف یک فیلد، تغییراتتان را ذخیره یا رها کنید.", runningTitle: "تغییر یک فیلد هنوز در جریان است", running: - "{count, plural, =0 {مطالب در حال به‌روزرسانی‌اند.} one {# مطلب برای به‌روزرسانی مانده است.} other {# مطلب برای به‌روزرسانی مانده است.}} همین‌جا ادامه دهید، وگرنه با تغییر بعدی از سر گرفته می‌شود.", + "{count, plural, =0 {ورودی‌ها در حال به‌روزرسانی‌اند.} one {# ورودی برای به‌روزرسانی مانده است.} other {# ورودی برای به‌روزرسانی مانده است.}} همین‌جا ادامه دهید، وگرنه با تغییر بعدی از سر گرفته می‌شود.", continue: "ادامه", }, dialog: { addTitle: "افزودن فیلد", editTitle: "ویرایش فیلد", description: - "برچسب‌ها و راهنما در ویرایشگر دیده می‌شوند و به عامل‌ها می‌گویند چه بنویسند. هر مطلب مقدار خودش را دارد.", + "برچسب‌ها و راهنما در ویرایشگر دیده می‌شوند و به عامل‌ها می‌گویند چه بنویسند. هر ورودی مقدار خودش را دارد.", type: "نوع", label: "برچسب", labelIn: "برچسب ({language})", @@ -102,19 +102,19 @@ export const messages: NamespaceMessages<"fields"> = { "نامی که عامل‌ها و پوسته‌ها این فیلد را با آن می‌خوانند. به شکل lowerCamelCase مثل startsAt؛ پس از ذخیره ویرایش‌شدنی نیست.", keySaved: "کلیدهای ذخیره‌شده فقط با «تغییر نام» عوض می‌شوند.", needsOperation: - "در فیلدهای ذخیره‌شده این مورد از منوی فیلد تغییر می‌کند که اول مطالب را بررسی می‌کند.", + "در فیلدهای ذخیره‌شده این مورد از منوی فیلد تغییر می‌کند که اول ورودی‌ها را بررسی می‌کند.", localized: "یک مقدار برای هر زبان", localizedHint: "روشن: هر ترجمه مقدار خودش را دارد. خاموش: ترجمه‌ها مقدار نسخهٔ اصلی را نشان می‌دهند.", required: "لازم برای انتشار", requiredHint: - "مطالبِ در حال بازبینی یا منتشرشده به مقدار نیاز دارند. پیش‌نویس‌ها بدون آن ذخیره می‌شوند.", + "ورودی‌های در حال بازبینی یا منتشرشده به مقدار نیاز دارند. پیش‌نویس‌ها بدون آن ذخیره می‌شوند.", maxLength: "حداکثر طول", maxLengthHint: "به نویسه، تا {max, number}. خالی: {max, number}.", multiline: "چندخطی", multilineHint: "شکستن خط را مجاز می‌کند.", searchable: "در جست‌وجوی سایت بیاید", - searchableHint: "بازدیدکنندگان مطالب را با واژه‌های این فیلد پیدا می‌کنند.", + searchableHint: "بازدیدکنندگان ورودی‌ها را با واژه‌های این فیلد پیدا می‌کنند.", minimum: "کمینه", maximum: "بیشینه", integer: "فقط عدد صحیح", @@ -128,7 +128,7 @@ export const messages: NamespaceMessages<"fields"> = { addOption: "افزودن گزینه", removeOption: "حذف گزینه", multiple: "اجازهٔ چند انتخاب", - multipleHint: "مطالب می‌توانند بیش از یک گزینه انتخاب کنند.", + multipleHint: "ورودی‌ها می‌توانند بیش از یک گزینه انتخاب کنند.", add: "افزودن فیلد", apply: "اعمال", errors: { @@ -136,7 +136,7 @@ export const messages: NamespaceMessages<"fields"> = { maxLength: "یک عدد صحیح از 1 تا {max, number} وارد کنید.", key: { pattern: "با حرف کوچک لاتین شروع کنید؛ فقط حرف و رقم، تا 40.", - reserved: "این کلید برای خود مطلب رزرو شده است. کلید دیگری انتخاب کنید.", + reserved: "این کلید برای خود ورودی رزرو شده است. کلید دیگری انتخاب کنید.", taken: "فیلد دیگری از این کلید استفاده می‌کند.", }, bounds: { @@ -159,10 +159,10 @@ export const messages: NamespaceMessages<"fields"> = { remove_field: "حذف {name}", }, descriptions: { - rename_field: "مقدار هر مطلب به کلید تازه منتقل می‌شود. چیزی تبدیل نمی‌شود.", + rename_field: "مقدار هر ورودی به کلید تازه منتقل می‌شود. چیزی تبدیل نمی‌شود.", change_field_type: - "مقدار هر مطلب به نوع تازه تبدیل می‌شود. پیش از اجرا ببینید چه چیزی تغییر می‌کند.", - remove_field: "فیلد و مقدارش در همهٔ مطالب حذف می‌شود.", + "مقدار هر ورودی به نوع تازه تبدیل می‌شود. پیش از اجرا ببینید چه چیزی تغییر می‌کند.", + remove_field: "فیلد و مقدارش در همهٔ ورودی‌ها حذف می‌شود.", }, toShared: "ترجمه‌ها مقدار نسخهٔ اصلی را نشان خواهند داد. مقدارهای خودشان حذف می‌شوند؛ مقدارهای نسخهٔ اصلی می‌مانند.", @@ -171,7 +171,7 @@ export const messages: NamespaceMessages<"fields"> = { newKey: "کلید تازه", newType: "نوع تازه", check: "دیدن تغییرات", - checking: "در حال بررسی مطالب…", + checking: "در حال بررسی ورودی‌ها…", clear: "{count, plural, one {پاک کردن # مقداری که تبدیل‌شدنی نیست} other {پاک کردن # مقداری که تبدیل‌شدنی نیستند}}", themeWarning: @@ -185,20 +185,20 @@ export const messages: NamespaceMessages<"fields"> = { remove_field: "حذف فیلد", }, running: - "{count, plural, =0 {در حال به‌روزرسانی مطالب…} one {# مطلب به‌روز شد…} other {# مطلب به‌روز شد…}}", + "{count, plural, =0 {در حال به‌روزرسانی ورودی‌ها…} one {# ورودی به‌روز شد…} other {# ورودی به‌روز شد…}}", reverting: "در حال برگرداندن…", doneTitle: "انجام شد", - done: "{count, plural, =0 {هیچ مطلبی به تغییر نیاز نداشت.} one {# مطلب تغییر کرد.} other {# مطلب تغییر کرد.}}", + done: "{count, plural, =0 {هیچ ورودی‌ای به تغییر نیاز نداشت.} one {# ورودی تغییر کرد.} other {# ورودی تغییر کرد.}}", revert: "برگرداندن", revertedTitle: "برگردانده شد", reverted: - "{count, plural, =0 {فیلد به حالت قبل برگشت.} one {فیلد و # مطلب به حالت قبل برگشتند.} other {فیلد و # مطلب به حالت قبل برگشتند.}}", + "{count, plural, =0 {فیلد به حالت قبل برگشت.} one {فیلد و # ورودی به حالت قبل برگشتند.} other {فیلد و # ورودی به حالت قبل برگشتند.}}", close: "بستن", failed: "تغییر کامل نشد", }, report: { - entries: "مطالب بررسی‌شده", - touched: "مطالبی که تغییر می‌کنند", + entries: "ورودی‌های بررسی‌شده", + touched: "ورودی‌هایی که تغییر می‌کنند", unchanged: "مقدارهایی که دست‌نخورده می‌مانند", kinds: { moved: "مقدارهای منتقل‌شده", diff --git a/apps/studio/src/i18n/lazy/fields.fr.ts b/apps/studio/src/i18n/lazy/fields.fr.ts index cfab8820..07062ff6 100644 --- a/apps/studio/src/i18n/lazy/fields.fr.ts +++ b/apps/studio/src/i18n/lazy/fields.fr.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): fr `fields.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 170a4f013b59ac24 +// hash: e00a0b20dbb80425 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"fields"> = { @@ -30,8 +30,8 @@ export const messages: NamespaceMessages<"fields"> = { date: { date: "Date", pickDate: "Choisir une date", - chooseDate: "Choisis une date", - invalidTime: "Saisis une heure comme 09:30", + chooseDate: "Choisissez une date", + invalidTime: "Saisissez une heure comme 09:30", previousMonth: "Mois précédent", nextMonth: "Mois suivant", months: "Mois", @@ -48,10 +48,11 @@ export const messages: NamespaceMessages<"fields"> = { integer: "Nombres entiers uniquement.", }, issues: { - invalid_value: "Cette valeur ne convient pas au champ. Vérifie ses limites.", + invalid_value: "Cette valeur ne convient pas au champ. Vérifiez ses limites.", unknown_field: "Cette collection n’a pas ce champ.", - field_not_localized: "Ce champ est commun à toutes les langues. Modifie-le sur l’original.", - required_field: "Nécessaire pour publier. Ajoute une valeur ou garde l’entrée en brouillon.", + field_not_localized: "Ce champ est commun à toutes les langues. Modifiez-le sur l’original.", + required_field: + "Nécessaire pour publier. Ajoutez une valeur ou gardez l’entrée en brouillon.", too_large: "Les champs de cette entrée sont trop volumineux ensemble.", }, image: { @@ -67,7 +68,7 @@ export const messages: NamespaceMessages<"fields"> = { add: "Ajouter un champ", empty: "Aucun champ pour l’instant", emptyDescription: - "Ajoute une date, un prix, un intervenant ou tout ce que chaque entrée doit avoir.", + "Ajoutez une date, un prix, un intervenant ou tout ce que chaque entrée doit avoir.", localized: "Par langue", unsaved: "Non enregistré", changing: "En cours de modification", @@ -84,10 +85,10 @@ export const messages: NamespaceMessages<"fields"> = { save: "Enregistrer les champs", saved: "Champs enregistrés", saveFirst: - "Enregistre ou annule tes modifications avant de renommer, de changer le type ou de retirer un champ.", + "Enregistrez ou annulez vos modifications avant de renommer, de changer le type ou de retirer un champ.", runningTitle: "Un changement de champ est encore en cours", running: - "{count, plural, =0 {Les entrées sont en cours de mise à jour.} one {Il reste # entrée à mettre à jour.} many {Il reste # d’entrées à mettre à jour.} other {Il reste # entrées à mettre à jour.}} Poursuis-le ici, sinon il reprendra au prochain changement.", + "{count, plural, =0 {Les entrées sont en cours de mise à jour.} one {Il reste # entrée à mettre à jour.} many {Il reste # d’entrées à mettre à jour.} other {Il reste # entrées à mettre à jour.}} Poursuivez-le ici, sinon il reprendra au prochain changement.", continue: "Poursuivre", }, dialog: { @@ -121,7 +122,7 @@ export const messages: NamespaceMessages<"fields"> = { minimum: "Minimum", maximum: "Maximum", integer: "Nombres entiers uniquement", - integerHint: "Refuse les décimales comme 2,5.", + integerHint: "Refuse les nombres décimaux comme 2,5.", options: "Options", optionsHint: "Ce parmi quoi choisissent les rédacteurs et les agents. La valeur est enregistrée ; les lecteurs voient le libellé.", @@ -135,19 +136,19 @@ export const messages: NamespaceMessages<"fields"> = { add: "Ajouter le champ", apply: "Appliquer", errors: { - label: "Donne un libellé au champ.", - maxLength: "Saisis un nombre entier de 1 à {max, number}.", + label: "Donnez un libellé au champ.", + maxLength: "Saisissez un nombre entier de 1 à {max, number}.", key: { - pattern: "Commence par une minuscule ; lettres et chiffres uniquement, jusqu’à 40.", - reserved: "Cette clé est réservée à l’entrée elle-même. Choisis-en une autre.", + pattern: "Commencez par une minuscule ; lettres et chiffres uniquement, jusqu’à 40.", + reserved: "Cette clé est réservée à l’entrée elle-même. Choisissez-en une autre.", taken: "Un autre champ utilise déjà cette clé.", }, bounds: { - number: "Saisis uniquement des nombres.", + number: "Saisissez uniquement des nombres.", order: "Le minimum dépasse le maximum.", }, options: { - required: "Ajoute au moins une option.", + required: "Ajoutez au moins une option.", value: "Les valeurs utilisent des minuscules, des chiffres et des tirets.", duplicate: "Deux options ont la même valeur.", label: "Chaque option a besoin d’un libellé.", @@ -164,7 +165,7 @@ export const messages: NamespaceMessages<"fields"> = { descriptions: { rename_field: "La valeur de chaque entrée passe à la nouvelle clé. Rien n’est converti.", change_field_type: - "La valeur de chaque entrée est convertie vers le nouveau type. Vérifie ce qui change avant de lancer.", + "La valeur de chaque entrée est convertie vers le nouveau type. Vérifiez ce qui change avant de lancer.", remove_field: "Le champ et sa valeur dans chaque entrée sont retirés.", }, toShared: @@ -180,7 +181,7 @@ export const messages: NamespaceMessages<"fields"> = { themeWarning: "Les thèmes qui lisent entry.fields.{key} directement ne l’affichent plus tant qu’ils ne sont pas mis à jour. Les thèmes qui utilisent entryFields continuent de fonctionner.", snapshotNote: - "Un snapshot est pris avant et après, tu peux donc revenir en arrière. Le site en ligne ne change que quand tu publies.", + "Un snapshot est pris avant et après, vous pouvez donc revenir en arrière. Le site en ligne ne change que quand vous publiez.", confirm: { rename_field: "Renommer le champ", change_field_type: "Changer le type", diff --git a/apps/studio/src/i18n/lazy/fields.hi.ts b/apps/studio/src/i18n/lazy/fields.hi.ts index 91c3dc5b..8be28b6d 100644 --- a/apps/studio/src/i18n/lazy/fields.hi.ts +++ b/apps/studio/src/i18n/lazy/fields.hi.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): hi `fields.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 467aac405971861f +// hash: d0752ea6dc7f4c56 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"fields"> = { @@ -48,7 +48,7 @@ export const messages: NamespaceMessages<"fields"> = { }, issues: { invalid_value: "यह मान फ़ील्ड में फ़िट नहीं होता। उसकी सीमाएँ जाँचें।", - unknown_field: "इस कलेक्शन में ऐसा कोई फ़ील्ड नहीं है।", + unknown_field: "इस संग्रह में ऐसा कोई फ़ील्ड नहीं है।", field_not_localized: "यह फ़ील्ड सभी भाषाओं में साझा है। इसे मूल में बदलें।", required_field: "प्रकाशन के लिए ज़रूरी। कोई मान डालें, या एंट्री को ड्राफ़्ट रहने दें।", too_large: "इस एंट्री के फ़ील्ड मिलाकर बहुत बड़े हैं।", @@ -62,7 +62,7 @@ export const messages: NamespaceMessages<"fields"> = { builder: { title: "फ़ील्ड", description: - "इस कलेक्शन की एंट्री के अपने फ़ील्ड, उसी क्रम में जिसमें एडिटर उन्हें दिखाता है। एजेंट भी इन्हें पढ़ते हैं।", + "इस संग्रह की एंट्री के अपने फ़ील्ड, उसी क्रम में जिसमें एडिटर उन्हें दिखाता है। एजेंट भी इन्हें पढ़ते हैं।", add: "फ़ील्ड जोड़ें", empty: "अभी कोई फ़ील्ड नहीं", emptyDescription: "तारीख़, क़ीमत, वक्ता या कुछ भी जोड़ें जो हर एंट्री में होना चाहिए।", diff --git a/apps/studio/src/i18n/lazy/fields.id.ts b/apps/studio/src/i18n/lazy/fields.id.ts index 1b8ae494..c0985b41 100644 --- a/apps/studio/src/i18n/lazy/fields.id.ts +++ b/apps/studio/src/i18n/lazy/fields.id.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): id `fields.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: cd4ff7d5aa5210dc +// hash: 69776e763225166c import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"fields"> = { @@ -83,7 +83,7 @@ export const messages: NamespaceMessages<"fields"> = { save: "Simpan kolom", saved: "Kolom disimpan", saveFirst: - "Simpan atau buang perubahanmu sebelum mengganti nama, mengubah jenis, atau menghapus kolom.", + "Simpan atau buang perubahan Anda sebelum mengganti nama, mengubah jenis, atau menghapus kolom.", runningTitle: "Perubahan kolom masih berjalan", running: "{count, plural, =0 {Entri sedang diperbarui.} other {Tersisa # entri untuk diperbarui.}} Lanjutkan di sini, atau akan dilanjutkan pada perubahan berikutnya.", @@ -177,7 +177,7 @@ export const messages: NamespaceMessages<"fields"> = { themeWarning: "Tema yang membaca entry.fields.{key} secara langsung berhenti menampilkannya sampai diperbarui. Tema yang memakai entryFields tetap berfungsi.", snapshotNote: - "Snapshot dibuat sebelum dan sesudahnya, jadi kamu bisa membatalkannya. Situs langsung baru berubah saat kamu menerbitkan.", + "Snapshot dibuat sebelum dan sesudahnya, jadi Anda bisa membatalkannya. Situs live baru berubah saat Anda menerbitkan.", confirm: { rename_field: "Ganti nama kolom", change_field_type: "Ubah jenis", diff --git a/apps/studio/src/i18n/lazy/fields.ko.ts b/apps/studio/src/i18n/lazy/fields.ko.ts index 49cb1510..9614e8a2 100644 --- a/apps/studio/src/i18n/lazy/fields.ko.ts +++ b/apps/studio/src/i18n/lazy/fields.ko.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): ko `fields.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: e74d347cdf0c4a74 +// hash: be014dc588e354eb import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"fields"> = { @@ -47,11 +47,11 @@ export const messages: NamespaceMessages<"fields"> = { integer: "정수만 가능.", }, issues: { - invalid_value: "이 값은 필드에 맞지 않습니다. 제한을 확인하세요.", - unknown_field: "이 컬렉션에는 그런 필드가 없습니다.", - field_not_localized: "이 필드는 모든 언어에서 공유됩니다. 원본에서 바꾸세요.", - required_field: "게시에 필요합니다. 값을 추가하거나 항목을 초안으로 두세요.", - too_large: "이 항목의 필드가 합쳐서 너무 큽니다.", + invalid_value: "이 값은 필드에 맞지 않아요. 제한을 확인하세요.", + unknown_field: "이 컬렉션에는 그런 필드가 없어요.", + field_not_localized: "이 필드는 모든 언어에서 공유돼요. 원본에서 바꾸세요.", + required_field: "게시에 필요해요. 값을 추가하거나 항목을 초안으로 두세요.", + too_large: "이 항목의 필드가 합쳐서 너무 커요.", }, image: { empty: "이미지 없음", @@ -62,9 +62,9 @@ export const messages: NamespaceMessages<"fields"> = { builder: { title: "필드", description: - "이 컬렉션 항목만의 필드로, 편집기에 표시되는 순서대로 나열됩니다. 에이전트도 읽습니다.", + "이 컬렉션 항목만의 필드로, 편집기에 표시되는 순서대로 나열돼요. 에이전트도 읽어요.", add: "필드 추가", - empty: "아직 필드가 없습니다", + empty: "아직 필드가 없어요", emptyDescription: "날짜, 가격, 연사 등 모든 항목에 있어야 할 것을 추가하세요.", localized: "언어별", unsaved: "저장 안 됨", @@ -80,18 +80,18 @@ export const messages: NamespaceMessages<"fields"> = { remove: "삭제…", removeNew: "삭제", save: "필드 저장", - saved: "필드를 저장했습니다", + saved: "필드를 저장했어요", saveFirst: "필드의 이름이나 유형을 바꾸거나 삭제하기 전에 변경 사항을 저장하거나 취소하세요.", - runningTitle: "필드 변경이 아직 진행 중입니다", + runningTitle: "필드 변경이 아직 진행 중이에요", running: - "{count, plural, =0 {항목을 업데이트하고 있습니다.} other {업데이트할 항목이 #개 남았습니다.}} 여기서 계속하거나, 다음 변경 때 이어서 진행됩니다.", + "{count, plural, =0 {항목을 업데이트하고 있어요.} other {업데이트할 항목이 #개 남았어요.}} 여기서 계속하거나, 다음 변경 때 이어서 진행돼요.", continue: "계속", }, dialog: { addTitle: "필드 추가", editTitle: "필드 편집", description: - "레이블과 도움말은 편집기에 표시되고 에이전트에게 무엇을 쓸지 알려 줍니다. 각 항목은 자기 값을 가집니다.", + "레이블과 도움말은 편집기에 표시되고 에이전트에게 무엇을 쓸지 알려 줘요. 각 항목은 자기 값을 가져요.", type: "유형", label: "레이블", labelIn: "레이블({language})", @@ -99,33 +99,33 @@ export const messages: NamespaceMessages<"fields"> = { helpIn: "도움말({language})", key: "키", keyHint: - "에이전트와 테마가 이 필드를 부르는 이름입니다. startsAt 같은 lowerCamelCase이며 저장 후에는 편집할 수 없습니다.", - keySaved: "저장된 키는 이름 변경으로만 바뀝니다.", - needsOperation: "저장된 필드는 먼저 항목을 확인하는 필드 메뉴에서 바꿉니다.", + "에이전트와 테마가 이 필드를 부르는 이름이에요. startsAt 같은 lowerCamelCase이며 저장 후에는 편집할 수 없어요.", + keySaved: "저장된 키는 이름 변경으로만 바뀌어요.", + needsOperation: "저장된 필드는 먼저 항목을 확인하는 필드 메뉴에서 바꿔요.", localized: "언어별 값", - localizedHint: "켜짐: 번역마다 자기 값을 가집니다. 꺼짐: 번역은 원본의 값을 보여 줍니다.", + localizedHint: "켜짐: 번역마다 자기 값을 가져요. 꺼짐: 번역은 원본의 값을 보여 줘요.", required: "게시에 필요", - requiredHint: "검토 중이거나 게시된 항목에는 값이 필요합니다. 초안은 값 없이 저장됩니다.", + requiredHint: "검토 중이거나 게시된 항목에는 값이 필요해요. 초안은 값 없이 저장돼요.", maxLength: "최대 길이", maxLengthHint: "글자 수로 최대 {max, number}. 비워 두면 {max, number}.", multiline: "여러 줄", - multilineHint: "줄바꿈을 허용합니다.", + multilineHint: "줄바꿈을 허용해요.", searchable: "사이트 검색에 포함", - searchableHint: "방문자가 이 필드의 단어로 항목을 찾습니다.", + searchableHint: "방문자가 이 필드의 단어로 항목을 찾아요.", minimum: "최솟값", maximum: "최댓값", integer: "정수만", - integerHint: "2.5 같은 소수를 거부합니다.", + integerHint: "2.5 같은 소수를 거부해요.", options: "옵션", optionsHint: - "편집자와 에이전트가 고르는 항목입니다. 값이 저장되고 독자에게는 레이블이 보입니다.", + "편집자와 에이전트가 고르는 선택지예요. 값이 저장되고 독자에게는 레이블이 보여요.", optionLabel: "레이블", optionLabelIn: "레이블({language})", optionValue: "값", addOption: "옵션 추가", removeOption: "옵션 삭제", multiple: "여러 개 허용", - multipleHint: "항목이 둘 이상의 옵션을 고를 수 있습니다.", + multipleHint: "항목이 둘 이상의 옵션을 고를 수 있어요.", add: "필드 추가", apply: "적용", errors: { @@ -133,18 +133,18 @@ export const messages: NamespaceMessages<"fields"> = { maxLength: "1부터 {max, number}까지의 정수를 입력하세요.", key: { pattern: "소문자로 시작하고 영문자와 숫자만, 최대 40자로 쓰세요.", - reserved: "이 키는 항목 자체에 예약되어 있습니다. 다른 키를 고르세요.", - taken: "다른 필드가 이미 이 키를 사용합니다.", + reserved: "이 키는 항목 자체에 예약되어 있어요. 다른 키를 고르세요.", + taken: "다른 필드가 이미 이 키를 사용해요.", }, bounds: { number: "숫자만 입력하세요.", - order: "최솟값이 최댓값보다 큽니다.", + order: "최솟값이 최댓값보다 커요.", }, options: { required: "옵션을 하나 이상 추가하세요.", - value: "값에는 영문 소문자, 숫자, 하이픈을 씁니다.", - duplicate: "두 옵션의 값이 같습니다.", - label: "모든 옵션에 레이블이 필요합니다.", + value: "값에는 영문 소문자, 숫자, 하이픈을 써요.", + duplicate: "두 옵션의 값이 같아요.", + label: "모든 옵션에 레이블이 필요해요.", }, }, }, @@ -156,22 +156,22 @@ export const messages: NamespaceMessages<"fields"> = { remove_field: "{name} 삭제", }, descriptions: { - rename_field: "각 항목의 값이 새 키로 옮겨집니다. 아무것도 변환되지 않습니다.", + rename_field: "각 항목의 값이 새 키로 옮겨져요. 아무것도 변환되지 않아요.", change_field_type: - "각 항목의 값이 새 유형으로 변환됩니다. 실행하기 전에 무엇이 바뀌는지 확인하세요.", - remove_field: "필드와 각 항목의 해당 값이 삭제됩니다.", + "각 항목의 값이 새 유형으로 변환돼요. 실행하기 전에 무엇이 바뀌는지 확인하세요.", + remove_field: "필드와 각 항목의 해당 값이 삭제돼요.", }, - toShared: "번역에 원본의 값이 표시됩니다. 번역 자체의 값은 삭제되고 원본의 값은 남습니다.", - toLocalized: "번역마다 자기 값을 갖게 됩니다. 값을 정하기 전까지는 원본의 값을 보여 줍니다.", + toShared: "번역에 원본의 값이 표시돼요. 번역 자체의 값은 삭제되고 원본의 값은 남아요.", + toLocalized: "번역마다 자기 값을 갖게 돼요. 값을 정하기 전까지는 원본의 값을 보여 줘요.", newKey: "새 키", newType: "새 유형", check: "바뀌는 내용 확인", checking: "항목을 확인하는 중…", clear: "{count, plural, other {변환할 수 없는 값 #개 지우기}}", themeWarning: - "entry.fields.{key}를 직접 읽는 테마는 업데이트될 때까지 이를 표시하지 않습니다. entryFields를 쓰는 테마는 계속 작동합니다.", + "entry.fields.{key}를 직접 읽는 테마는 업데이트될 때까지 이를 표시하지 않아요. entryFields를 쓰는 테마는 계속 작동해요.", snapshotNote: - "전후로 스냅샷이 만들어지므로 되돌릴 수 있습니다. 라이브 사이트는 게시할 때만 바뀝니다.", + "전후로 스냅샷이 만들어지므로 되돌릴 수 있어요. 라이브 사이트는 게시할 때만 바뀌어요.", confirm: { rename_field: "이름 변경", change_field_type: "유형 변경", @@ -181,13 +181,13 @@ export const messages: NamespaceMessages<"fields"> = { running: "{count, plural, =0 {항목을 업데이트하는 중…} other {항목 #개 업데이트됨…}}", reverting: "되돌리는 중…", doneTitle: "완료", - done: "{count, plural, =0 {바꿀 항목이 없었습니다.} other {항목 #개를 바꿨습니다.}}", + done: "{count, plural, =0 {바꿀 항목이 없었어요.} other {항목 #개를 바꿨어요.}}", revert: "되돌리기", revertedTitle: "되돌림", reverted: - "{count, plural, =0 {필드가 원래대로 돌아왔습니다.} other {필드와 항목 #개가 원래대로 돌아왔습니다.}}", + "{count, plural, =0 {필드가 원래대로 돌아왔어요.} other {필드와 항목 #개가 원래대로 돌아왔어요.}}", close: "닫기", - failed: "변경이 끝나지 않았습니다", + failed: "변경이 끝나지 않았어요", }, report: { entries: "확인한 항목", diff --git a/apps/studio/src/i18n/lazy/fields.zh-Hans.ts b/apps/studio/src/i18n/lazy/fields.zh-Hans.ts index 9546fb09..7231b8ef 100644 --- a/apps/studio/src/i18n/lazy/fields.zh-Hans.ts +++ b/apps/studio/src/i18n/lazy/fields.zh-Hans.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): zh-Hans `fields.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: b0d9df093fe67019 +// hash: f35635e34d8c5d2b import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"fields"> = { @@ -61,7 +61,7 @@ export const messages: NamespaceMessages<"fields"> = { }, builder: { title: "字段", - description: "此集合条目专属的字段,按编辑器中显示的顺序排列。代理也会读取它们。", + description: "此集合条目专属的字段,按编辑器中显示的顺序排列。智能体也会读取它们。", add: "添加字段", empty: "还没有字段", emptyDescription: "添加日期、价格、演讲者,或每个条目都应具备的其他内容。", @@ -89,14 +89,14 @@ export const messages: NamespaceMessages<"fields"> = { dialog: { addTitle: "添加字段", editTitle: "编辑字段", - description: "标签和帮助文本会显示在编辑器中,并告诉代理该写什么。每个条目保留自己的值。", + description: "标签和帮助文本会显示在编辑器中,并告诉智能体该写什么。每个条目保留自己的值。", type: "类型", label: "标签", labelIn: "标签({language})", help: "帮助文本", helpIn: "帮助文本({language})", key: "键", - keyHint: "代理和主题对此字段的称呼。使用 lowerCamelCase,例如 startsAt;保存后无法编辑。", + keyHint: "智能体和主题对此字段的称呼。使用 lowerCamelCase,例如 startsAt;保存后无法编辑。", keySaved: "已保存的键只能通过重命名更改。", needsOperation: "已保存的字段需通过字段菜单更改此项,菜单会先检查条目。", localized: "每种语言一个值", @@ -114,7 +114,7 @@ export const messages: NamespaceMessages<"fields"> = { integer: "仅限整数", integerHint: "拒绝 2.5 这样的小数。", options: "选项", - optionsHint: "编辑和代理可选的内容。保存的是值;读者看到的是标签。", + optionsHint: "编辑和智能体可选的内容。保存的是值;读者看到的是标签。", optionLabel: "标签", optionLabelIn: "标签({language})", optionValue: "值", diff --git a/apps/studio/src/i18n/lazy/listings.de.ts b/apps/studio/src/i18n/lazy/listings.de.ts index 4a02f6c3..b2135ecc 100644 --- a/apps/studio/src/i18n/lazy/listings.de.ts +++ b/apps/studio/src/i18n/lazy/listings.de.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): de `listings.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: c4f413070f5457f2 +// hash: 38ed12c32d585a35 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"listings"> = { @@ -46,7 +46,7 @@ export const messages: NamespaceMessages<"listings"> = { grace: "Kulanzzeit in Minuten", graceHint: "So lange nach dem Datum warten, bevor der Eintrag endet. Bis zu 10.080 (eine Woche).", - past: "{count, plural, =0 {Noch keine veröffentlichten Einträge sind darüber hinaus.} one {# veröffentlichter Eintrag ist schon darüber hinaus.} other {# veröffentlichte Einträge sind schon darüber hinaus.}}", + past: "{count, plural, =0 {Noch kein veröffentlichter Eintrag hat das Datum überschritten.} one {# veröffentlichter Eintrag hat das Datum schon überschritten.} other {# veröffentlichte Einträge haben das Datum schon überschritten.}}", save: "Ablauf speichern", saved: "Ablauf gespeichert", gatesUnsupported: diff --git a/apps/studio/src/i18n/lazy/listings.fr.ts b/apps/studio/src/i18n/lazy/listings.fr.ts index 9308c1a3..f88d8d57 100644 --- a/apps/studio/src/i18n/lazy/listings.fr.ts +++ b/apps/studio/src/i18n/lazy/listings.fr.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): fr `listings.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: a42c0843d9a6c4ae +// hash: b03531cab550f6ae import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"listings"> = { @@ -99,7 +99,7 @@ export const messages: NamespaceMessages<"listings"> = { constant: "Valeur fixe de {path}", currencyHint: "Un code de devise à trois lettres, comme EUR.", issues: { - unknown_path: "Ce type n’a pas de telle propriété.", + unknown_path: "Ce type n’a pas cette propriété.", unknown_field: "Ce champ n’existe plus.", source_mismatch: "Cette valeur ne convient pas à la propriété.", vocabulary: @@ -161,9 +161,9 @@ export const messages: NamespaceMessages<"listings"> = { eq: "est", ne: "n’est pas", lt: "{kind, select, time {est avant} number {est inférieur à} other {est inférieur à}}", - lte: "{kind, select, time {est le ou avant} number {est au plus} other {est au plus}}", + lte: "{kind, select, time {est antérieur ou égal à} number {est au plus} other {est au plus}}", gt: "{kind, select, time {est après} number {est supérieur à} other {est supérieur à}}", - gte: "{kind, select, time {est le ou après} number {est au moins} other {est au moins}}", + gte: "{kind, select, time {est postérieur ou égal à} number {est au moins} other {est au moins}}", in: "est l’un de", set: "a une valeur", unset: "est vide", diff --git a/apps/studio/src/i18n/lazy/listings.id.ts b/apps/studio/src/i18n/lazy/listings.id.ts index eada2b07..9afbbe85 100644 --- a/apps/studio/src/i18n/lazy/listings.id.ts +++ b/apps/studio/src/i18n/lazy/listings.id.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): id `listings.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 76038f3da0dc9b93 +// hash: cab7c8322e20b656 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"listings"> = { @@ -15,7 +15,7 @@ export const messages: NamespaceMessages<"listings"> = { emptyDescription: "Pilih kolom untuk menampilkannya sebagai kolom tabel dan memfilter daftar berdasarkan kolom itu.", noFields: "Tambahkan kolom ke koleksi ini terlebih dahulu; kolom daftar dipilih dari situ.", - full: "Sudah 4 kolom, jumlah maksimum yang bisa didaftarkan koleksi.", + full: "Sudah 4 kolom, jumlah maksimum untuk satu koleksi.", moveUp: "Pindahkan {label} ke atas", moveDown: "Pindahkan {label} ke bawah", remove: "Hapus {label}", diff --git a/apps/studio/src/i18n/lazy/listings.it.ts b/apps/studio/src/i18n/lazy/listings.it.ts index 3a74a879..e9c3304b 100644 --- a/apps/studio/src/i18n/lazy/listings.it.ts +++ b/apps/studio/src/i18n/lazy/listings.it.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): it `listings.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 6a2e75f60fd32107 +// hash: 54aa053c5c6fe105 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"listings"> = { @@ -39,7 +39,7 @@ export const messages: NamespaceMessages<"listings"> = { noDateFields: "Questa raccolta non ha campi data o data e ora. Aggiungine uno per usare la scadenza.", action: "Quando una voce è terminata", - unlist: "Esci dagli elenchi", + unlist: "Togli dagli elenchi", unlistDescription: "La sua pagina resta al suo indirizzo, ma esce da elenchi, sezioni elenco di contenuti, feed, sitemap e ricerca. Adatto a eventi e offerte di lavoro.", hide: "Nascondi la pagina", diff --git a/apps/studio/src/i18n/lazy/listings.ko.ts b/apps/studio/src/i18n/lazy/listings.ko.ts index 928f9d01..72ae76fa 100644 --- a/apps/studio/src/i18n/lazy/listings.ko.ts +++ b/apps/studio/src/i18n/lazy/listings.ko.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): ko `listings.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 5b83e3d79977cdab +// hash: 844782a4e2d7a75f import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"listings"> = { @@ -20,7 +20,7 @@ export const messages: NamespaceMessages<"listings"> = { remove: "{label} 삭제", sortable: "정렬 가능", save: "목록 필드 저장", - saved: "목록 필드를 저장했습니다", + saved: "목록 필드를 저장했어요", inUse: "뺀 필드로 아직 필터링하거나 정렬하는 콘텐츠 목록 섹션이 있어요. 먼저 다음 페이지를 변경하세요:", }, @@ -46,7 +46,7 @@ export const messages: NamespaceMessages<"listings"> = { graceHint: "날짜가 지난 뒤 항목이 종료되기 전까지 이만큼 기다려요. 최대 10,080(1주).", past: "{count, plural, =0 {아직 기한이 지난 게시 항목이 없어요.} other {게시된 항목 #개가 이미 기한이 지났어요.}}", save: "만료 저장", - saved: "만료를 저장했습니다", + saved: "만료를 저장했어요", gatesUnsupported: "이 사이트의 라이브 서버는 아직 만료를 적용하지 않아요. 먼저 사이트를 배포한 다음 만료를 다시 저장하세요.", }, @@ -122,12 +122,12 @@ export const messages: NamespaceMessages<"listings"> = { noDocument: "이 항목의 페이지는 이 유형의 구조화된 데이터를 출력하지 않아요.", richResults: "Google 리치 결과 테스트(Rich Results Test)에서 확인", save: "구조화된 데이터 저장", - saved: "구조화된 데이터를 저장했습니다", + saved: "구조화된 데이터를 저장했어요", }, createPage: { action: "목록 페이지 만들기", open: "목록 페이지 열기", - created: "목록 페이지를 만들었습니다", + created: "목록 페이지를 만들었어요", exists: "{path}에 이미 페이지가 있어요.", }, filters: { diff --git a/apps/studio/src/i18n/lazy/listings.pl.ts b/apps/studio/src/i18n/lazy/listings.pl.ts index f4b6d52d..27c08b8e 100644 --- a/apps/studio/src/i18n/lazy/listings.pl.ts +++ b/apps/studio/src/i18n/lazy/listings.pl.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): pl `listings.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: c3551ca488b1d858 +// hash: 8ba47e10541918ed import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"listings"> = { @@ -36,7 +36,7 @@ export const messages: NamespaceMessages<"listings"> = { noDateFields: "Ta kolekcja nie ma pola daty ani daty i godziny. Dodaj je, aby używać wygaśnięcia.", action: "Gdy wpis się zakończy", - unlist: "Zniknij z list", + unlist: "Usuń z list", unlistDescription: "Jego strona zostaje pod swoim adresem, ale znika z list, sekcji listy treści, kanałów, mapy witryny i wyszukiwania. Dobre dla wydarzeń i ofert pracy.", hide: "Ukryj stronę", diff --git a/apps/studio/src/i18n/lazy/oauthConsent.ar.ts b/apps/studio/src/i18n/lazy/oauthConsent.ar.ts index 35236550..646f8efe 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.ar.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.ar.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): ar `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: c7bc7dea9efce92e +// hash: 377c2039aeceac49 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { @@ -22,7 +22,7 @@ export const messages: NamespaceMessages<"oauthConsent"> = { "يشبه الاسم {client}، لكن أي أحد يمكنه تسجيل عميل بأي اسم. وافق فقط إذا بدأت هذا الاتصال من {client} بنفسك وكان العنوان الذي يعيدك إليه، المعروض أعلاه، هو الذي يستخدمه.", sendsBack: "يعيدك إلى {host}", thisComputer: "يعيدك إلى تطبيق على هذا الحاسوب", - thisComputerApp: "يعيدك إلى تطبيق على هذا الكمبيوتر ({scheme}:)", + thisComputerApp: "يعيدك إلى تطبيق على هذا الحاسوب ({scheme}:)", loopbackWarning: "كل عنوان يمكن لهذا الوكيل أن يعيدك إليه موجود على هذا الحاسوب. وافق فقط إذا بدأت الاتصال من تطبيق هنا.", stepUp: "هذا الوكيل متصل بالفعل ويطلب المزيد. ما يُسمح له به اليوم محدَّد.", diff --git a/apps/studio/src/i18n/lazy/oauthConsent.de.ts b/apps/studio/src/i18n/lazy/oauthConsent.de.ts index 18d9a3de..8ac0cc7a 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.de.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.de.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): de `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: d3fc2f9b7d88dce0 +// hash: fa4eaf7de7921690 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { @@ -20,7 +20,7 @@ export const messages: NamespaceMessages<"oauthConsent"> = { registered: "In diesem Studio registriert", selfRegistered: "Selbst registriert, nicht geprüft", lookalike: - "Der Name sieht nach {client} aus, aber jeder kann einen Client unter beliebigem Namen registrieren. Stimme nur zu, wenn du diese Verbindung selbst aus {client} gestartet hast und die Adresse, zu der sie dich zurückschickt (oben), die ist, die es verwendet.", + "Der Name sieht nach {client} aus, aber jeder kann einen Client unter beliebigem Namen registrieren. Stimme nur zu, wenn du diese Verbindung selbst aus {client} gestartet hast und die oben angezeigte Adresse, zu der sie dich zurückschickt, die ist, die {client} verwendet.", sendsBack: "Leitet dich zurück zu {host}", thisComputer: "Leitet dich zurück zu einer App auf diesem Computer", thisComputerApp: "Schickt dich zu einer App auf diesem Computer zurück ({scheme}:)", diff --git a/apps/studio/src/i18n/lazy/oauthConsent.fa.ts b/apps/studio/src/i18n/lazy/oauthConsent.fa.ts index b89202b8..41a8b544 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.fa.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.fa.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): fa `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 14b933da3ad6923c +// hash: aba42bff951a5318 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { @@ -20,10 +20,10 @@ export const messages: NamespaceMessages<"oauthConsent"> = { registered: "ثبت‌شده در این Studio", selfRegistered: "خودثبت‌شده، تأییدنشده", lookalike: - "این نام شبیه {client} است، اما هر کسی می‌تواند کلاینتی با هر نامی ثبت کند. فقط وقتی تأیید کن که خودت این اتصال را از {client} شروع کرده‌ای و نشانی‌ای که تو را به آن برمی‌گرداند (بالا) همان نشانی‌ای است که استفاده می‌کند.", + "این نام شبیه {client} است، اما هر کسی می‌تواند کلاینتی با هر نامی ثبت کند. فقط وقتی تأیید کنید که خودتان این اتصال را از {client} شروع کرده‌اید و نشانی‌ای که شما را به آن برمی‌گرداند (در بالا) همان نشانی‌ای است که آن برنامه استفاده می‌کند.", sendsBack: "شما را به {host} برمی‌گرداند", thisComputer: "شما را به برنامه‌ای در این رایانه برمی‌گرداند", - thisComputerApp: "تو را به برنامه‌ای روی این رایانه برمی‌گرداند ({scheme}:)", + thisComputerApp: "شما را به برنامه‌ای در این رایانه برمی‌گرداند ({scheme}:)", loopbackWarning: "همهٔ نشانی‌هایی که این عامل می‌تواند شما را به آن‌ها برگرداند روی این رایانه است. فقط اگر اتصال را از برنامه‌ای در همین‌جا شروع کرده‌اید تأیید کنید.", stepUp: diff --git a/apps/studio/src/i18n/lazy/oauthConsent.fr.ts b/apps/studio/src/i18n/lazy/oauthConsent.fr.ts index 3735b966..ad5fadaa 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.fr.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.fr.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): fr `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 89c891ee68bf3306 +// hash: 9b68aac5af95f4ef import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { @@ -18,9 +18,9 @@ export const messages: NamespaceMessages<"oauthConsent"> = { title: "Qui le demande", fromHost: "Identifié par {host}", registered: "Enregistré dans ce Studio", - selfRegistered: "Auto-inscrit, non vérifié", + selfRegistered: "Auto-enregistré, non vérifié", lookalike: - "Le nom ressemble à {client}, mais n’importe qui peut inscrire un client sous n’importe quel nom. N’approuvez que si vous avez lancé vous-même cette connexion depuis {client} et que l’adresse vers laquelle elle vous renvoie, indiquée ci-dessus, est celle qu’il utilise.", + "Le nom ressemble à {client}, mais n’importe qui peut enregistrer un client sous n’importe quel nom. N’approuvez que si vous avez lancé vous-même cette connexion depuis {client} et que l’adresse vers laquelle elle vous renvoie, indiquée ci-dessus, est celle qu’il utilise.", sendsBack: "Vous renvoie vers {host}", thisComputer: "Vous renvoie vers une application de cet ordinateur", thisComputerApp: "Vous renvoie vers une application de cet ordinateur ({scheme}:)", diff --git a/apps/studio/src/i18n/lazy/oauthConsent.he.ts b/apps/studio/src/i18n/lazy/oauthConsent.he.ts index 37bbe1d2..219591a5 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.he.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.he.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): he `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 3f94b9b19b92115e +// hash: 368c941976afcd47 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { @@ -19,7 +19,7 @@ export const messages: NamespaceMessages<"oauthConsent"> = { registered: "רשום ב-Studio הזה", selfRegistered: "נרשם בעצמו, לא מאומת", lookalike: - "השם נראה כמו {client}, אבל כל אחד יכול לרשום לקוח בכל שם. אשר רק אם אתה התחלת את החיבור הזה מ-{client} והכתובת שאליה הוא מחזיר אותך, המוצגת למעלה, היא זו שהוא משתמש בה.", + "השם נראה כמו {client}, אבל כל אחד יכול לרשום לקוח בכל שם. יש לאשר רק אם התחלת בעצמך את החיבור הזה מ-{client} והכתובת שאליה הוא מחזיר אותך, המוצגת למעלה, היא זו שהוא משתמש בה.", sendsBack: "יחזיר אותך אל {host}", thisComputer: "יחזיר אותך לאפליקציה במחשב הזה", thisComputerApp: "מחזיר אותך לאפליקציה במחשב הזה ({scheme}:)", diff --git a/apps/studio/src/i18n/lazy/oauthConsent.hi.ts b/apps/studio/src/i18n/lazy/oauthConsent.hi.ts index 6f143391..7daa2e8c 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.hi.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.hi.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): hi `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: ca9d9114af0b5c08 +// hash: 9049492067429cc0 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { @@ -20,7 +20,7 @@ export const messages: NamespaceMessages<"oauthConsent"> = { registered: "इस Studio में रजिस्टर्ड", selfRegistered: "स्वयं पंजीकृत, सत्यापित नहीं", lookalike: - "यह नाम {client} जैसा दिखता है, लेकिन कोई भी किसी भी नाम से क्लाइंट पंजीकृत कर सकता है। केवल तभी स्वीकृत करें जब आपने यह कनेक्शन खुद {client} से शुरू किया हो और ऊपर दिखाया गया वापसी पता वही हो जिसका वह उपयोग करता है।", + "यह नाम {client} जैसा दिखता है, लेकिन कोई भी किसी भी नाम से क्लाइंट पंजीकृत कर सकता है। केवल तभी मंज़ूर करें जब आपने यह कनेक्शन खुद {client} से शुरू किया हो और ऊपर दिखाया गया वापसी पता वही हो जिसका वह उपयोग करता है।", sendsBack: "आपको {host} पर वापस भेजता है", thisComputer: "आपको इस कंप्यूटर के किसी ऐप पर वापस भेजता है", thisComputerApp: "आपको इस कंप्यूटर के एक ऐप पर वापस भेजता है ({scheme}:)", diff --git a/apps/studio/src/i18n/lazy/oauthConsent.id.ts b/apps/studio/src/i18n/lazy/oauthConsent.id.ts index 56ab642f..fd38951c 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.id.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.id.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): id `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: c54a2392a96c5282 +// hash: 4044d405d9b135b2 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { @@ -18,14 +18,14 @@ export const messages: NamespaceMessages<"oauthConsent"> = { title: "Siapa yang meminta", fromHost: "Diidentifikasi oleh {host}", registered: "Terdaftar di Studio ini", - selfRegistered: "Terdaftar sendiri, belum diverifikasi", + selfRegistered: "Terdaftar sendiri, tidak terverifikasi", lookalike: - "Namanya mirip {client}, tetapi siapa pun bisa mendaftarkan klien dengan nama apa pun. Setujui hanya jika kamu sendiri memulai koneksi ini dari {client} dan alamat tujuan kembali yang ditampilkan di atas adalah yang dipakainya.", + "Namanya mirip {client}, tetapi siapa pun bisa mendaftarkan klien dengan nama apa pun. Setujui hanya jika Anda sendiri memulai koneksi ini dari {client} dan alamat tujuan kembali yang ditampilkan di atas adalah yang dipakainya.", sendsBack: "Mengembalikan Anda ke {host}", thisComputer: "Mengembalikan Anda ke aplikasi di komputer ini", - thisComputerApp: "Mengembalikanmu ke aplikasi di komputer ini ({scheme}:)", + thisComputerApp: "Mengembalikan Anda ke aplikasi di komputer ini ({scheme}:)", loopbackWarning: - "Setiap alamat tujuan agen ini mengembalikan Anda ada di komputer ini. Setujui hanya jika Anda memulai koneksi dari aplikasi di sini.", + "Setiap alamat tempat agen ini dapat mengembalikan Anda ada di komputer ini. Setujui hanya jika Anda memulai koneksi dari aplikasi di sini.", stepUp: "Agen ini sudah terhubung dan meminta lebih. Yang boleh dilakukannya saat ini sudah dicentang.", }, diff --git a/apps/studio/src/i18n/lazy/oauthConsent.ko.ts b/apps/studio/src/i18n/lazy/oauthConsent.ko.ts index 2cf86260..2669aeab 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.ko.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.ko.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): ko `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 46d4ba78d2e9409c +// hash: 69cd9d0742ee6f0b import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { @@ -8,11 +8,11 @@ export const messages: NamespaceMessages<"oauthConsent"> = { title: "{client} 연결", titleFrom: "{host}: {client} 연결", description: - "에이전트가 이 Studio에서 나를 대신해 일하겠다고 요청합니다. 승인하기 전에 할 수 있는 일을 확인하세요.", + "에이전트가 이 Studio에서 나를 대신해 일하겠다고 요청해요. 승인하기 전에 할 수 있는 일을 확인하세요.", invalid: { - title: "이 요청은 사용할 수 없습니다", + title: "이 요청은 사용할 수 없어요", description: - "만료되었거나 이미 응답했거나 도중에 변경되었습니다. 에이전트에서 연결을 다시 시작하세요.", + "만료되었거나 이미 응답했거나 도중에 변경되었어요. 에이전트에서 연결을 다시 시작하세요.", }, who: { title: "요청한 곳", @@ -20,31 +20,31 @@ export const messages: NamespaceMessages<"oauthConsent"> = { registered: "이 Studio에 등록됨", selfRegistered: "자체 등록됨, 확인되지 않음", lookalike: - "이름이 {client}처럼 보이지만 누구나 어떤 이름으로든 클라이언트를 등록할 수 있습니다. 직접 {client}에서 이 연결을 시작했고 위에 표시된 돌아갈 주소가 그 클라이언트가 쓰는 주소일 때만 승인하세요.", - sendsBack: "{host}(으)로 돌아갑니다", - thisComputer: "이 컴퓨터의 앱으로 돌아갑니다", - thisComputerApp: "이 컴퓨터의 앱으로 돌아갑니다 ({scheme}:)", + "이름이 {client}처럼 보이지만 누구나 어떤 이름으로든 클라이언트를 등록할 수 있어요. 직접 {client}에서 이 연결을 시작했고 위에 표시된 돌아갈 주소가 그 클라이언트가 쓰는 주소일 때만 승인하세요.", + sendsBack: "{host}(으)로 돌아가요", + thisComputer: "이 컴퓨터의 앱으로 돌아가요", + thisComputerApp: "이 컴퓨터의 앱으로 돌아가요 ({scheme}:)", loopbackWarning: - "이 에이전트가 돌려보낼 수 있는 주소는 모두 이 컴퓨터에 있습니다. 이 컴퓨터의 앱에서 연결을 시작한 경우에만 승인하세요.", + "이 에이전트가 돌려보낼 수 있는 주소는 모두 이 컴퓨터에 있어요. 이 컴퓨터의 앱에서 연결을 시작한 경우에만 승인하세요.", stepUp: - "이 에이전트는 이미 연결되어 있으며 더 많은 권한을 요청합니다. 지금 할 수 있는 일은 체크되어 있습니다.", + "이 에이전트는 이미 연결되어 있으며 더 많은 권한을 요청해요. 지금 할 수 있는 일은 체크되어 있어요.", }, scopes: { title: "할 수 있는 일", description: - "하지 말아야 할 일은 체크를 해제하세요. 나머지는 내 역할이 정하며, 역할이 주지 않는 것은 제외됩니다.", + "하지 말아야 할 일은 체크를 해제하세요. 나머지는 내 역할이 정하며, 역할이 주지 않는 것은 제외돼요.", legend: "권한", notInRole: "{label} (내 역할에 없음)", narrowed: "{label}, 내 역할에서 내 작업에만 ({scope})", added: "{label} (새 권한)", offline: - "연결이 취소되거나 내 접근 권한이 끝날 때까지, 최대 90일 동안 연결된 상태로 남아 접근 권한을 스스로 갱신합니다.", - sites: "{count, plural, other {내가 작업하는 사이트 #개에만 접근합니다.}}", + "연결이 취소되거나 내 접근 권한이 끝날 때까지, 최대 90일 동안 연결된 상태로 남아 접근 권한을 스스로 갱신해요.", + sites: "{count, plural, other {내가 작업하는 사이트 #개에만 접근해요.}}", none: "권한을 하나 이상 선택하세요.", }, mode: { title: "작동 방식", - description: "에이전트가 얼마나 독립적으로 일할 수 있는지. 나중에 바꿀 수 있습니다.", + description: "에이전트가 얼마나 독립적으로 일할 수 있는지 정해요. 나중에 바꿀 수 있어요.", legend: "에이전트 모드", }, approve: "승인", diff --git a/apps/studio/src/i18n/lazy/oauthConsent.nl.ts b/apps/studio/src/i18n/lazy/oauthConsent.nl.ts index 9975a91e..29ff5352 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.nl.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.nl.ts @@ -1,11 +1,11 @@ // Generated by `pnpm i18n:import` (ADR-0034): nl `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 7ff408a54a6c971a +// hash: 7785aacf06975b6a import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { oauthConsent: { - title: "{client} verbinden", + title: "{client} koppelen", titleFrom: "{host}: {client} koppelen", description: "Een agent vraagt om voor je in deze Studio te werken. Controleer wat hij mag voordat je goedkeurt.", @@ -20,7 +20,7 @@ export const messages: NamespaceMessages<"oauthConsent"> = { registered: "Geregistreerd bij deze Studio", selfRegistered: "Zelf geregistreerd, niet geverifieerd", lookalike: - "De naam lijkt op {client}, maar iedereen kan een client onder elke naam registreren. Keur alleen goed als je deze verbinding zelf vanuit {client} hebt gestart en het adres waarnaar ze je terugstuurt, hierboven, het adres is dat het gebruikt.", + "De naam lijkt op {client}, maar iedereen kan een client onder welke naam dan ook registreren. Keur alleen goed als je deze verbinding zelf vanuit {client} hebt gestart en het adres waarnaar je wordt teruggestuurd (hierboven vermeld) het adres is dat {client} gebruikt.", sendsBack: "Stuurt je terug naar {host}", thisComputer: "Stuurt je terug naar een app op deze computer", thisComputerApp: "Stuurt je terug naar een app op deze computer ({scheme}:)", diff --git a/apps/studio/src/i18n/lazy/oauthConsent.pl.ts b/apps/studio/src/i18n/lazy/oauthConsent.pl.ts index 66818ed7..1cf8fe45 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.pl.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.pl.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): pl `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: aa6ae745d3f932f5 +// hash: 49bf0ff53341aad0 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { @@ -25,14 +25,14 @@ export const messages: NamespaceMessages<"oauthConsent"> = { thisComputer: "Odeśle cię do aplikacji na tym komputerze", thisComputerApp: "Odsyła cię do aplikacji na tym komputerze ({scheme}:)", loopbackWarning: - "Każdy adres, do którego ten agent może cię odesłać, jest na tym komputerze. Zatwierdź tylko wtedy, gdy połączenie rozpoczęła aplikacja na tym komputerze.", + "Każdy adres, do którego ten agent może cię odesłać, jest na tym komputerze. Zatwierdź tylko wtedy, gdy to ty rozpocząłeś połączenie z aplikacji na tym komputerze.", stepUp: "Ten agent jest już połączony i prosi o więcej. To, co może dziś robić, jest zaznaczone.", }, scopes: { title: "Co może robić", description: - "Odznacz to, czego nie powinien robić. Resztę decyduje twoja rola: czego nie daje, zostaje pominięte.", + "Odznacz to, czego nie powinien robić. O reszcie decyduje twoja rola: to, czego ona nie daje, zostaje pominięte.", legend: "Uprawnienia", notInRole: "{label} (poza twoją rolą)", narrowed: "{label}, tylko do twojej własnej pracy w twojej roli ({scope})", diff --git a/apps/studio/src/i18n/lazy/oauthConsent.ru.ts b/apps/studio/src/i18n/lazy/oauthConsent.ru.ts index 271decdb..d04e0526 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.ru.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.ru.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): ru `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: df5de542275cbd08 +// hash: b7a20e36eca9b9bb import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { @@ -18,14 +18,14 @@ export const messages: NamespaceMessages<"oauthConsent"> = { title: "Кто просит", fromHost: "Идентифицирован через {host}", registered: "Зарегистрирован в этом Studio", - selfRegistered: "Зарегистрирован сам, не проверен", + selfRegistered: "Зарегистрировался сам, не проверен", lookalike: - "Название похоже на {client}, но кто угодно может зарегистрировать клиента под любым именем. Одобряйте, только если вы сами начали это подключение из {client} и адрес возврата, указанный выше, — тот, который он использует.", + "Название похоже на {client}, но кто угодно может зарегистрировать клиента под любым именем. Разрешайте, только если вы сами начали это подключение из {client} и адрес возврата, указанный выше, — тот, который он использует.", sendsBack: "Вернёт вас на {host}", thisComputer: "Вернёт вас в приложение на этом компьютере", thisComputerApp: "Возвращает вас в приложение на этом компьютере ({scheme}:)", loopbackWarning: - "Все адреса, на которые этот агент может вас вернуть, находятся на этом компьютере. Разрешайте, только если подключение начато из приложения здесь.", + "Все адреса, на которые этот агент может вас вернуть, находятся на этом компьютере. Разрешайте, только если вы сами начали подключение из приложения здесь.", stepUp: "Этот агент уже подключён и просит больше. То, что ему можно сейчас, отмечено.", }, scopes: { diff --git a/apps/studio/src/i18n/lazy/oauthConsent.uk.ts b/apps/studio/src/i18n/lazy/oauthConsent.uk.ts index b3b13b80..4c8ea4c0 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.uk.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.uk.ts @@ -1,12 +1,12 @@ // Generated by `pnpm i18n:import` (ADR-0034): uk `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 0a57d72b191bd1f8 +// hash: 099341292ec10f44 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { oauthConsent: { title: "Під'єднати {client}", - titleFrom: "{host}: підключити {client}", + titleFrom: "{host}: під'єднати {client}", description: "Агент просить працювати в цьому Studio від вашого імені. Перевірте, що йому можна, перш ніж дозволити.", invalid: { @@ -18,14 +18,14 @@ export const messages: NamespaceMessages<"oauthConsent"> = { title: "Хто просить", fromHost: "Ідентифікований через {host}", registered: "Зареєстрований у цьому Studio", - selfRegistered: "Зареєстрований сам, не перевірений", + selfRegistered: "Зареєструвався сам, не перевірений", lookalike: - "Назва схожа на {client}, але будь-хто може зареєструвати клієнта під будь-якою назвою. Схвалюйте, лише якщо ви самі почали це підключення з {client} і адреса повернення, показана вище, — та, яку він використовує.", + "Назва схожа на {client}, але будь-хто може зареєструвати клієнта під будь-якою назвою. Дозволяйте, лише якщо ви самі почали це під'єднання з {client} і адреса повернення, показана вище, — та, яку він використовує.", sendsBack: "Поверне вас на {host}", thisComputer: "Поверне вас у застосунок на цьому комп'ютері", thisComputerApp: "Повертає вас до застосунку на цьому комп’ютері ({scheme}:)", loopbackWarning: - "Усі адреси, на які цей агент може вас повернути, на цьому комп'ютері. Дозволяйте, лише якщо під'єднання почато із застосунку тут.", + "Усі адреси, на які цей агент може вас повернути, на цьому комп'ютері. Дозволяйте, лише якщо ви самі почали під'єднання із застосунку тут.", stepUp: "Цей агент уже під'єднаний і просить більше. Те, що йому можна зараз, позначено.", }, scopes: { diff --git a/apps/studio/src/i18n/lazy/oauthConsent.zh-Hans.ts b/apps/studio/src/i18n/lazy/oauthConsent.zh-Hans.ts index a6d2a43b..4a33a663 100644 --- a/apps/studio/src/i18n/lazy/oauthConsent.zh-Hans.ts +++ b/apps/studio/src/i18n/lazy/oauthConsent.zh-Hans.ts @@ -1,16 +1,16 @@ // Generated by `pnpm i18n:import` (ADR-0034): zh-Hans `oauthConsent.*` messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: c6ec3e4e73790371 +// hash: e61a207f2d227888 import type { NamespaceMessages } from "../namespaces.ts"; export const messages: NamespaceMessages<"oauthConsent"> = { oauthConsent: { title: "连接 {client}", titleFrom: "{host}:连接 {client}", - description: "有个代理请求代表你在这个 Studio 中工作。批准前请先查看它可以做什么。", + description: "有个智能体请求代表你在这个 Studio 中工作。批准前请先查看它可以做什么。", invalid: { title: "无法使用此请求", - description: "它已过期、已被处理,或在传递途中被更改。请从代理重新发起连接。", + description: "它已过期、已被处理,或在传递途中被更改。请从智能体重新发起连接。", }, who: { title: "谁在请求", @@ -23,8 +23,8 @@ export const messages: NamespaceMessages<"oauthConsent"> = { thisComputer: "会把你送回这台电脑上的应用", thisComputerApp: "将你送回这台电脑上的应用({scheme}:)", loopbackWarning: - "这个代理能把你送回的所有地址都在这台电脑上。只有当你是从这里的应用发起连接时才批准。", - stepUp: "这个代理已经连接,现在请求更多权限。它目前能做的已勾选。", + "这个智能体能把你送回的所有地址都在这台电脑上。只有当你是从这里的应用发起连接时才批准。", + stepUp: "这个智能体已经连接,现在请求更多权限。它目前能做的已勾选。", }, scopes: { title: "它可以做什么", @@ -39,8 +39,8 @@ export const messages: NamespaceMessages<"oauthConsent"> = { }, mode: { title: "工作方式", - description: "代理可以多大程度上独立工作。之后可以更改。", - legend: "代理模式", + description: "智能体可以多大程度上独立工作。之后可以更改。", + legend: "智能体模式", }, approve: "批准", deny: "拒绝", diff --git a/apps/studio/src/i18n/tr.ts b/apps/studio/src/i18n/tr.ts index 928ae062..55d87ec6 100644 --- a/apps/studio/src/i18n/tr.ts +++ b/apps/studio/src/i18n/tr.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): tr core messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 4ac5258269d4a6a1 +// hash: 9463aa68810503b7 import type { Messages } from "./en.ts"; export const messages: Messages = { @@ -758,7 +758,7 @@ export const messages: Messages = { noMatches: "“{query}” ile eşleşen anahtar yok", notEnabledTitle: "Bu sunucu agent anahtarı veremiyor", notEnabledDescription: - "Sunucu oturum açma olmadan çalışıyor, bu yüzden anahtar üretemez. Kendi bilgisayarındaki agent'lar yine de cloudhal mcp ile stdio üzerinden bağlanabilir.", + "Sunucu giriş olmadan çalışıyor, bu yüzden anahtar üretemez. Kendi bilgisayarındaki agent'lar yine de cloudhal mcp ile stdio üzerinden bağlanabilir.", copyId: "Anahtar kimliğini kopyala", revoke: "İptal et", revokeKey: "Anahtarı iptal et", @@ -1261,7 +1261,7 @@ export const messages: Messages = { agentKeys: "Agent'lar ve CI işleri oluşturduğun anahtarlarla giriş yapar.", mcp: "Agent'lar /mcp adresinden bağlanır.", mcpOauth: - "Bu Studio'ya kayıtlı MCP istemcileri /mcp adresinde OAuth ile oturum açar; her bağlantıyı sen onaylarsın.", + "Bu Studio'ya kayıtlı MCP istemcileri /mcp adresinde OAuth ile giriş yapar; her bağlantıyı sen onaylarsın.", activity: "Her araç çağrısı site bazında kaydedilir.", previewLinks: "Dağıtılmış sitede taslakları gösteren imzalı bağlantılar.", deployTransfer: "cloudhal push ve pull bu sunucuya ulaşabilir.", diff --git a/docs/guides/translations-weblate.md b/docs/guides/translations-weblate.md index 844bd7e4..5bb5b534 100644 --- a/docs/guides/translations-weblate.md +++ b/docs/guides/translations-weblate.md @@ -51,3 +51,154 @@ Turn on **reviews** (translated → approved), so "approved by a reviewer" is wh ## 5. Not in scope yet Visitor-facing strings (themes, privacy notices on sites) are not on Weblate yet (ADR-0034). + +## 6. Glossary of coined terms + +Studio coins a few terms of its own (issue #112). Each language should use one rendering for each, so drafts and reviewers stay consistent. The table is the rendering the catalogs use after the QA pass of November 2026 ([docs/i18n-review/qa-2026-11.md](../i18n-review/qa-2026-11.md)), normally the majority form in that language's Studio. It holds within the reviewed namespaces (the pass's 494 keys); elsewhere the pass only searched for the variant forms it had found and fixed the clear cases, and the report lists the strings it left ("Outside the 494 keys"). Other catalogs may still use older terms: when you find one, align it. Reviewers may change a term: change it in every key that uses it, and in this table, in the same PR. On Weblate, these rows go into the project glossary. + +General rules for every language: + +- Product and technical names stay as they are: Cloudhal, Studio, MCP, OAuth, URL, JSON, Markdown, Snapshot, Release, SEO, sitemap.xml, file paths, environment variables and CLI flags. +- Names of buttons in other apps (Claude's *Settings* and *Connectors*, Claude Code's *Authenticate*, MCP Inspector's *Streamable HTTP* and *Quick OAuth Flow*) stay in English unless that app is localized in your language. +- Studio uses the language's usual UI register throughout, and one register per language: informal where Studio already is (Turkish *sen*, German *du*, Spanish *tú*, Korean 해요체), formal where it already is (French *vous*, Indonesian *Anda*, Persian *شما*). Hebrew uses gender-neutral forms (plural or impersonal imperatives). The status pages are read by site visitors: neutral public register. +- Turkish says *giriş yap* for sign in, never *oturum aç*, and *çıkış yap* for signing out of Studio; *oturumu kapat* (close the session) remains in the session list and the invite page (left for the owner, see the report). + +### Content + +| Language | collection | entry | field | listing fields | structured data | +|---|---|---|---|---|---| +| `tr` | koleksiyon | kayıt | alan | liste alanları | yapılandırılmış veri | +| `de` | Sammlung | Eintrag | Feld | Listenfelder | strukturierte Daten | +| `es` | colección | entrada | campo | campos de listado | datos estructurados | +| `fr` | collection | entrée | champ | champs de liste | données structurées | +| `it` | raccolta | voce | campo | campi di elenco | dati strutturati | +| `pt-BR` | coleção | entrada | campo | campos de listagem | dados estruturados | +| `nl` | collectie | item | veld | lijstvelden | gestructureerde gegevens | +| `pl` | kolekcja | wpis | pole | pola list | dane strukturalne | +| `ru` | коллекция | запись | поле | поля списков | структурированные данные | +| `uk` | колекція | запис | поле | поля списків | структуровані дані | +| `ja` | コレクション | エントリー | フィールド | リスト用フィールド | 構造化データ | +| `ko` | 컬렉션 | 항목 | 필드 | 목록 필드 | 구조화된 데이터 | +| `zh-Hans` | 集合 | 条目 | 字段 | 列表字段 | 结构化数据 | +| `hi` | संग्रह | एंट्री | फ़ील्ड | लिस्टिंग फ़ील्ड | स्ट्रक्चर्ड डेटा | +| `id` | Koleksi | Entri | Kolom | Kolom daftar | Data terstruktur | +| `ar` | المجموعة | الإدخال | الحقل | حقول القوائم | البيانات المنظمة | +| `fa` | مجموعه | ورودی | فیلد | فیلدهای فهرست | داده‌های ساختاریافته | +| `he` | אוסף | רשומה | שדה | שדות רשימה | נתונים מובנים | + +### Expiry + +The two actions must read as clearly different: *Leave lists* keeps the page at its address, *Hide the page* makes it answer “not found”. Write them as actions on the entry, never as an order to the reader (“leave the lists!”). + +| Language | expiry | Leave lists (unlist) | Hide the page (hide) | Ended (collection rule) | +|---|---|---|---|---| +| `tr` | sona erme | Listelerden çıkar | Sayfayı gizle | Sona erdi (koleksiyon kuralı) | +| `de` | Ablauf | Aus Listen nehmen | Seite ausblenden | Beendet (Sammlungsregel) | +| `es` | caducidad | Salir de las listas | Ocultar la página | Finalizada (regla de la colección) | +| `fr` | expiration | Retirer des listes | Masquer la page | Terminée (règle de la collection) | +| `it` | scadenza | Togli dagli elenchi | Nascondi la pagina | Terminata (regola della raccolta) | +| `pt-BR` | expiração | Sair das listas | Ocultar a página | Encerrada (regra da coleção) | +| `nl` | verloopdatum (regel: verloopregel) | Uit lijsten halen | Pagina verbergen | Beëindigd (collectieregel) | +| `pl` | wygaśnięcie | Usuń z list | Ukryj stronę | Zakończone (reguła kolekcji) | +| `ru` | истечение срока | Убрать из списков | Скрыть страницу | Завершено (правило коллекции) | +| `uk` | закінчення терміну | Прибрати зі списків | Сховати сторінку | Завершено (правило колекції) | +| `ja` | 有効期限 | リストから外す | ページを非表示にする | 終了(コレクションのルール) | +| `ko` | 만료 | 목록에서 제외 | 페이지 숨기기 | 종료됨(컬렉션 규칙) | +| `zh-Hans` | 到期 | 移出列表 | 隐藏页面 | 已结束(集合规则) | +| `hi` | समाप्ति | सूचियों से हटाएँ | पेज छिपाएँ | ख़त्म हुई (संग्रह का नियम) | +| `id` | Kedaluwarsa | Keluarkan dari daftar | Sembunyikan halaman | Berakhir (aturan koleksi) | +| `ar` | الانتهاء | الخروج من القوائم | إخفاء الصفحة | انتهى (قاعدة المجموعة) | +| `fa` | انقضا | خروج از فهرست‌ها | پنهان کردن صفحه | پایان‌یافته (قاعدهٔ مجموعه) | +| `he` | תפוגה | יציאה מרשימות | הסתרת העמוד | הסתיימה (כלל האוסף) | + +### Comparison operators + +`listings:contentList.ops.*`. Dates: *is before / is on or before / is after / is on or after*; numbers: *is less than / is at most / is greater than / is at least*. The date forms must also read with the value *Now*. + +| Language | dates | numbers | +|---|---|---| +| `tr` | öncesinde / aynı gün ya da öncesinde / sonrasında / aynı gün ya da sonrasında | küçüktür / en fazla / büyüktür / en az | +| `de` | liegt vor / liegt am oder vor / liegt nach / liegt am oder nach | ist kleiner als / ist höchstens / ist größer als / ist mindestens | +| `es` | es anterior a / es igual o anterior a / es posterior a / es igual o posterior a | es menor que / es como máximo / es mayor que / es como mínimo | +| `fr` | est avant / est antérieur ou égal à / est après / est postérieur ou égal à | est inférieur à / est au plus / est supérieur à / est au moins | +| `it` | è prima di / è entro / è dopo / è a partire da | è minore di / è al massimo / è maggiore di / è almeno | +| `pt-BR` | é antes de / é em ou antes de / é depois de / é em ou depois de | é menor que / é no máximo / é maior que / é no mínimo | +| `nl` | is vóór / is op of vóór / is na / is op of na | is kleiner dan / is hoogstens / is groter dan / is minstens | +| `pl` | jest przed / jest nie później niż / jest po / jest nie wcześniej niż | jest mniejsze niż / wynosi najwyżej / jest większe niż / wynosi co najmniej | +| `ru` | раньше / не позже / позже / не раньше | меньше / не больше / больше / не меньше | +| `uk` | раніше / не пізніше / пізніше / не раніше | менше / не більше / більше / не менше | +| `ja` | より前 / 以前 / より後 / 以降 | より小さい / 以下 / より大きい / 以上 | +| `ko` | 이전 / 당일 또는 이전 / 이후 / 당일 또는 이후 | 미만 / 이하 / 초과 / 이상 | +| `zh-Hans` | 早于 / 不晚于 / 晚于 / 不早于 | 小于 / 不大于 / 大于 / 不小于 | +| `hi` | से पहले है / को या उससे पहले है / के बाद है / को या उसके बाद है | से कम है / अधिकतम है / से ज़्यादा है / कम से कम है | +| `id` | sebelum / pada atau sebelum / setelah / pada atau setelah | kurang dari / paling banyak / lebih dari / paling sedikit | +| `ar` | قبل / في أو قبل / بعد / في أو بعد | أقل من / على الأكثر / أكثر من / على الأقل | +| `fa` | پیش از / در یا پیش از / پس از / در یا پس از | کمتر از / حداکثر / بیشتر از / حداقل | +| `he` | לפני / ב- או לפני / אחרי / ב- או אחרי | קטן מ / לכל היותר / גדול מ / לפחות | + +### Agents and identity + +Security wording: *not verified* stays a plain negation (not “not yet verified”), and *self-registered* says the app registered itself. + +| Language | connected agent | agent key | self-registered | not verified | setup link | +|---|---|---|---|---|---| +| `tr` | bağlı agent | agent anahtarı | kendini kaydetmiş | doğrulanmamış | kurulum bağlantısı | +| `de` | verbundener Agent (Plural: Agents) | Agent-Schlüssel | selbst registriert | nicht geprüft | Einrichtungslink | +| `es` | agente conectado | clave de agente | autorregistrado | sin verificar | enlace de configuración | +| `fr` | agent connecté | clé d’agent | auto-enregistré | non vérifié | lien de configuration | +| `it` | agente connesso / collegato | chiave agente | registrato da sé | non verificato | link di configurazione | +| `pt-BR` | agente conectado | chave de agente | autorregistrado | não verificado | link de configuração | +| `nl` | gekoppelde agent | agentsleutel | zelf geregistreerd | niet geverifieerd | installatielink | +| `pl` | połączony agent | klucz agenta | zarejestrowany samodzielnie | niezweryfikowany | link konfiguracyjny | +| `ru` | подключённый агент | ключ агента | зарегистрировался сам | не проверен | ссылка настройки | +| `uk` | під'єднаний агент | ключ агента | зареєструвався сам | не перевірений | посилання для налаштування | +| `ja` | 接続済みのエージェント | エージェントキー | 自己登録 | 未確認 | セットアップリンク | +| `ko` | 연결된 에이전트 | 에이전트 키 | 자체 등록됨 | 확인되지 않음 | 설정 링크 | +| `zh-Hans` | 已连接的智能体 | 智能体密钥 | 自行注册 | 未经验证 | 设置链接 | +| `hi` | कनेक्ट किए गए एजेंट | एजेंट कुंजी | स्वयं पंजीकृत | सत्यापित नहीं | सेटअप लिंक | +| `id` | Agen terhubung | kunci agen | Terdaftar sendiri | tidak terverifikasi | tautan penyiapan | +| `ar` | الوكلاء المتصلون | مفتاح وكيل | مسجّل ذاتيًا | غير مُتحقَّق منه | رابط الإعداد | +| `fa` | عامل متصل | کلید عامل | خودثبت‌شده | تأییدنشده | پیوند راه‌اندازی | +| `he` | סוכן מחובר | מפתח סוכן | נרשם בעצמו | לא מאומת | קישור ההגדרה | + +### Consent screen + +Use one verb for approve across the consent screen and the setup hints, the same as the Approve button. + +| Language | permissions (scopes) | agent mode | Approve | Deny | Disconnect | +|---|---|---|---|---|---| +| `tr` | izinler | agent modu | Onayla | Reddet | Bağlantıyı kes | +| `de` | Berechtigungen | Agent-Modus | zustimmen | ablehnen | trennen | +| `es` | permisos | modo del agente | aprobar | rechazar | desconectar | +| `fr` | autorisations | mode de l’agent | approuver | refuser | déconnecter | +| `it` | autorizzazioni | modalità dell’agente | Approva | Rifiuta | Scollega | +| `pt-BR` | permissões | modo do agente | Aprovar | Recusar | Desconectar | +| `nl` | rechten | agentmodus | Goedkeuren | Weigeren | Ontkoppelen | +| `pl` | uprawnienia | tryb agenta | Zatwierdź | Odrzuć | Odłącz | +| `ru` | разрешения | режим агента | Разрешить | Отклонить | Отключить | +| `uk` | дозволи | режим агента | Дозволити | Відхилити | Від'єднати | +| `ja` | 権限 | エージェントモード | 承認 | 拒否 | 接続を解除 | +| `ko` | 권한 | 에이전트 모드 | 승인 | 거부 | 연결 해제 | +| `zh-Hans` | 权限 | 智能体模式 | 批准 | 拒绝 | 断开连接 | +| `hi` | अनुमतियां | एजेंट मोड | मंज़ूर करें | अस्वीकार करें | डिस्कनेक्ट करें | +| `id` | Izin | Mode agen | Setujui | Tolak | Putuskan koneksi | +| `ar` | الأذونات | وضع الوكيل | موافقة | رفض | اقطع الاتصال | +| `fa` | مجوزها | حالت عامل | تأیید | رد | قطع اتصال | +| `he` | הרשאות | מצב הסוכן | אישור | דחייה | ניתוק | + +### Open term questions for reviewers + +- **hi**: *entry* is एंट्री and *collection* संग्रह (the majority forms); प्रविष्टि would pair better with संग्रह. A reviewer may switch every key. +- **fa**: *entry* is ورودی (the majority); مطلب may read more naturally. A reviewer may switch every key. +- **it**: *self-registered* is “Registrato da sé”; “Autoregistrato” is the usual form. A reviewer may switch both labels. +- **de**, **ru**, **uk**, **it**: the setup hints still use a second verb for approving or connecting in a few keys (listed as review items in the QA report). + +## 7. Reviewing your language + +Thank you for reviewing. Until the Weblate project exists, review in the repository: + +1. Export your language: `pnpm i18n:export` writes `.i18n//.json` for every language, with English in `.i18n/en/` and each key's English text and translator note in `.i18n/descriptions.json`. +2. Read [the QA report](../i18n-review/qa-2026-11.md) for your language: what was fixed and the open review items. Use the glossary above. +3. Edit only `.i18n//*.json`: same keys, nesting and order as English, ICU MessageFormat values (keep every `{argument}`; a `plural` needs every category your language has; the `translate` skill in `.agents/skills/translate/SKILL.md` has the rules). +4. Import: `pnpm i18n:import --locale `. It checks keys and ICU syntax, rewrites the catalogs and runs the catalog tests. Never edit `apps/studio/src/i18n/.ts` by hand; the check fails. +5. Open a pull request that says which parts you reviewed. When a person has reviewed the whole catalog, the owner sets `reviewed: true` for the language in `apps/studio/src/i18n/locales.ts` (agents never do). diff --git a/docs/i18n-review/qa-2026-11.md b/docs/i18n-review/qa-2026-11.md new file mode 100644 index 00000000..dd29d161 --- /dev/null +++ b/docs/i18n-review/qa-2026-11.md @@ -0,0 +1,807 @@ +# Machine-draft QA pass, November 2026 (#112) + +An AI quality pass over the machine-drafted Studio strings in all 18 non-English languages, before human review. It changes **no** language's `reviewed` flag: every language except English and Turkish stays `reviewed: false` until a person who speaks it reviews it. Terms: [glossary](../guides/translations-weblate.md#6-glossary-of-coined-terms). + +## Scope + +The same 494 keys in each of the 18 languages (8892 drafts): + +| Group | Keys | +|---|---| +| core: setup-link sign-up text and the MCP OAuth access row | 3 | +| core: tool labels, error codes, collection list and navigation from #112 | 38 | +| `build`: the playground hint (changed after #112) | 1 | +| `collections` namespace | 81 | +| `connectedAgents` namespace | 42 | +| `fields` namespace | 154 | +| `listings` namespace | 131 | +| `oauthConsent` namespace (consent screen) | 29 | +| `status` (the renderer's status pages, read by site visitors) | 15 | + +## How it was checked + +1. **Automatic**, per language (a script over the exchange JSON): the same placeholders as English and the same kinds, every select value, every CLDR plural category of the language (`Intl.PluralRules`), `#` kept inside plurals, text identical to English, English words left in non-Latin text, and short labels (≤ 24 characters in English) more than 2.5 times longer. +2. **Semantic**: every draft back-translated to English and compared with the source, the security-relevant strings (consent screen, the identity labels, the look-alike and loopback warnings, the setup-link text, error messages, status pages) word by word; plus terminology against the glossary and the file's own register. +3. **Fixes** only for clear errors: changed meaning, a softened security statement, a dropped "you" or "never", leftover English, a term or register that differs from the rest of the language's Studio, grammar a native speaker would call wrong. Applied through `.i18n/` and `pnpm i18n:import`. Stylistic choices are listed below as review items for the language's reviewers. + +## Automatic checks + +No language has an ICU error, a lost or extra placeholder, a missing select value, a missing plural category or a misplaced `#` (Turkish writes `{count, number}` where its nouns stay singular, which the translate skill allows). What the script flagged and was left as it is: + +- **Identical to English**: cognates that are the normal word (fr *Collections*, *Date*, *Type*, *Options*; nl *Type*, *Label*, *Product*; de *Name*, *Text*, *Link*; id *Label*, *Edit…*; it/pt-BR/pl/nl *Link*), and `Site: {property}`. +- **English left in non-Latin text**: product and technical names (sitemap.xml, file paths, `CLOUDHAL_MCP_DCR`, `--base-url`, `entry.fields`, `startsAt`, Workers AI, Google's *Rich Results Test*) and the names of buttons in Claude and MCP Inspector (*Settings*, *Connectors*, *Authenticate*), which those apps may show in English. ru and uk also wrote "sitemap" in a label; fixed to their own word. +- **Length**: no short label grew past 2.5× in a way that breaks a layout; the longest are column headers and buttons such as ru *Последнее использование* (Last used), uk *Попередній перегляд* (Preview), hi *अस्वीकार करें* (Deny), de *Rückgängig machen* (Revert). Left for reviewers. + +## Results per language + +| Language | Fixed | For review | Main finding | +|---|---|---|---| +| Turkish (`tr`) | 5 | 0 | Sign in was "oturum aç" in three new strings and one older one where Studio says "giriş yap"; one setup line read as if the app signs in. Owner's pack: docs/i18n-review/tr.md. | +| German (`de`) | 8 | 10 | The look-alike warning's last condition had no referent ("die es verwendet"); "darüber hinaus" meant "furthermore" in the expiry count; Agenten → Agents (also in two older core keys). | +| Spanish (`es`) | 1 | 7 | "En cambio" (on the other hand) for a field that is being changed. | +| French (`fr`) | 27 | 7 | 21 keys in "tu" in a "vous" catalog; "Auto-inscrit" vs "Auto-enregistré" for self-registered; ungrammatical "est le ou avant". | +| Italian (`it`) | 1 | 13 | "Esci dagli elenchi" told the user to leave the lists. | +| Portuguese (Brazil) (`pt-BR`) | 1 | 6 | "De volta em {time}" (at) for "Back by {time}" (at the latest). | +| Dutch (`nl`) | 3 | 8 | Look-alike warning's pronouns did not agree; "verbinden" vs "koppelen"; "Terug om" for "Back by". | +| Polish (`pl`) | 4 | 16 | Loopback warning lost "you": it only asked that some app here started the connection. | +| Russian (`ru`) | 7 | 5 | Loopback warning lost "you" (passive "the connection was started"); "Зарегистрирован сам" (ungrammatical) on both self-registered labels; two verbs for approve on the consent screen. | +| Ukrainian (`uk`) | 6 | 7 | Loopback warning lost "you" (passive "the connection was started"); two words for connect and approve on the consent screen; passive self-registered label. | +| Japanese (`ja`) | 1 | 5 | "never beyond your role" had become "within your role" (the "never" was lost). | +| Korean (`ko`) | 109 | 4 | These namespaces were in formal 합니다체 while Studio's Korean is 해요체 (107 keys); "never" lost in the Connected agents description. | +| Chinese (Simplified) (`zh-Hans`) | 10 | 4 | 代理 (also "proxy") for agent in 10 keys, including Agent mode; Studio says 智能体 everywhere else. | +| Hindi (`hi`) | 37 | 8 | Entry and collection each had two words (एंट्री/प्रविष्टि, संग्रह/कलेक्शन); स्वीकृत vs मंज़ूर for approve, also in the look-alike warning. | +| Indonesian (`id`) | 15 | 5 | "belum diverifikasi" (not yet verified) softened the identity labels; "Putuskan" read as "Decide" for Disconnect; four keys in "kamu". | +| Arabic (`ar`) | 7 | 6 | عنصر for entry in three keys, two words for theme and for computer; a gender agreement error. | +| Persian (`fa`) | 29 | 10 | Entry was ورودی in 41 keys and مطلب in 25; four keys in informal تو, including the look-alike warning. | +| Hebrew (`he`) | 11 | 9 | Masculine-only imperatives in the look-alike warning and three more keys, where the file is gender-neutral. | + +`Fixed` includes the clear term leftovers outside the 494 keys (next section). + +## Outside the 494 keys + +The pass read only the 494 keys word by word. For the glossary's terms, every other catalog of every language was then searched for the variant forms the pass had found (tr *oturum aç* / *oturumu kapat*, de *Agenten*, hi प्रविष्टि and कलेक्शन, fa مطلب, zh-Hans 代理, ar عنصر, he פריט, fr *inscrit*, id *belum diverifikasi*) in keys whose English uses the same word. The rest of each catalog has not been reviewed by this pass. + +Fixed (listed with each language below): tr `core:agents.notEnabledDescription` (*oturum açma* → *giriş*); de `core:glossary.description` and `core:translations.noneDescription` (*Agenten* → *Agents*); hi `core:pageHeaders.articles.description` and four `core:siteSettings.collections.*` keys (प्रविष्टि → एंट्री); he four `core:siteSettings.collections.*` keys (פריט → רשומה). + +Left for human reviewers: + +| Language | Keys | Why left | +|---|---|---| +| tr | `core:account.sessions.description`, `.revokeTitle`, `.revoked`, `core:members.remove.signOut`, `core:inviteAccept.signOutFirst`, `core:inviteAccept.otherSession` | *oturumu kapat* (close the session) for signing one session or device out; the sign-out button itself is *Çıkış yap*. Owner-reviewed; the invite page could say *Önce çıkış yap*. | +| hi | `core:taxonomy.state.internalHint`, `core:governance.visibility.description.internal`, `.public` | प्रविष्टि means a *sitemap entry* here, not a collection entry. | +| ar, he | `core:publishing.pendingKind` (the `other` branch) | عنصر / פריט translate English *item*, not *entry*. | +| fa | `analytics:bots.note`, `core:articleCorrections.emptyDescription` | مطلب translates *story* / post, not a collection entry. | + +Security wording held in every language after the fixes: "not verified" stays a negation, "Approve only if…" stays a restriction that names *you*, "anyone … any name" keeps both, "at most 90 days" keeps the limit, "never beyond your role" keeps "never", and the setup-link text keeps that sign-up closes afterwards. + +## Per language + +### Turkish (`tr`) + +Studio's Turkish says "giriş yap" for sign in (18 core keys); three new Connected agents / account strings said "oturum aç". Fixed to "giriş yap". + +
5 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `core:account.access.featureHints.mcpOauth` | Bu Studio'ya kayıtlı MCP istemcileri /mcp adresinde OAuth ile oturum açar; her bağlantıyı sen onaylarsın. | Bu Studio'ya kayıtlı MCP istemcileri /mcp adresinde OAuth ile giriş yapar; her bağlantıyı sen onaylarsın. | Studio says "giriş yap" for sign in everywhere else. | +| `connectedAgents:setup.description` | Bir uygulamaya bu Studio'nun MCP URL'sini ver ve istediğinde onayla ya da oturum açamayan betikler ve istemciler için bir agent anahtarı oluştur. | Bir uygulamaya bu Studio'nun MCP URL'sini ver ve istediğinde onayla ya da giriş yapamayan betikler ve istemciler için bir agent anahtarı oluştur. | Studio says "giriş yap" for sign in everywhere else. | +| `connectedAgents:setup.hints.cursor` | ~/.cursor/mcp.json ya da bir projede .cursor/mcp.json olarak kaydet, sonra Cursor isteyince oturum aç. Onaylaman için Studio açılır. | ~/.cursor/mcp.json ya da bir projede .cursor/mcp.json olarak kaydet, sonra Cursor isteyince giriş yap. Onaylaman için Studio açılır. | Studio says "giriş yap" for sign in everywhere else. | +| `connectedAgents:setup.urlDescription` | Uygulama bu Studio'yu tarayıcında açar; giriş yapar ve neler yapabileceğini onaylarsın. Kopyalanacak anahtar yok. | Uygulama bu Studio'yu tarayıcında açar; giriş yapıp neler yapabileceğini onaylarsın. Kopyalanacak anahtar yok. | "giriş yapar" reads as the app signing in; in English the person signs in. "giriş yapıp … onaylarsın" keeps both verbs on the person. | +| `core:agents.notEnabledDescription` | Sunucu oturum açma olmadan çalışıyor, bu yüzden anahtar üretemez. Kendi bilgisayarındaki agent'lar yine de cloudhal mcp ile stdio üzerinden bağlanabilir. | Sunucu giriş olmadan çalışıyor, bu yüzden anahtar üretemez. Kendi bilgisayarındaki agent'lar yine de cloudhal mcp ile stdio üzerinden bağlanabilir. | Outside the changed keys: the last "oturum aç" for sign in; Studio says "giriş yap". | + +
+ +### German (`de`) + +Plural of agent is 'Agents' in 7 keys (collections, connectedAgents, listings) but 'Agenten' in the 4 fields:* keys; aligned to 'Agents'. 'Approve' is 'zustimmen' on the consent screen but 'bestätigen' in the connectedAgents/core hints that describe that same step; 'deploy' is 'Deploye' in two errors but 'Stell … bereit' in build:chat.playgroundHint. + +
8 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `oauthConsent:who.lookalike` | Der Name sieht nach {client} aus, aber jeder kann einen Client unter beliebigem Namen registrieren. Stimme nur zu, wenn du diese Verbindung selbst aus {client} gestartet hast und die Adresse, zu der sie dich zurückschickt (oben), die ist, die es verwendet. | Der Name sieht nach {client} aus, aber jeder kann einen Client unter beliebigem Namen registrieren. Stimme nur zu, wenn du diese Verbindung selbst aus {client} gestartet hast und die oben angezeigte Adresse, zu der sie dich zurückschickt, die ist, die {client} verwendet. | The final 'es' has no neuter antecedent (Name and Client are masculine, Verbindung is feminine), so the second condition of this security check is unclear. Naming {client} makes the condition clear. 'jeder' and 'beliebigem Namen' are kept. | +| `listings:expiry.past` | {count, plural, =0 {Noch keine veröffentlichten Einträge sind darüber hinaus.} one {# veröffentlichter Eintrag ist schon darüber hinaus.} other {# veröffentlichte Einträge sind schon darüber hinaus.}} | {count, plural, =0 {Noch kein veröffentlichter Eintrag hat das Datum überschritten.} one {# veröffentlichter Eintrag hat das Datum schon überschritten.} other {# veröffentlichte Einträge haben das Datum schon überschritten.}} | 'darüber hinaus sein' is not idiomatic. A native reader takes 'darüber hinaus' to mean 'furthermore', so the sentence does not say that the entries are past the date. | +| `fields:builder.description` | Eigene Felder für die Einträge dieser Sammlung, in der Reihenfolge des Editors. Agenten lesen sie auch. | Eigene Felder für die Einträge dieser Sammlung, in der Reihenfolge des Editors. Agents lesen sie auch. | The plural is 'Agents' everywhere else (Verbundene Agents, Abfragen von Agents, Studio, Agents und Themes). Only the fields namespace uses 'Agenten'. | +| `fields:dialog.description` | Beschriftungen und Hilfetexte erscheinen im Editor und sagen Agenten, was sie schreiben sollen. Jeder Eintrag hat seinen eigenen Wert. | Beschriftungen und Hilfetexte erscheinen im Editor und sagen Agents, was sie schreiben sollen. Jeder Eintrag hat seinen eigenen Wert. | Same inconsistency: 'Agenten' here, 'Agents' in the rest of the file. | +| `fields:dialog.keyHint` | So nennen Agenten und Themes dieses Feld. lowerCamelCase wie startsAt; nach dem Speichern nicht mehr änderbar. | So nennen Agents und Themes dieses Feld. lowerCamelCase wie startsAt; nach dem Speichern nicht mehr änderbar. | Same inconsistency, and the parallel collections:create.keyHint says 'Themes, Filter und Agents'. | +| `fields:dialog.optionsHint` | Woraus Redaktion und Agenten wählen. Der Wert wird gespeichert; Leser sehen die Beschriftung. | Woraus Redaktion und Agents wählen. Der Wert wird gespeichert; Leser sehen die Beschriftung. | Same inconsistency: 'Agenten' against the majority 'Agents'. | +| `core:glossary.description` | Begriffe, die Agenten beim Übersetzen beibehalten: Namen, die nie übersetzt werden, und das freigegebene Wort in jeder Sprache. | Begriffe, die Agents beim Übersetzen beibehalten: Namen, die nie übersetzt werden, und das freigegebene Wort in jeder Sprache. | Outside the 494 keys: German Studio says "Agents" (95 uses), not "Agenten". | +| `core:translations.noneDescription` | Agenten übersetzen Seiten und Artikel in die anderen Sprachen der Website; jede Fassung erscheint hier. | Agents übersetzen Seiten und Artikel in die anderen Sprachen der Website; jede Fassung erscheint hier. | Outside the 494 keys: German Studio says "Agents" (95 uses), not "Agenten". | + +
+ +
10 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `connectedAgents:emptyDescription` | Füge die MCP-URL dieses Studios zu Claude, ChatGPT, Cursor oder VS Code hinzu. Jede Verbindung bestätigst du hier. | 'approve' is 'bestätigen' here and in core:account.access.featureHints.mcpOauth, connectedAgents:setup.description and setup.urlDescription, but the consent screen's button and texts say 'Zustimmen' / 'Stimme nur zu'. Consider one verb, e.g. 'Jeder Verbindung stimmst du hier zu', so the hint matches the button the user will see. | | +| `connectedAgents:lookalike` | Sieht aus wie {client}, aber nicht als solches geprüft | Neuter 'als solches' does not match 'der Client' or 'die App'. A gender-neutral wording avoids the problem, e.g. 'Sieht aus wie {client}, aber nicht als {client} geprüft'. | | +| `connectedAgents:selfRegistered` | Selbst registriert, nicht geprüft | The negation is clear and the wording matches oauthConsent:who.selfRegistered. 'nicht verifiziert' would be closer to 'not verified', since 'geprüft' can also mean only 'reviewed'. If you change it, change both keys and connectedAgents:lookalike. | | +| `core:errors.api.gates_unsupported` | Der Live-Server dieser Website unterstützt das noch nicht. Deploye zuerst die Website und versuche es dann erneut. | The anglicism 'Deploye' (also in listings:expiry.gatesUnsupported) sits next to 'Stell Cloudhal … bereit' in build:chat.playgroundHint. Developer jargon accepts it, but 'Stell zuerst die Website bereit' would be consistent. | | +| `connectedAgents:allEmpty` | Noch niemand hat einen Agent per URL verbunden | Standard German declines 'Agent' as a weak noun ('einen Agenten'; likewise 'im Agenten' in oauthConsent:invalid.description). Tech German that keeps the English plural 'Agents' often writes 'einen Agent'. A native reviewer should pick one. | | +| `oauthConsent:who.thisComputerApp` | Schickt dich zu einer App auf diesem Computer zurück ({scheme}:) | Its siblings who.sendsBack and who.thisComputer use 'Leitet dich zurück zu …'. Use the same verb for the same line on the consent screen. | | +| `status:backBy` | Zurück bis {time} | As a fragment, 'Zurück bis' can read as 'back until'. 'Voraussichtlich zurück: {time}' or 'Wieder da um {time}' would be unambiguous for the public. | | +| `listings:expiry.action` | Wenn ein Eintrag abgelaufen ist | The collection-rule end is 'Beendet'/'endete' in listings:ended.*, and its NOTE says it must read differently from an entry's own 'Expired'. 'Wenn ein Eintrag beendet ist' would keep the collection-rule term. | | +| `fields:dialog.requiredHint` | Einträge in Prüfung oder veröffentlichte brauchen einen Wert. Entwürfe lassen sich ohne speichern. | Clumsy word order, and 'ohne' is left hanging. Suggestion: 'Einträge in Prüfung und veröffentlichte Einträge brauchen einen Wert. Entwürfe lassen sich auch ohne Wert speichern.' | | +| `fields:dialog.errors.key.pattern` | Beginn mit einem Kleinbuchstaben; nur Buchstaben und Ziffern, bis zu 40. | The imperative 'Beginn' is correct, but it reads like the noun 'Beginn'. 'Beginne mit einem Kleinbuchstaben' is clearer. | | + +
+ +### Spanish (`es`) + +The coined terms are consistent and the tú register is used throughout Studio. Two mild clashes: 'entrada' (entry) also renders 'blog post' ('entrada de blog'), and ended is 'Finalizada'/'finalizó' in the badge but 'ha terminado' in listings:expiry.action. + +
1 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `fields:builder.changing` | En cambio | Cambio en curso | 'En cambio' is a fixed expression meaning 'on the other hand', so a native reader won't read it as the status 'being changed'. It is a status badge for a field whose change is running (cf. 'Un cambio de campo sigue en curso'). | + +
+ +
7 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `listings:structuredData.description` | Describe cada entrada a los motores de búsqueda como evento, empleo, producto o receta, a partir de sus campos. Sin tipo, las entradas se describen como entradas de blog. | 'entrada' is the coined term for entry, so 'las entradas se describen como entradas de blog' is circular. Consider 'artículo de blog' (or 'publicación de blog') for blog post here and in structuredData.none, issues.required_value_missing, issues.too_large and issues.no_preset. | | +| `status:notPublished.body` | Este sitio aún no está publicado. Vuelve pronto. | All status:* bodies (notPublished, maintenance 'tu paciencia', comingSoon, unavailable 'Inténtalo', error, previewExpired 'Pide') use tú, and these pages are read by the public. The brief asks for a neutral public register. A reviewer should decide whether tú is fine for es or whether to use impersonal or usted forms ('Vuelva pronto', 'Gracias por su paciencia', 'Inténtelo de nuevo'). | | +| `status:backBy` | Volvemos el {time} | EN 'Back by {time}' gives a time by which the site will be back. 'el {time}' only works if {time} is a bare date. If it includes a time of day, consider 'Volveremos hacia {time}' or 'Disponible de nuevo: {time}'. | | +| `oauthConsent:description` | Un agente pide trabajar en este Studio por ti. Revisa lo que puede hacer antes de aprobar. | 'por ti' can mean 'instead of you'. 'en tu nombre' is unambiguous: 'Un agente pide trabajar en este Studio en tu nombre.' | | +| `connectedAgents:allTitle` | Agentes conectados de todos | Reads unfinished. 'Agentes conectados de todos los miembros' matches the description ('Las conexiones de cada miembro'). | | +| `collections:create.addressHint` | Las entradas viven en este prefijo seguido de su slug. | 'viven' is a literal calque (also in collections:settings.description and settings.addressDescription). 'Las entradas se publican bajo este prefijo seguido de su slug' or 'se encuentran en' reads more naturally. | | +| `oauthConsent:who.lookalike` | El nombre parece {client}, pero cualquiera puede registrar un cliente con cualquier nombre. Aprueba solo si iniciaste tú esta conexión desde {client} y la dirección a la que te devuelve, indicada arriba, es la que usa. | Meaning and both restrictions are kept. 'El nombre se parece a {client}' is more natural than 'parece {client}'. Optionally use 'la que usa {client}' to make clear whose address is meant. | | + +
+ +### French (`fr`) + +The register is split: about 50 keys use 'vous' but 21 keys use 'tu', mostly the fields namespace plus four core:errors.api keys and connectedAgents:setup.needsPublicUrl. Self-registered is 'Auto-enregistré' in connectedAgents but 'Auto-inscrit' on the consent screen. oauthConsent and status use straight apostrophes. + +
27 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `oauthConsent:who.selfRegistered` | Auto-inscrit, non vérifié | Auto-enregistré, non vérifié | connectedAgents:selfRegistered says 'Auto-enregistré', and register is 'enregistrer'/'enregistrement' everywhere else (who.registered, setup.needsDcr). The consent screen and the connected-agents list must show the same label for the same state. The negation 'non vérifié' is kept. | +| `oauthConsent:who.lookalike` | Le nom ressemble à {client}, mais n’importe qui peut inscrire un client sous n’importe quel nom. N’approuvez que si vous avez lancé vous-même cette connexion depuis {client} et que l’adresse vers laquelle elle vous renvoie, indiquée ci-dessus, est celle qu’il utilise. | Le nom ressemble à {client}, mais n’importe qui peut enregistrer un client sous n’importe quel nom. N’approuvez que si vous avez lancé vous-même cette connexion depuis {client} et que l’adresse vers laquelle elle vous renvoie, indiquée ci-dessus, est celle qu’il utilise. | Meaning, 'n’importe qui / n’importe quel nom' and the 'N’approuvez que si' restriction are all correct. Only the verb changes: 'inscrire' becomes 'enregistrer', to match the rest of the file (Enregistré dans ce Studio, s’enregistre lui-même). | +| `listings:contentList.ops.lte` | {kind, select, time {est le ou avant} number {est au plus} other {est au plus}} | {kind, select, time {est antérieur ou égal à} number {est au plus} other {est au plus}} | 'est le ou avant' is ungrammatical (dangling article 'le'), and it also fails when the value is 'Maintenant'. 'est antérieur ou égal à' works with both a date and 'maintenant', and matches es 'es igual o anterior a'. | +| `listings:contentList.ops.gte` | {kind, select, time {est le ou après} number {est au moins} other {est au moins}} | {kind, select, time {est postérieur ou égal à} number {est au moins} other {est au moins}} | Same as ops.lte: 'est le ou après' is ungrammatical. 'est postérieur ou égal à' works with dates and with 'maintenant'. | +| `listings:structuredData.issues.unknown_path` | Ce type n’a pas de telle propriété. | Ce type n’a pas cette propriété. | 'n’a pas de telle propriété' is not correct French. 'pas cette propriété' (or 'aucune propriété de ce nom') is. | +| `fields:dialog.integerHint` | Refuse les décimales comme 2,5. | Refuse les nombres décimaux comme 2,5. | 'les décimales' are the digits after the decimal point, and 2,5 is not one. 'nombres décimaux' is the correct term. | +| `core:errors.api.invalid_fields` | Certains champs ne respectent pas leurs règles. Vérifie les champs signalés. | Certains champs ne respectent pas leurs règles. Vérifiez les champs signalés. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `core:errors.api.required_field` | Des champs nécessaires à la publication sont vides. Remplis-les ou garde-le en brouillon. | Des champs nécessaires à la publication sont vides. Remplissez-les ou gardez-le en brouillon. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `core:errors.api.field_change_needs_operation` | Ce changement toucherait des valeurs enregistrées. Utilise le menu du champ pour le renommer, changer son type ou le retirer. | Ce changement toucherait des valeurs enregistrées. Utilisez le menu du champ pour le renommer, changer son type ou le retirer. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `core:errors.api.field_values_unconvertible` | Certaines valeurs ne peuvent pas être converties. Autorise leur effacement ou modifie d’abord ces entrées. | Certaines valeurs ne peuvent pas être converties. Autorisez leur effacement ou modifiez d’abord ces entrées. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `connectedAgents:setup.needsPublicUrl` | Claude.ai et ChatGPT se connectent depuis leurs propres serveurs, qui ne peuvent pas joindre {url}. Lance Studio avec --base-url sur une adresse https:// publique, ou utilise une app sur cet ordinateur, comme Claude Code ou Codex. | Claude.ai et ChatGPT se connectent depuis leurs propres serveurs, qui ne peuvent pas joindre {url}. Lancez Studio avec --base-url sur une adresse https:// publique, ou utilisez une app sur cet ordinateur, comme Claude Code ou Codex. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:editor.date.chooseDate` | Choisis une date | Choisissez une date | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:editor.date.invalidTime` | Saisis une heure comme 09:30 | Saisissez une heure comme 09:30 | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:issues.invalid_value` | Cette valeur ne convient pas au champ. Vérifie ses limites. | Cette valeur ne convient pas au champ. Vérifiez ses limites. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:issues.field_not_localized` | Ce champ est commun à toutes les langues. Modifie-le sur l’original. | Ce champ est commun à toutes les langues. Modifiez-le sur l’original. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:issues.required_field` | Nécessaire pour publier. Ajoute une valeur ou garde l’entrée en brouillon. | Nécessaire pour publier. Ajoutez une valeur ou gardez l’entrée en brouillon. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:builder.emptyDescription` | Ajoute une date, un prix, un intervenant ou tout ce que chaque entrée doit avoir. | Ajoutez une date, un prix, un intervenant ou tout ce que chaque entrée doit avoir. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:builder.saveFirst` | Enregistre ou annule tes modifications avant de renommer, de changer le type ou de retirer un champ. | Enregistrez ou annulez vos modifications avant de renommer, de changer le type ou de retirer un champ. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:builder.running` | {count, plural, =0 {Les entrées sont en cours de mise à jour.} one {Il reste # entrée à mettre à jour.} many {Il reste # d’entrées à mettre à jour.} other {Il reste # entrées à mettre à jour.}} Poursuis-le ici, sinon il reprendra au prochain changement. | {count, plural, =0 {Les entrées sont en cours de mise à jour.} one {Il reste # entrée à mettre à jour.} many {Il reste # d’entrées à mettre à jour.} other {Il reste # entrées à mettre à jour.}} Poursuivez-le ici, sinon il reprendra au prochain changement. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:dialog.errors.label` | Donne un libellé au champ. | Donnez un libellé au champ. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:dialog.errors.maxLength` | Saisis un nombre entier de 1 à {max, number}. | Saisissez un nombre entier de 1 à {max, number}. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:dialog.errors.key.pattern` | Commence par une minuscule ; lettres et chiffres uniquement, jusqu’à 40. | Commencez par une minuscule ; lettres et chiffres uniquement, jusqu’à 40. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:dialog.errors.key.reserved` | Cette clé est réservée à l’entrée elle-même. Choisis-en une autre. | Cette clé est réservée à l’entrée elle-même. Choisissez-en une autre. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:dialog.errors.bounds.number` | Saisis uniquement des nombres. | Saisissez uniquement des nombres. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:dialog.errors.options.required` | Ajoute au moins une option. | Ajoutez au moins une option. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:operation.descriptions.change_field_type` | La valeur de chaque entrée est convertie vers le nouveau type. Vérifie ce qui change avant de lancer. | La valeur de chaque entrée est convertie vers le nouveau type. Vérifiez ce qui change avant de lancer. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | +| `fields:operation.snapshotNote` | Un snapshot est pris avant et après, tu peux donc revenir en arrière. Le site en ligne ne change que quand tu publies. | Un snapshot est pris avant et après, vous pouvez donc revenir en arrière. Le site en ligne ne change que quand vous publiez. | Studio's French drafts use 'vous' in about 50 keys (all of collections, connectedAgents, listings, oauthConsent). This key uses 'tu', which breaks the file's register. | + +
+ +
7 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `oauthConsent:description` | Un agent demande à travailler dans ce Studio pour vous. Vérifiez ce qu'il peut faire avant d'approuver. | Typography: every oauthConsent:* and status:* value uses the straight apostrophe ' (ce qu'il, d'approuver, l'agent, n'est pas), while the rest of the file uses the typographic ’. Normalise to ’ in those two files. | | +| `listings:contentList.ops.lt` | {kind, select, time {est avant} number {est inférieur à} other {est inférieur à}} | If ops.lte/gte become 'est antérieur ou égal à' / 'est postérieur ou égal à', consider 'est antérieur à' / 'est postérieur à' for lt/gt (time) so the four time operators read as one set. 'est avant' / 'est après' are also correct. | | +| `listings:filters.past` | {label} : passés | 'passés' (and 'tous' in filters.any) are masculine plural, but the things being filtered are 'entrées' (fem.). es uses feminine 'pasadas'. Consider 'passées' / 'toutes', or a neutral wording ('{label} : dans le passé', '{label} : indifférent'). | | +| `fields:dialog.keyHint` | Le nom que les agents et les thèmes donnent à ce champ. En lowerCamelCase, comme startsAt ; non modifiable une fois enregistrée. | 'enregistrée' (fem.) has no feminine antecedent in the sentence ('Le nom', 'ce champ'). Use 'enregistré', or start with 'La clé que les agents…'. | | +| `connectedAgents:description` | Les apps que vous avez connectées par URL, comme Claude, ChatGPT ou Cursor. Chacune agit en votre nom, jamais au-delà de votre rôle, jusqu’à ce que vous la déconnectiez. | The meaning and 'jamais au-delà' are correct. Note that connectedAgents:* says 'app' while connectedAgents:setup.description and oauthConsent:who.thisComputer* say 'application'. Pick one. | | +| `fields:dialog.errors.options.value` | Les valeurs utilisent des minuscules, des chiffres et des tirets. | 'tirets' here, 'traits d’union' in collections:create.keyHint for the same rule (hyphens). Use 'traits d’union' in both. | | +| `status:backBy` | De retour le {time} | EN 'Back by {time}' gives a time by which the site will be back. 'le {time}' only fits a bare date. If {time} includes a time of day, consider 'De retour vers {time}' or 'Retour prévu : {time}'. | | + +
+ +### Italian (`it`) + +Core terms are consistent (raccolta, voce, campo, campi di elenco, scadenza, chiave agente, Scollega). Mixed 'connessi' (headings) vs 'collegare' (verbs) for connected agents; 'Ti rimanda' vs 'Ti riporta' on the consent screen; time operators carry articles that clash with the 'Adesso' value; 'deploy' left in English once while elsewhere 'Distribuisci'; several straight apostrophes in oauthConsent. + +
1 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `listings:expiry.unlist` | Esci dagli elenchi | Togli dagli elenchi | As an option label for what happens to an ended entry, 'Esci dagli elenchi' tells the user to leave the lists; it does not say the entry is taken out of them. 'Togli dagli elenchi' (take out of lists) matches the action and stays clearly different from 'Nascondi la pagina'. | + +
+ +
13 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `connectedAgents:selfRegistered` | Registrato da sé, non verificato | 'Registrato da sé' is understandable but unidiomatic as a bare participle; 'Autoregistrato, non verificato' is the usual form. The negation 'non verificato' is correct. Keep identical to oauthConsent:who.selfRegistered. | Autoregistrato, non verificato | +| `oauthConsent:who.selfRegistered` | Registrato da sé, non verificato | Same as connectedAgents:selfRegistered: 'Autoregistrato' reads more natural than 'Registrato da sé'. Negation is preserved. | Autoregistrato, non verificato | +| `oauthConsent:who.thisComputerApp` | Ti riporta a un’app su questo computer ({scheme}:) | Sibling keys who.sendsBack and who.thisComputer use 'Ti rimanda a'; this one uses 'Ti riporta a'. Same meaning, but the consent screen should use one verb. | Ti rimanda a un’app su questo computer ({scheme}:) | +| `oauthConsent:who.stepUp` | Questo agente è già collegato e chiede di più. Ciò che può fare oggi è spuntato. | 'oggi' is a literal rendering of 'today' in the sense of 'currently'; 'ora' or 'attualmente' reads better. | Questo agente è già collegato e chiede di più. Ciò che può fare ora è spuntato. | +| `oauthConsent:invalid.description` | È scaduta, ha già avuto risposta o è stata modificata lungo la strada. Avvia di nuovo la connessione dall'agente. | 'lungo la strada' is a literal calque of 'on the way'; 'durante il tragitto' / 'in transito' is more natural. Also uses a straight apostrophe (dall'agente) while most drafts use ’. | È scaduta, ha già avuto risposta o è stata modificata in transito. Avvia di nuovo la connessione dall’agente. | +| `oauthConsent:scopes.offline` | Resta collegato e rinnova da solo l'accesso, per al massimo 90 giorni, finché la connessione non viene revocata o il tuo accesso non termina. | Meaning and the 90-day limit are correct. Straight apostrophe (l'accesso) differs from the typographic ’ used by most drafts; same in oauthConsent:who.thisComputer, who.loopbackWarning, scopes.none, mode.description, mode.legend and connectedAgents:setup.needsPublicUrl. | Resta collegato e rinnova da solo l’accesso, per al massimo 90 giorni, finché la connessione non viene revocata o il tuo accesso non termina. | +| `connectedAgents:title` | Agenti connessi | The heading uses 'connessi' while every verb on the same screen uses collegare/scollegare ('App che hai collegato', 'Nessun agente collegato', 'Scollega'). Both are normal Italian; a reviewer may prefer 'Agenti collegati' (and allTitle 'Agenti collegati di tutti') for one term. | | +| `core:auth.setupDescription` | Hai aperto il link di configurazione mostrato da Cloudhal all’avvio o al deploy. L’account che crei ora diventa il proprietario; dopo, la registrazione si chiude. | Meaning is correct, including that sign-up closes afterwards. 'al deploy' keeps the English word while the rest of the file renders deploy as 'Distribuisci' (core:errors.api.gates_unsupported, build:chat.playgroundHint, listings:expiry.gatesUnsupported). | Hai aperto il link di configurazione mostrato da Cloudhal all’avvio o alla distribuzione. L’account che crei ora diventa il proprietario; dopo, la registrazione si chiude. | +| `listings:contentList.ops.lt` | {kind, select, time {è prima del} number {è minore di} other {è minore di}} | The time branches carry an article ('è prima del', 'è entro il', 'è dopo il', 'è dal') that fits a concrete date but not the 'Adesso' (Now) value option ('è prima del Adesso'). Article-free forms work with both: 'è prima di' / 'è entro' / 'è dopo' / 'è a partire da'. Applies to ops.lte, ops.gt and ops.gte too. | {kind, select, time {è prima di} number {è minore di} other {è minore di}} | +| `listings:expiry.past` | {count, plural, =0 {Nessuna voce pubblicata l’ha ancora superata.} one {# voce pubblicata l’ha già superata.} many {# voci pubblicate l’hanno già superata.} other {# voci pubblicate l’hanno già superata.}} | The 'many' branch is '# voci' while every other plural in the file uses '# di voci' for many (e.g. collections:entries, fields:operation.done). | {count, plural, =0 {Nessuna voce pubblicata l’ha ancora superata.} one {# voce pubblicata l’ha già superata.} many {# di voci pubblicate l’hanno già superata.} other {# voci pubblicate l’hanno già superata.}} | +| `fields:operation.revert` | Annulla | 'Annulla' is also the usual Cancel label, so a 'Revert' button next to 'Chiudi' may read as cancel. 'Ripristina' is unambiguous (reverting/reverted would follow: 'Ripristino…', 'Ripristinato'). | | +| `fields:builder.moveUp` | Sposta su {name} | fields:builder.moveUp/moveDown use 'Sposta su/giù {name}' while listings:listFields.moveUp/moveDown use 'Sposta {label} in alto/in basso'. One pattern would be more consistent. | | +| `connectedAgents:allDescription` | Le connessioni di ogni membro. Scollegarne una la chiude subito; il suo membro può collegarla di nuovo. | 'il suo membro' is a literal calque; 'il membro a cui appartiene' reads more naturally. | | + +
+ +### Portuguese (Brazil) (`pt-BR`) + +Terms are consistent (coleção, entrada, campo, campos de listagem, expiração, chave de agente, Desconectar, função for role, Implantar for deploy). Minor: search verb alternates Buscar/Pesquisar; 'De volta em' changes 'by' to 'at'. + +
1 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `status:backBy` | De volta em {time} | De volta até {time} | EN 'Back by {time}' gives a latest time; 'De volta em {time}' states an exact moment and is also awkward before a clock time (pt-BR uses 'às'). 'até' keeps the 'no later than' meaning and works with a date or a time. | + +
+ +
6 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `oauthConsent:who.stepUp` | Este agente já está conectado e pede mais. O que ele pode fazer hoje está marcado. | 'hoje' is a literal rendering of 'today' meaning 'currently'; 'agora' / 'atualmente' reads better. | Este agente já está conectado e pede mais. O que ele pode fazer agora está marcado. | +| `oauthConsent:who.thisComputerApp` | Leva você de volta a um app deste computador ({scheme}:) | Sibling keys use 'Leva você de volta para … neste computador'; this one switches to 'a … deste computador'. Align them. | Leva você de volta para um app neste computador ({scheme}:) | +| `listings:contentList.ops.lte` | {kind, select, time {é em ou antes de} number {é no máximo} other {é no máximo}} | 'é em ou antes de' / 'é em ou depois de' (ops.gte) are literal and clunky; filter UIs in pt-BR usually say 'é até' / 'é a partir de' or 'é igual ou anterior a' / 'é igual ou posterior a'. Meaning is correct. | {kind, select, time {é até} number {é no máximo} other {é no máximo}} | +| `listings:expiry.past` | {count, plural, =0 {Nenhuma entrada publicada passou da data ainda.} one {# entrada publicada já passou da data.} many {# entradas publicadas já passaram da data.} other {# entradas publicadas já passaram da data.}} | The 'many' branch is '# entradas' while every other plural in the file uses '# de entradas' for many. | {count, plural, =0 {Nenhuma entrada publicada passou da data ainda.} one {# entrada publicada já passou da data.} many {# de entradas publicadas já passaram da data.} other {# entradas publicadas já passaram da data.}} | +| `core:collectionList.search` | Buscar entradas | Search is 'Buscar' here but 'Pesquisar' in collections:search; site search is 'busca'. Pick one verb for search fields. | | +| `collections:icons.briefcase` | Pasta | 'Pasta' most often means folder in pt-BR UI; for an icon name 'Maleta' avoids confusion with a folder icon. | Maleta | + +
+ +### Dutch (`nl`) + +Core terms are consistent (collectie, item, veld, lijstvelden, agentsleutel, rechten). Connecting an agent is koppelen/ontkoppelen in connectedAgents but verbinden/verbinding in most of oauthConsent (title vs titleFrom even differ); deploy is 'deployen' except 'Implementeer' once. + +
3 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `oauthConsent:who.lookalike` | De naam lijkt op {client}, maar iedereen kan een client onder elke naam registreren. Keur alleen goed als je deze verbinding zelf vanuit {client} hebt gestart en het adres waarnaar ze je terugstuurt, hierboven, het adres is dat het gebruikt. | De naam lijkt op {client}, maar iedereen kan een client onder welke naam dan ook registreren. Keur alleen goed als je deze verbinding zelf vanuit {client} hebt gestart en het adres waarnaar je wordt teruggestuurd (hierboven vermeld) het adres is dat {client} gebruikt. | Pronouns do not agree: 'ze' (she/they) then 'het' (it) for the same client, so it is unclear what sends you back and what 'uses' the address; 'hierboven' without a verb is incomplete. 'onder elke naam' can read as 'under each name'; 'welke naam dan ook' keeps 'any name'. The 'only if' restriction and 'yourself' are kept. | +| `oauthConsent:title` | {client} verbinden | {client} koppelen | Its sibling oauthConsent:titleFrom and all of connectedAgents:* use koppelen/gekoppeld/ontkoppelen for connecting an agent; this title alone uses 'verbinden'. | +| `status:backBy` | Terug om {time} | Uiterlijk {time} terug | EN 'Back by {time}' gives a latest time; 'Terug om {time}' promises an exact moment and 'om' only fits a clock time. 'Uiterlijk {time} terug' keeps 'no later than' and works with a date or a time. | + +
+ +
8 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `oauthConsent:who.stepUp` | Deze agent is al verbonden en vraagt om meer. Wat hij nu mag, is aangevinkt. | Uses 'verbonden' where connectedAgents uses 'gekoppeld'. Same in oauthConsent:scopes.offline ('blijft verbonden'), invalid.description and who.lookalike ('verbinding' vs 'koppeling'). Consider koppelen/koppeling throughout the consent screen. | Deze agent is al gekoppeld en vraagt om meer. Wat hij nu mag, is aangevinkt. | +| `build:chat.playgroundHint` | ‘Bouwen met AI’ draait op Workers AI, dat de playground niet heeft. Implementeer Cloudhal in je Cloudflare-account om het te gebruiken. | Deploy is 'deployen'/'Deploy' elsewhere (core:auth.setupDescription, core:errors.api.gates_unsupported, listings:expiry.gatesUnsupported); 'Implementeer' here also means implement rather than deploy. | ‘Bouwen met AI’ draait op Workers AI, dat de playground niet heeft. Deploy Cloudhal naar je Cloudflare-account om het te gebruiken. | +| `listings:structuredData.noDocument` | De pagina van dit item voert geen gestructureerde gegevens van dit type uit. | 'uitvoeren' mainly means execute/carry out; for markup a page emits, 'bevat' or 'geeft … mee' is clearer. Same in listings:structuredData.previewDescription ('Wat de pagina van dit item uitvoert'). | De pagina van dit item bevat geen gestructureerde gegevens van dit type. | +| `collections:settings.listing` | Weergave | Heading 'Listing' (where entries appear on the public site) is 'Weergave' (display, view), while listing fields are 'Lijstvelden' and listing page 'Lijstpagina'. 'Vermelding' or 'Lijsten' may fit better. | | +| `core:approvals.autoCheck.expires` | hij een gepubliceerd item eerder laat aflopen volgens de verloopdatum van de collectie | The collection has an expiry rule, not an expiry date; elsewhere it is 'verloopregel' (listings:ended.reason). | hij een gepubliceerd item eerder laat aflopen volgens de verloopregel van de collectie | +| `fields:dialog.requiredHint` | Items in review of gepubliceerd hebben een waarde nodig. Concepten worden zonder opgeslagen. | 'in review' is English; 'ter beoordeling' / 'in beoordeling' is the normal Dutch, unless Studio's core catalog already uses 'review' as the status name. | Items ter beoordeling of gepubliceerd hebben een waarde nodig. Concepten worden zonder opgeslagen. | +| `connectedAgents:setup.needsPublicUrl` | Claude.ai en ChatGPT verbinden vanaf hun eigen servers, die {url} niet kunnen bereiken. Start Studio met --base-url op een openbaar https://-adres, of gebruik een app op deze computer, zoals Claude Code of Codex. | Intransitive 'verbinden' is colloquial; 'maken verbinding vanaf' (or 'koppelen vanaf') is standard. | | +| `fields:builder.moveUp` | {name} omhoog | fields:builder.moveUp/moveDown drop the verb ('{name} omhoog') while listings:listFields.moveUp/moveDown say '{label} omhoog verplaatsen'. Align them. | {name} omhoog verplaatsen | + +
+ +### Polish (`pl`) + +Terms are consistent overall. Plural of agent varies: 'agenci' in most keys but 'Połączone agenty' in connectedAgents titles; expiry appears as both 'wygaśnięcie' and 'wygasanie' (ended.reason). + +
4 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `oauthConsent:who.loopbackWarning` | Każdy adres, do którego ten agent może cię odesłać, jest na tym komputerze. Zatwierdź tylko wtedy, gdy połączenie rozpoczęła aplikacja na tym komputerze. | Każdy adres, do którego ten agent może cię odesłać, jest na tym komputerze. Zatwierdź tylko wtedy, gdy to ty rozpocząłeś połączenie z aplikacji na tym komputerze. | EN restricts approval to the case where YOU started the connection from a local app; the draft drops 'you' and only requires that some app here started it (malware on the machine would satisfy it). Gendered 'rozpocząłeś' matches who.lookalike; a gender-neutral alternative is 'gdy połączenie zostało rozpoczęte przez ciebie z aplikacji na tym komputerze'. | +| `oauthConsent:scopes.description` | Odznacz to, czego nie powinien robić. Resztę decyduje twoja rola: czego nie daje, zostaje pominięte. | Odznacz to, czego nie powinien robić. O reszcie decyduje twoja rola: to, czego ona nie daje, zostaje pominięte. | 'decydować' takes 'o + locative': 'Resztę decyduje' is ungrammatical; the second clause also needs 'to, czego'. | +| `listings:expiry.unlist` | Zniknij z list | Usuń z list | As an option label the imperative 'Zniknij' tells the user to disappear. 'Usuń z list' pairs with 'Ukryj stronę' and stays clearly different from it (the page itself stays). | +| `status:backBy` | Wracamy {time} | Wrócimy najpóźniej {time} | EN 'Back by {time}' is a deadline; 'Wracamy {time}' drops 'by' and reads ungrammatically with a formatted time (e.g. 'Wracamy 15:00'). | + +
+ +
16 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `core:auth.setupDescription` | Otwarto link konfiguracyjny wyświetlony przy uruchomieniu lub wdrożeniu Cloudhal. Konto, które teraz utworzysz, stanie się właścicielem; potem rejestracja zostanie zamknięta. | Meaning and the 'sign-up closes' condition are kept. Impersonal 'Otwarto' (chosen to avoid gender) mixes with the informal 'utworzysz'; a reviewer may prefer 'Ten link konfiguracyjny został wyświetlony…'/'Otwierasz link…'. | | +| `connectedAgents:title` | Połączone agenty | Most keys use the personal plural 'agenci' (collections:create.description, fields:builder.description, fields:dialog.keyHint). Decide on one plural; 'Połączeni agenci' would match the rest of the file. Same for connectedAgents:allTitle. | | +| `connectedAgents:allTitle` | Połączone agenty wszystkich | Awkward; suggest 'Połączone agenty wszystkich członków' (or 'Połączeni agenci wszystkich członków'). | | +| `connectedAgents:allDescription` | Połączenia każdego członka. Odłączenie jednego natychmiast je kończy; jego członek może połączyć je ponownie. | 'jego członek' is unclear; suggest 'członek, do którego należy, może połączyć je ponownie'. | | +| `connectedAgents:setup.needsDcr` | {client} rejestruje się sam (dynamiczna rejestracja klientów), a ta jest na tym serwerze wyłączona. Poproś jego operatora o ponowne włączenie CLOUDHAL_MCP_DCR albo użyj klucza agenta. | 'jego operatora' can be read as the client's operator; EN means the server's. Suggest 'Poproś operatora serwera o ponowne włączenie…' (ru/uk drafts say that). | | +| `connectedAgents:setup.tabs.key` | Kluczem agenta | Tab label reads clipped; suggest 'Za pomocą klucza agenta' or 'Z kluczem agenta'. | | +| `oauthConsent:description` | Agent prosi o pracę w tym Studio w twoim imieniu. Sprawdź, co może robić, zanim zatwierdzisz. | 'prosi o pracę' sounds like applying for a job; suggest 'Agent prosi o zgodę na pracę w tym Studio w twoim imieniu.' | | +| `oauthConsent:who.lookalike` | Nazwa wygląda jak {client}, ale każdy może zarejestrować klienta pod dowolną nazwą. Zatwierdź tylko, jeśli to ty rozpocząłeś to połączenie z {client}, a adres powrotu pokazany powyżej jest tym, którego używa. | Meaning and restriction are kept. 'rozpocząłeś' is masculine-only; a reviewer may want a gender-neutral form, e.g. 'jeśli to połączenie zostało rozpoczęte przez ciebie z {client}'. | | +| `oauthConsent:who.stepUp` | Ten agent jest już połączony i prosi o więcej. To, co może dziś robić, jest zaznaczone. | 'dziś' is literal; 'obecnie' / 'teraz' reads more naturally for EN 'today' (= currently). | | +| `oauthConsent:who.thisComputerApp` | Odsyła cię do aplikacji na tym komputerze ({scheme}:) | who.thisComputer uses future 'Odeśle'; align the two variants. | | +| `fields:dialog.keySaved` | Zapisane klucze zmienia się tylko przez Zmień nazwę. | Button name should be quoted: 'przez „Zmień nazwę”'. | | +| `fields:dialog.requiredHint` | Wpisy w recenzji lub opublikowane potrzebują wartości. Szkice zapisują się bez niej. | 'w recenzji' is unusual for a workflow state; consider 'oczekujące na przegląd' / 'w przeglądzie' matching the Studio status name. | | +| `listings:ended.reason` | {action, select, unlist {Ten wpis zakończył się {time} (czas: {zone}) zgodnie z regułą wygasania kolekcji dla pola „{field}”. Nadal jest opublikowany, a jego strona zostaje pod swoim adresem, ale zniknął z list, kanałów, mapy witryny i wyszukiwania.} hide {Ten wpis zakończył się {time} (czas: {zone}) zgodnie z regułą wygasania kolekcji dla pola „{field}”. Nadal jest opublikowany, ale jego strona odpowiada „nie znaleziono” i zniknął ze wszystkich list, kanałów i wyszukiwania.} other {Ten wpis zakończył się {time} (czas: {zone}) zgodnie z regułą wygasania kolekcji dla pola „{field}”.}} | Uses 'reguła wygasania' while expiry is 'wygaśnięcie' elsewhere; acceptable but a reviewer may align ('reguła wygaśnięcia kolekcji'). | | +| `listings:structuredData.previewDescription` | Co strona tego wpisu emituje przy zapisanych ustawieniach. | 'emituje' is a calque; 'generuje' / 'zwraca' is more natural. Same in structuredData.noDocument. | | +| `status:builtWith` | Stworzone z Cloudhal | 'Stworzone z' can read as 'made of'; suggest 'Stworzono w Cloudhal' or 'Zbudowano za pomocą Cloudhal'. | | +| `status:notPublished.body` | Ta strona nie została jeszcze opublikowana. Zajrzyj wkrótce. | Status pages use informal 'Zajrzyj'/'Spróbuj' (common in Polish web copy, so not flagged as a fix); a reviewer may prefer an impersonal public form ('Zapraszamy wkrótce'). Also uses 'strona' while Studio uses 'witryna' (fine for the public). | | + +
+ +### Russian (`ru`) + +'Verified' is rendered as both 'проверен' and 'подтверждён'; 'approve' is 'Разрешить' on the consent screen but 'одобрить'/'подтвердить' in connectedAgents hints; 'sitemap' left in English in one key while 'карта сайта' is used elsewhere. + +
7 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `connectedAgents:selfRegistered` | Зарегистрирован сам, не проверен | Зарегистрировался сам, не проверен | Passive participle 'Зарегистрирован' with 'сам' is ungrammatical; the reflexive verb is needed. The negation 'не проверен' is kept. | +| `oauthConsent:who.selfRegistered` | Зарегистрирован сам, не проверен | Зарегистрировался сам, не проверен | Same as connectedAgents:selfRegistered. | +| `connectedAgents:lookalike` | Похож на {client}, но не подтверждён как он | Похож на {client}, но не проверено, что это он | 'не подтверждён как он' is unnatural; also 'verified' should match 'не проверен' used in selfRegistered. | +| `oauthConsent:who.lookalike` | Название похоже на {client}, но кто угодно может зарегистрировать клиента под любым именем. Одобряйте, только если вы сами начали это подключение из {client} и адрес возврата, указанный выше, — тот, который он использует. | Название похоже на {client}, но кто угодно может зарегистрировать клиента под любым именем. Разрешайте, только если вы сами начали это подключение из {client} и адрес возврата, указанный выше, — тот, который он использует. | The button is 'Разрешить' and the rest of the consent screen says 'разрешить'/'Разрешайте'; 'Одобряйте' introduces a second verb for the same action. The restriction is otherwise kept. | +| `collections:settings.sitemap` | Включать в sitemap | Включать в карту сайта | Leftover English; the file uses 'карта сайта' elsewhere (expiry.unlistDescription, ended.reason). | +| `connectedAgents:setup.hints.cursor` | Сохраните как ~/.cursor/mcp.json или .cursor/mcp.json в проекте, затем войдите, когда Cursor попросит. Studio откроется для подтверждения. | Сохраните как ~/.cursor/mcp.json или .cursor/mcp.json в проекте, затем войдите, когда Cursor попросит. Studio откроется для одобрения. | The sibling hints all say 'для одобрения'; 'подтверждения' is a different word for the same approval. | +| `oauthConsent:who.loopbackWarning` | Все адреса, на которые этот агент может вас вернуть, находятся на этом компьютере. Разрешайте, только если подключение начато из приложения здесь. | Все адреса, на которые этот агент может вас вернуть, находятся на этом компьютере. Разрешайте, только если вы сами начали подключение из приложения здесь. | The draft is passive ("the connection was started from an app here") and drops "you": any local process would satisfy it. Same defect as pl; wording as in who.lookalike ("вы сами начали"). | + +
+ +
5 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `core:account.access.featureHints.mcpOauth` | MCP-клиенты, зарегистрированные в этом Studio, входят на /mcp через OAuth; каждое подключение подтверждаете вы. | Uses 'подтверждаете' while connectedAgents uses 'одобряете' and the consent button is 'Разрешить'. Pick one verb for approving a connection. | | +| `connectedAgents:identifiedBy` | Идентифицирован через {host} | 'через' reads as 'through'; 'Идентифицирован по {host}' or 'Подтверждён доменом {host}' may be clearer. Same in oauthConsent:who.fromHost. | | +| `connectedAgents:setup.urlDescription` | Приложение открывает этот Studio в вашем браузере, вы входите и разрешаете, что ему можно делать. Копировать ключ не нужно. | 'разрешаете, что ему можно делать' is awkward; suggest 'вы входите и решаете, что ему можно делать' or 'разрешаете ему нужные действия'. | | +| `oauthConsent:who.thisComputerApp` | Возвращает вас в приложение на этом компьютере ({scheme}:) | who.thisComputer uses future 'Вернёт'; align the two variants. | | +| `status:reference` | Код обращения: {reference} | 'Код обращения' suggests a support-ticket number; for an error reference 'Код ошибки' or 'Идентификатор' may be more accurate. Native reviewer to decide. | | + +
+ +### Ukrainian (`uk`) + +'Connect' is mostly 'під'єднати' but 'підключити' appears in oauthConsent:titleFrom, who.lookalike and setup.needsPublicUrl; 'verified' is both 'перевірений' and 'підтверджений'; 'approve' is 'Дозволити' on the consent screen but 'схвалити' in connectedAgents and one consent string; 'content' is both 'вміст' and 'контент'. + +
6 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `oauthConsent:titleFrom` | {host}: підключити {client} | {host}: під'єднати {client} | oauthConsent:title and the whole file use 'під'єднати'; the two titles of the same screen should match. | +| `oauthConsent:who.lookalike` | Назва схожа на {client}, але будь-хто може зареєструвати клієнта під будь-якою назвою. Схвалюйте, лише якщо ви самі почали це підключення з {client} і адреса повернення, показана вище, — та, яку він використовує. | Назва схожа на {client}, але будь-хто може зареєструвати клієнта під будь-якою назвою. Дозволяйте, лише якщо ви самі почали це під'єднання з {client} і адреса повернення, показана вище, — та, яку він використовує. | Button is 'Дозволити' and loopbackWarning says 'Дозволяйте'; 'Схвалюйте' is a second verb for the same action. 'підключення' vs file-wide 'під'єднання'. Restriction otherwise kept. | +| `oauthConsent:who.selfRegistered` | Зареєстрований сам, не перевірений | Зареєструвався сам, не перевірений | Passive 'Зареєстрований сам' is unnatural and differs from connectedAgents:selfRegistered ('Зареєструвався сам'). Negation kept. | +| `connectedAgents:lookalike` | Схожий на {client}, але не підтверджений як він | Схожий на {client}, але не перевірено, що це він | 'не підтверджений як він' is unnatural; 'verified' should match 'не перевірений' in selfRegistered. | +| `collections:settings.sitemap` | Додавати до sitemap | Додавати до мапи сайту | Leftover English; the file uses 'мапа сайту' elsewhere (expiry.unlistDescription, ended.reason). | +| `oauthConsent:who.loopbackWarning` | Усі адреси, на які цей агент може вас повернути, на цьому комп'ютері. Дозволяйте, лише якщо під'єднання почато із застосунку тут. | Усі адреси, на які цей агент може вас повернути, на цьому комп'ютері. Дозволяйте, лише якщо ви самі почали під'єднання із застосунку тут. | The draft is passive ("the connection was started from an app here") and drops "you": any local process would satisfy it. Same defect as pl; wording as in who.lookalike ("ви самі почали"). | + +
+ +
7 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `connectedAgents:setup.needsPublicUrl` | Claude.ai і ChatGPT підключаються зі своїх серверів, які не можуть дістатися до {url}. Запустіть Studio з --base-url, що вказує на публічну адресу https://, або скористайтеся застосунком на цьому комп'ютері, як-от Claude Code чи Codex. | File-wide verb is 'під'єднуватися'; suggest 'під'єднуються'. | | +| `core:account.access.featureHints.mcpOauth` | MCP-клієнти, зареєстровані в цьому Studio, входять на /mcp через OAuth; кожне під'єднання підтверджуєте ви. | 'підтверджуєте' vs 'схвалюєте' in connectedAgents and 'Дозволити' on the consent button; pick one verb. | | +| `connectedAgents:setup.urlDescription` | Застосунок відкриває цей Studio у вашому браузері, ви входите й схвалюєте, що йому можна робити. Копіювати ключ не потрібно. | 'схвалюєте, що йому можна робити' is slightly awkward; suggest 'вирішуєте, що йому можна робити'. | | +| `core:errors.api.field_change_needs_operation` | Ця зміна зачепить збережені значення. Перейменуйте, змініть тип або видаліть поле через його меню. | 'зачепить' is colloquial; 'вплине на збережені значення' is more neutral. | | +| `core:overview.recentContent` | Нещодавній вміст | 'вміст' here and in 'Список вмісту', but 'контент' in collections:description and create.description; choose one. | | +| `oauthConsent:who.thisComputerApp` | Повертає вас до застосунку на цьому комп’ютері ({scheme}:) | who.thisComputer uses future 'Поверне … у'; align tense and preposition. | | +| `status:reference` | Код звернення: {reference} | 'Код звернення' suggests a support-ticket number; 'Код помилки' or 'Ідентифікатор' may fit an error reference better. | | + +
+ +### Japanese (`ja`) + +Coined terms are consistent across all keys (エントリー, リスト用フィールド, 有効期限, エージェントキー, 承認/拒否, 接続を解除); Studio lists use 一覧 and site lists リスト, and the two expiry actions (リストから外す / ページを非表示にする) are clearly distinct. Register is uniformly です/ます; only minor punctuation mixing (ASCII vs full-width colons and parentheses). + +
1 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `connectedAgents:description` | Claude、ChatGPT、Cursor など、URL で接続したアプリです。接続を解除するまで、それぞれがあなたとして、あなたのロールの範囲内で動作します。 | Claude、ChatGPT、Cursor など、URL で接続したアプリです。接続を解除するまで、それぞれがあなたとして動作し、あなたのロールを超えることは決してありません。 | EN says "never beyond your role"; the draft turns the explicit never into an affirmative "within your role". Keep the negation and its strength. | + +
+ +
5 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `connectedAgents:disconnectedDescription` | {client} はこの Studio で作業できなくなりました。再び接続を求めてきた場合は、改めて判断します。 | Subject is dropped; adding あなたが makes clear it is the user who decides again, not the system or the client. | {client} はこの Studio で作業できなくなりました。再び接続を求めてきた場合は、あなたが改めて判断します。 | +| `collections:settings.listing` | 公開設定 | 公開設定 reads like publish/visibility settings; the section is about where entries are listed (feeds, sitemap). 掲載 or 一覧表示 would be closer. | | +| `collections:icons.users` | ユーザー | EN is "People" (an icon for team/people collections); ユーザー means app users. 人物 or 人 is closer. | | +| `oauthConsent:who.thisComputerApp` | このコンピューターのアプリに戻ります ({scheme}:) | Sibling key who.thisComputer says このコンピューター上のアプリ; align wording and use full-width parentheses like the rest of the file. | このコンピューター上のアプリに戻ります({scheme}:) | +| `status:backBy` | {time} に再開予定 | "Back by" is a deadline (no later than); に states an exact time. までに keeps the by-meaning. | {time}までに再開予定 | + +
+ +### Korean (`ko`) + +Coined terms are consistent (항목, 목록 필드, 만료, 에이전트 키, 승인/거부, 연결 해제); the expiry actions 목록에서 제외 / 페이지 숨기기 are distinct. The main problem is register: Studio's Korean catalogs use 해요체 (ko.ts about 750 해요 vs 80 합니다 lines; every other lazy namespace is 해요), but the collections, connectedAgents, fields and oauthConsent drafts and several core:errors.api keys use 합니다체, so they are flagged one by one. status:* (public pages) correctly stays in 합니다/해 주세요. + +
109 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `connectedAgents:description` | Claude, ChatGPT, Cursor처럼 URL로 연결한 앱입니다. 연결을 해제할 때까지 각 앱은 내 역할을 넘지 않는 범위에서 나로서 작업합니다. | Claude, ChatGPT, Cursor처럼 URL로 연결한 앱이에요. 연결을 해제할 때까지 각 앱은 나로서 작업하며, 절대 내 역할을 넘지 않아요. | Breaks the 해요체 register (합니다 ending). The role limit is kept, but "never" is softened to a range phrase; the proposal restores an explicit 절대 … 넘지 않아요. | +| `fields:dialog.optionsHint` | 편집자와 에이전트가 고르는 항목입니다. 값이 저장되고 독자에게는 레이블이 보입니다. | 편집자와 에이전트가 고르는 선택지예요. 값이 저장되고 독자에게는 레이블이 보여요. | Breaks the 해요체 register; also 항목 is this file's word for "entry", so using it for options is confusing. 선택지 avoids the clash. | +| `core:collectionList.description` | “{key}” 컬렉션의 항목입니다. | “{key}” 컬렉션의 항목이에요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:collectionList.empty` | 아직 항목이 없습니다 | 아직 항목이 없어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.invalid_fields` | 규칙에 맞지 않는 필드가 있습니다. 표시된 필드를 확인하세요. | 규칙에 맞지 않는 필드가 있어요. 표시된 필드를 확인하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.unknown_field` | 이 컬렉션에는 그 키의 필드가 없습니다. | 이 컬렉션에는 그 키의 필드가 없어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.field_not_localized` | 공유 필드는 원본에서만 바꿀 수 있습니다. | 공유 필드는 원본에서만 바꿀 수 있어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.required_field` | 게시에 필요한 필드가 비어 있습니다. 채우거나 초안으로 두세요. | 게시에 필요한 필드가 비어 있어요. 채우거나 초안으로 두세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.too_many_fields` | 컬렉션이나 사이트가 가질 수 있는 필드 수를 넘었습니다. | 컬렉션이나 사이트가 가질 수 있는 필드 수를 넘었어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.field_key_reserved` | 이 필드 키는 항목 자체에 예약되어 있습니다. | 이 필드 키는 항목 자체에 예약되어 있어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.field_key_duplicate` | 두 필드가 같은 키를 사용합니다. | 두 필드가 같은 키를 사용해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.field_option_duplicate` | 선택 필드의 두 옵션 값이 같습니다. | 선택 필드의 두 옵션 값이 같아요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.field_bounds` | 숫자 필드의 최솟값이 최댓값보다 큽니다. | 숫자 필드의 최솟값이 최댓값보다 커요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.field_change_needs_operation` | 이 변경은 저장된 값에 영향을 줍니다. 필드 메뉴에서 이름 변경, 유형 변경, 삭제를 하세요. | 이 변경은 저장된 값에 영향을 줘요. 필드 메뉴에서 이름 변경, 유형 변경, 삭제를 하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.operation_in_progress` | 이 컬렉션에서 다른 필드 변경이 아직 진행 중입니다. | 이 컬렉션에서 다른 필드 변경이 아직 진행 중이에요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.field_values_unconvertible` | 변환할 수 없는 값이 있습니다. 지우기를 허용하거나 먼저 해당 항목을 바꾸세요. | 변환할 수 없는 값이 있어요. 지우기를 허용하거나 먼저 해당 항목을 바꾸세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:errors.api.field_operation_incomplete` | 그 필드 변경은 아직 끝나지 않았거나 이미 되돌려졌습니다. | 그 필드 변경은 아직 끝나지 않았거나 이미 되돌려졌어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `core:account.access.featureHints.mcpOauth` | 이 Studio에 등록된 MCP 클라이언트는 /mcp에서 OAuth로 로그인하며, 연결마다 내가 승인합니다. | 이 Studio에 등록된 MCP 클라이언트는 /mcp에서 OAuth로 로그인하며, 연결마다 내가 승인해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:description` | 이 사이트가 보관하는 콘텐츠의 종류입니다. 글, 이벤트, 팀, 채용 등 자체 항목이 있는 무엇이든 둘 수 있습니다. 컬렉션마다 고유한 목록, 주소, 설정이 있습니다. | 이 사이트가 보관하는 콘텐츠의 종류예요. 글, 이벤트, 팀, 채용 등 자체 항목이 있는 무엇이든 둘 수 있어요. 컬렉션마다 고유한 목록, 주소, 설정이 있어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:inferredHint` | 항목은 있지만 아직 이 컬렉션에 이름이 지정되지 않았습니다. 설정을 열어 이름을 지정하세요. | 항목은 있지만 아직 이 컬렉션에 이름이 지정되지 않았어요. 설정을 열어 이름을 지정하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:empty` | 아직 컬렉션이 없습니다 | 아직 컬렉션이 없어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:create.description` | 사이드바에 자체 목록이 생기는 새로운 콘텐츠 종류입니다. 만들고 나면 에이전트가 항목을 작성할 수 있습니다. | 사이드바에 자체 목록이 생기는 새로운 콘텐츠 종류예요. 만들고 나면 에이전트가 항목을 작성할 수 있어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:create.pluralHint` | 복수형으로, 사이드바에 표시되는 이름입니다. 예: 이벤트. | 복수형으로, 사이드바에 표시되는 이름이에요. 예: 이벤트. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:create.singularHint` | 단수형입니다. 예: 이벤트. | 단수형이에요. 예: 이벤트. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:create.keyHint` | 소문자, 숫자, 하이픈. 테마, 필터, 에이전트가 사용하며 나중에 변경할 수 없습니다. | 소문자, 숫자, 하이픈. 테마, 필터, 에이전트가 사용하며 나중에 변경할 수 없어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:create.addressHint` | 항목은 이 접두사 뒤에 슬러그가 붙은 위치에 있습니다. | 항목은 이 접두사 뒤에 슬러그가 붙은 위치에 있어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:create.failed` | 컬렉션을 만들지 못했습니다 | 컬렉션을 만들지 못했어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:create.created` | 컬렉션을 만들었습니다 | 컬렉션을 만들었어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:create.createdDescription` | {name}이(가) 사이드바에 추가되었습니다. 첫 항목을 추가하세요. | {name}이(가) 사이드바에 추가되었어요. 첫 항목을 추가하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.description` | 이 컬렉션의 이름, 항목이 위치할 곳, 항목을 나열하는 방식을 설정합니다. | 이 컬렉션의 이름, 항목이 위치할 곳, 항목을 나열하는 방식을 설정해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.namesDescription` | 사이트의 모든 언어로 입력합니다. Studio, 에이전트, 테마는 키 대신 이 이름을 표시합니다. | 사이트의 모든 언어로 입력해요. Studio, 에이전트, 테마는 키 대신 이 이름을 표시해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.descriptionHint` | 선택 사항입니다. 컬렉션 목록의 제목 아래에 표시됩니다. | 선택 사항이에요. 컬렉션 목록의 제목 아래에 표시돼요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.appearanceDescription` | 사이드바에 표시되는 컬렉션 아이콘입니다. | 사이드바에 표시되는 컬렉션 아이콘이에요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.listingDescription` | 컬렉션의 항목이 공개 사이트의 어디에 나타날지 설정합니다. | 컬렉션의 항목이 공개 사이트의 어디에 나타날지 설정해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.feedHint` | 이 옵션을 켠 모든 컬렉션의 최신 항목이 사이트 피드에 나열됩니다. | 이 옵션을 켠 모든 컬렉션의 최신 항목이 사이트 피드에 나열돼요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.sitemapHint` | 검색 엔진은 sitemap.xml을 통해 게시된 항목을 찾습니다. | 검색 엔진은 sitemap.xml을 통해 게시된 항목을 찾아요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.sortHint` | 정렬 기준을 지정하지 않은 Studio 목록과 테마 목록에서 사용합니다. | 정렬 기준을 지정하지 않은 Studio 목록과 테마 목록에서 사용해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.taxonomiesDescription` | 이 컬렉션의 항목이 사용하는 분류입니다. 컬렉션 목록이 없는 분류는 모든 컬렉션에 적용됩니다. | 이 컬렉션의 항목이 사용하는 분류예요. 컬렉션 목록이 없는 분류는 모든 컬렉션에 적용돼요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.noTaxonomies` | 이 사이트에는 분류가 없습니다. | 이 사이트에는 분류가 없어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.addressDescription` | 항목이 위치하는 곳입니다. 변경하면 공개 URL이 이동하며, 이전 주소는 영구 리디렉션으로 응답합니다. | 항목이 위치하는 곳이에요. 변경하면 공개 URL이 이동하며, 이전 주소는 영구 리디렉션으로 응답해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `collections:settings.saved` | 컬렉션을 저장했습니다 | 컬렉션을 저장했어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:allDescription` | 모든 멤버의 연결입니다. 연결을 해제하면 즉시 끝나며, 해당 멤버는 다시 연결할 수 있습니다. | 모든 멤버의 연결이에요. 연결을 해제하면 즉시 끝나며, 해당 멤버는 다시 연결할 수 있어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:disconnectedDescription` | {client}은(는) 더 이상 이 Studio에서 작업할 수 없습니다. 다시 연결을 요청하면 다시 결정하게 됩니다. | {client}은(는) 더 이상 이 Studio에서 작업할 수 없어요. 다시 연결을 요청하면 다시 결정하게 돼요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:empty` | URL로 연결된 에이전트가 없습니다 | URL로 연결된 에이전트가 없어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:emptyDescription` | 이 Studio의 MCP URL을 Claude, ChatGPT, Cursor 또는 VS Code에 추가하세요. 각 연결은 여기에서 승인합니다. | 이 Studio의 MCP URL을 Claude, ChatGPT, Cursor 또는 VS Code에 추가하세요. 각 연결은 여기에서 승인해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:allEmpty` | 아직 아무도 URL로 에이전트를 연결하지 않았습니다 | 아직 아무도 URL로 에이전트를 연결하지 않았어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:setup.urlDescription` | 앱이 브라우저에서 이 Studio를 열면 로그인하고 앱이 할 수 있는 일을 승인합니다. 복사할 키가 없습니다. | 앱이 브라우저에서 이 Studio를 열면 로그인하고 앱이 할 수 있는 일을 승인해요. 복사할 키가 없어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:setup.hints.claudeAi` | Claude에서 Settings를 열고 Connectors로 이동한 뒤 이 URL로 사용자 지정 커넥터를 추가하세요. Claude가 승인을 위해 Studio를 엽니다. | Claude에서 Settings를 열고 Connectors로 이동한 뒤 이 URL로 사용자 지정 커넥터를 추가하세요. Claude가 승인을 위해 Studio를 열어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:setup.hints.claudeCode` | 터미널에서 실행한 다음 Claude Code에서 /mcp를 입력하고 Authenticate를 선택하세요. 브라우저가 승인을 위해 Studio를 엽니다. | 터미널에서 실행한 다음 Claude Code에서 /mcp를 입력하고 Authenticate를 선택하세요. 브라우저가 승인을 위해 Studio를 열어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:setup.hints.codex` | Codex: 두 줄을 모두 실행하세요. 두 번째 줄이 승인을 위해 Studio를 엽니다. ChatGPT: 설정에서 이 URL로 커넥터를 추가하세요. | Codex: 두 줄을 모두 실행하세요. 두 번째 줄이 승인을 위해 Studio를 열어요. ChatGPT: 설정에서 이 URL로 커넥터를 추가하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:setup.hints.cursor` | ~/.cursor/mcp.json 또는 프로젝트의 .cursor/mcp.json으로 저장한 뒤 Cursor가 요청하면 로그인하세요. 승인을 위해 Studio가 열립니다. | ~/.cursor/mcp.json 또는 프로젝트의 .cursor/mcp.json으로 저장한 뒤 Cursor가 요청하면 로그인하세요. 승인을 위해 Studio가 열려요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:setup.hints.vscode` | 프로젝트에 .vscode/mcp.json으로 저장한 다음 서버를 시작하세요. VS Code가 로그인을 요청하고 Studio를 엽니다. | 프로젝트에 .vscode/mcp.json으로 저장한 다음 서버를 시작하세요. VS Code가 로그인을 요청하고 Studio를 열어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:setup.hints.inspector` | 실행한 뒤 Streamable HTTP를 선택하고 URL을 붙여 넣은 다음 Auth Settings를 열고 Quick OAuth Flow를 실행하세요. 연결을 확인할 때 유용합니다. | 실행한 뒤 Streamable HTTP를 선택하고 URL을 붙여 넣은 다음 Auth Settings를 열고 Quick OAuth Flow를 실행하세요. 연결을 확인할 때 유용해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:setup.needsDcr` | {client}은(는) 스스로 등록하는데(동적 클라이언트 등록), 이 서버에서는 꺼져 있습니다. 운영자에게 CLOUDHAL_MCP_DCR을 다시 켜 달라고 요청하거나 에이전트 키를 사용하세요. | {client}은(는) 스스로 등록하는데(동적 클라이언트 등록), 이 서버에서는 꺼져 있어요. 운영자에게 CLOUDHAL_MCP_DCR을 다시 켜 달라고 요청하거나 에이전트 키를 사용하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:setup.needsPublicUrl` | Claude.ai와 ChatGPT는 자체 서버에서 연결하므로 {url}에 접근할 수 없습니다. --base-url을 공개 https:// 주소로 설정해 Studio를 시작하거나, Claude Code나 Codex처럼 이 컴퓨터의 앱을 사용하세요. | Claude.ai와 ChatGPT는 자체 서버에서 연결하므로 {url}에 접근할 수 없어요. --base-url을 공개 https:// 주소로 설정해 Studio를 시작하거나, Claude Code나 Codex처럼 이 컴퓨터의 앱을 사용하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `connectedAgents:setup.unavailable` | 앱이 자신을 식별하는 두 가지 방법(메타데이터 문서와 동적 등록)이 모두 여기에서 꺼져 있습니다. 이 서버의 운영자에게 문의하거나 에이전트 키를 사용하세요. | 앱이 자신을 식별하는 두 가지 방법(메타데이터 문서와 동적 등록)이 모두 여기에서 꺼져 있어요. 이 서버의 운영자에게 문의하거나 에이전트 키를 사용하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:issues.invalid_value` | 이 값은 필드에 맞지 않습니다. 제한을 확인하세요. | 이 값은 필드에 맞지 않아요. 제한을 확인하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:issues.unknown_field` | 이 컬렉션에는 그런 필드가 없습니다. | 이 컬렉션에는 그런 필드가 없어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:issues.field_not_localized` | 이 필드는 모든 언어에서 공유됩니다. 원본에서 바꾸세요. | 이 필드는 모든 언어에서 공유돼요. 원본에서 바꾸세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:issues.required_field` | 게시에 필요합니다. 값을 추가하거나 항목을 초안으로 두세요. | 게시에 필요해요. 값을 추가하거나 항목을 초안으로 두세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:issues.too_large` | 이 항목의 필드가 합쳐서 너무 큽니다. | 이 항목의 필드가 합쳐서 너무 커요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:builder.description` | 이 컬렉션 항목만의 필드로, 편집기에 표시되는 순서대로 나열됩니다. 에이전트도 읽습니다. | 이 컬렉션 항목만의 필드로, 편집기에 표시되는 순서대로 나열돼요. 에이전트도 읽어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:builder.empty` | 아직 필드가 없습니다 | 아직 필드가 없어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:builder.saved` | 필드를 저장했습니다 | 필드를 저장했어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:builder.runningTitle` | 필드 변경이 아직 진행 중입니다 | 필드 변경이 아직 진행 중이에요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:builder.running` | {count, plural, =0 {항목을 업데이트하고 있습니다.} other {업데이트할 항목이 #개 남았습니다.}} 여기서 계속하거나, 다음 변경 때 이어서 진행됩니다. | {count, plural, =0 {항목을 업데이트하고 있어요.} other {업데이트할 항목이 #개 남았어요.}} 여기서 계속하거나, 다음 변경 때 이어서 진행돼요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.description` | 레이블과 도움말은 편집기에 표시되고 에이전트에게 무엇을 쓸지 알려 줍니다. 각 항목은 자기 값을 가집니다. | 레이블과 도움말은 편집기에 표시되고 에이전트에게 무엇을 쓸지 알려 줘요. 각 항목은 자기 값을 가져요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.keyHint` | 에이전트와 테마가 이 필드를 부르는 이름입니다. startsAt 같은 lowerCamelCase이며 저장 후에는 편집할 수 없습니다. | 에이전트와 테마가 이 필드를 부르는 이름이에요. startsAt 같은 lowerCamelCase이며 저장 후에는 편집할 수 없어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.keySaved` | 저장된 키는 이름 변경으로만 바뀝니다. | 저장된 키는 이름 변경으로만 바뀌어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.needsOperation` | 저장된 필드는 먼저 항목을 확인하는 필드 메뉴에서 바꿉니다. | 저장된 필드는 먼저 항목을 확인하는 필드 메뉴에서 바꿔요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.localizedHint` | 켜짐: 번역마다 자기 값을 가집니다. 꺼짐: 번역은 원본의 값을 보여 줍니다. | 켜짐: 번역마다 자기 값을 가져요. 꺼짐: 번역은 원본의 값을 보여 줘요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.requiredHint` | 검토 중이거나 게시된 항목에는 값이 필요합니다. 초안은 값 없이 저장됩니다. | 검토 중이거나 게시된 항목에는 값이 필요해요. 초안은 값 없이 저장돼요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.multilineHint` | 줄바꿈을 허용합니다. | 줄바꿈을 허용해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.searchableHint` | 방문자가 이 필드의 단어로 항목을 찾습니다. | 방문자가 이 필드의 단어로 항목을 찾아요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.integerHint` | 2.5 같은 소수를 거부합니다. | 2.5 같은 소수를 거부해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.multipleHint` | 항목이 둘 이상의 옵션을 고를 수 있습니다. | 항목이 둘 이상의 옵션을 고를 수 있어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.errors.key.reserved` | 이 키는 항목 자체에 예약되어 있습니다. 다른 키를 고르세요. | 이 키는 항목 자체에 예약되어 있어요. 다른 키를 고르세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.errors.key.taken` | 다른 필드가 이미 이 키를 사용합니다. | 다른 필드가 이미 이 키를 사용해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.errors.bounds.order` | 최솟값이 최댓값보다 큽니다. | 최솟값이 최댓값보다 커요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.errors.options.value` | 값에는 영문 소문자, 숫자, 하이픈을 씁니다. | 값에는 영문 소문자, 숫자, 하이픈을 써요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.errors.options.duplicate` | 두 옵션의 값이 같습니다. | 두 옵션의 값이 같아요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:dialog.errors.options.label` | 모든 옵션에 레이블이 필요합니다. | 모든 옵션에 레이블이 필요해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:operation.descriptions.rename_field` | 각 항목의 값이 새 키로 옮겨집니다. 아무것도 변환되지 않습니다. | 각 항목의 값이 새 키로 옮겨져요. 아무것도 변환되지 않아요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:operation.descriptions.change_field_type` | 각 항목의 값이 새 유형으로 변환됩니다. 실행하기 전에 무엇이 바뀌는지 확인하세요. | 각 항목의 값이 새 유형으로 변환돼요. 실행하기 전에 무엇이 바뀌는지 확인하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:operation.descriptions.remove_field` | 필드와 각 항목의 해당 값이 삭제됩니다. | 필드와 각 항목의 해당 값이 삭제돼요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:operation.toShared` | 번역에 원본의 값이 표시됩니다. 번역 자체의 값은 삭제되고 원본의 값은 남습니다. | 번역에 원본의 값이 표시돼요. 번역 자체의 값은 삭제되고 원본의 값은 남아요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:operation.toLocalized` | 번역마다 자기 값을 갖게 됩니다. 값을 정하기 전까지는 원본의 값을 보여 줍니다. | 번역마다 자기 값을 갖게 돼요. 값을 정하기 전까지는 원본의 값을 보여 줘요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:operation.themeWarning` | entry.fields.{key}를 직접 읽는 테마는 업데이트될 때까지 이를 표시하지 않습니다. entryFields를 쓰는 테마는 계속 작동합니다. | entry.fields.{key}를 직접 읽는 테마는 업데이트될 때까지 이를 표시하지 않아요. entryFields를 쓰는 테마는 계속 작동해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:operation.snapshotNote` | 전후로 스냅샷이 만들어지므로 되돌릴 수 있습니다. 라이브 사이트는 게시할 때만 바뀝니다. | 전후로 스냅샷이 만들어지므로 되돌릴 수 있어요. 라이브 사이트는 게시할 때만 바뀌어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:operation.done` | {count, plural, =0 {바꿀 항목이 없었습니다.} other {항목 #개를 바꿨습니다.}} | {count, plural, =0 {바꿀 항목이 없었어요.} other {항목 #개를 바꿨어요.}} | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:operation.reverted` | {count, plural, =0 {필드가 원래대로 돌아왔습니다.} other {필드와 항목 #개가 원래대로 돌아왔습니다.}} | {count, plural, =0 {필드가 원래대로 돌아왔어요.} other {필드와 항목 #개가 원래대로 돌아왔어요.}} | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `fields:operation.failed` | 변경이 끝나지 않았습니다 | 변경이 끝나지 않았어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `listings:listFields.saved` | 목록 필드를 저장했습니다 | 목록 필드를 저장했어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `listings:expiry.saved` | 만료를 저장했습니다 | 만료를 저장했어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `listings:structuredData.saved` | 구조화된 데이터를 저장했습니다 | 구조화된 데이터를 저장했어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `listings:createPage.created` | 목록 페이지를 만들었습니다 | 목록 페이지를 만들었어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:description` | 에이전트가 이 Studio에서 나를 대신해 일하겠다고 요청합니다. 승인하기 전에 할 수 있는 일을 확인하세요. | 에이전트가 이 Studio에서 나를 대신해 일하겠다고 요청해요. 승인하기 전에 할 수 있는 일을 확인하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:invalid.title` | 이 요청은 사용할 수 없습니다 | 이 요청은 사용할 수 없어요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:invalid.description` | 만료되었거나 이미 응답했거나 도중에 변경되었습니다. 에이전트에서 연결을 다시 시작하세요. | 만료되었거나 이미 응답했거나 도중에 변경되었어요. 에이전트에서 연결을 다시 시작하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:who.lookalike` | 이름이 {client}처럼 보이지만 누구나 어떤 이름으로든 클라이언트를 등록할 수 있습니다. 직접 {client}에서 이 연결을 시작했고 위에 표시된 돌아갈 주소가 그 클라이언트가 쓰는 주소일 때만 승인하세요. | 이름이 {client}처럼 보이지만 누구나 어떤 이름으로든 클라이언트를 등록할 수 있어요. 직접 {client}에서 이 연결을 시작했고 위에 표시된 돌아갈 주소가 그 클라이언트가 쓰는 주소일 때만 승인하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:who.sendsBack` | {host}(으)로 돌아갑니다 | {host}(으)로 돌아가요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:who.thisComputer` | 이 컴퓨터의 앱으로 돌아갑니다 | 이 컴퓨터의 앱으로 돌아가요 | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:who.thisComputerApp` | 이 컴퓨터의 앱으로 돌아갑니다 ({scheme}:) | 이 컴퓨터의 앱으로 돌아가요 ({scheme}:) | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:who.loopbackWarning` | 이 에이전트가 돌려보낼 수 있는 주소는 모두 이 컴퓨터에 있습니다. 이 컴퓨터의 앱에서 연결을 시작한 경우에만 승인하세요. | 이 에이전트가 돌려보낼 수 있는 주소는 모두 이 컴퓨터에 있어요. 이 컴퓨터의 앱에서 연결을 시작한 경우에만 승인하세요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:who.stepUp` | 이 에이전트는 이미 연결되어 있으며 더 많은 권한을 요청합니다. 지금 할 수 있는 일은 체크되어 있습니다. | 이 에이전트는 이미 연결되어 있으며 더 많은 권한을 요청해요. 지금 할 수 있는 일은 체크되어 있어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:scopes.description` | 하지 말아야 할 일은 체크를 해제하세요. 나머지는 내 역할이 정하며, 역할이 주지 않는 것은 제외됩니다. | 하지 말아야 할 일은 체크를 해제하세요. 나머지는 내 역할이 정하며, 역할이 주지 않는 것은 제외돼요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:scopes.offline` | 연결이 취소되거나 내 접근 권한이 끝날 때까지, 최대 90일 동안 연결된 상태로 남아 접근 권한을 스스로 갱신합니다. | 연결이 취소되거나 내 접근 권한이 끝날 때까지, 최대 90일 동안 연결된 상태로 남아 접근 권한을 스스로 갱신해요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:scopes.sites` | {count, plural, other {내가 작업하는 사이트 #개에만 접근합니다.}} | {count, plural, other {내가 작업하는 사이트 #개에만 접근해요.}} | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | +| `oauthConsent:mode.description` | 에이전트가 얼마나 독립적으로 일할 수 있는지. 나중에 바꿀 수 있습니다. | 에이전트가 얼마나 독립적으로 일할 수 있는지 정해요. 나중에 바꿀 수 있어요. | Breaks Studio's 해요체 register (ko.ts and the other namespaces end declaratives in -요); same meaning, -ㅂ니다 ending. | + +
+ +
4 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `core:auth.setupDescription` | Cloudhal을 시작하거나 배포할 때 표시된 설정 링크를 열었어요. 지금 만드는 계정이 소유자가 되며, 그 후에는 가입이 닫혀요. | Meaning and the closure condition are intact; 가입이 마감돼요 is the more idiomatic way to say sign-up closes. | Cloudhal을 시작하거나 배포할 때 표시된 설정 링크를 열었어요. 지금 만드는 계정이 소유자가 되며, 그 후에는 가입이 마감돼요. | +| `listings:contentList.ops.lt` | {kind, select, time {이전} number {미만} other {미만}} | In Korean convention 이전/이후 can be read as including the reference date (like 이하/이상). The sibling 당일 또는 이전 makes the contrast visible, but 전 / 후 (e.g. "…보다 전") would be unambiguous for the strict operators. Same for ops.gt (이후). | | +| `listings:contentList.ops.gt` | {kind, select, time {이후} number {초과} other {초과}} | See ops.lt: 이후 may be read as on-or-after; consider 후. | | +| `status:backBy` | {time}에 다시 시작합니다 | "Back by" is a deadline (no later than); 에 states an exact time. 까지 keeps the by-meaning. | {time}까지 다시 열 예정입니다 | + +
+ +### Chinese (Simplified) (`zh-Hans`) + +"agent" is split: 智能体 in core, collections, connectedAgents, listings and every other Studio catalog (zh-Hans.ts has 154 x 智能体, 0 x 代理), but the fields and oauthConsent drafts use 代理 (10 keys), including the agent-mode legend; those are flagged. Other coined terms are consistent; status:* correctly uses 您 and 网站 for the public. + +
10 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `fields:builder.description` | 此集合条目专属的字段,按编辑器中显示的顺序排列。代理也会读取它们。 | 此集合条目专属的字段,按编辑器中显示的顺序排列。智能体也会读取它们。 | Uses 代理 for "agent"; every other Studio catalog (and connectedAgents, listings, collections here) uses 智能体. 代理 also reads as proxy/broker. | +| `fields:dialog.description` | 标签和帮助文本会显示在编辑器中,并告诉代理该写什么。每个条目保留自己的值。 | 标签和帮助文本会显示在编辑器中,并告诉智能体该写什么。每个条目保留自己的值。 | Uses 代理 for "agent"; every other Studio catalog (and connectedAgents, listings, collections here) uses 智能体. 代理 also reads as proxy/broker. | +| `fields:dialog.keyHint` | 代理和主题对此字段的称呼。使用 lowerCamelCase,例如 startsAt;保存后无法编辑。 | 智能体和主题对此字段的称呼。使用 lowerCamelCase,例如 startsAt;保存后无法编辑。 | Uses 代理 for "agent"; every other Studio catalog (and connectedAgents, listings, collections here) uses 智能体. 代理 also reads as proxy/broker. | +| `fields:dialog.optionsHint` | 编辑和代理可选的内容。保存的是值;读者看到的是标签。 | 编辑和智能体可选的内容。保存的是值;读者看到的是标签。 | Uses 代理 for "agent"; every other Studio catalog (and connectedAgents, listings, collections here) uses 智能体. 代理 also reads as proxy/broker. | +| `oauthConsent:description` | 有个代理请求代表你在这个 Studio 中工作。批准前请先查看它可以做什么。 | 有个智能体请求代表你在这个 Studio 中工作。批准前请先查看它可以做什么。 | Uses 代理 for "agent"; every other Studio catalog (and connectedAgents, listings, collections here) uses 智能体. 代理 also reads as proxy/broker. | +| `oauthConsent:invalid.description` | 它已过期、已被处理,或在传递途中被更改。请从代理重新发起连接。 | 它已过期、已被处理,或在传递途中被更改。请从智能体重新发起连接。 | Uses 代理 for "agent"; every other Studio catalog (and connectedAgents, listings, collections here) uses 智能体. 代理 also reads as proxy/broker. | +| `oauthConsent:who.loopbackWarning` | 这个代理能把你送回的所有地址都在这台电脑上。只有当你是从这里的应用发起连接时才批准。 | 这个智能体能把你送回的所有地址都在这台电脑上。只有当你是从这里的应用发起连接时才批准。 | Uses 代理 for "agent"; every other Studio catalog (and connectedAgents, listings, collections here) uses 智能体. 代理 also reads as proxy/broker. | +| `oauthConsent:who.stepUp` | 这个代理已经连接,现在请求更多权限。它目前能做的已勾选。 | 这个智能体已经连接,现在请求更多权限。它目前能做的已勾选。 | Uses 代理 for "agent"; every other Studio catalog (and connectedAgents, listings, collections here) uses 智能体. 代理 also reads as proxy/broker. | +| `oauthConsent:mode.description` | 代理可以多大程度上独立工作。之后可以更改。 | 智能体可以多大程度上独立工作。之后可以更改。 | Uses 代理 for "agent"; every other Studio catalog (and connectedAgents, listings, collections here) uses 智能体. 代理 also reads as proxy/broker. | +| `oauthConsent:mode.legend` | 代理模式 | 智能体模式 | Uses 代理 for "agent"; every other Studio catalog (and connectedAgents, listings, collections here) uses 智能体. 代理 also reads as proxy/broker. The legend should match how Studio names agent modes elsewhere. | + +
+ +
4 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `collections:settings.description` | 此集合如何命名、条目位于何处,以及由什么列出它们。 | 由什么列出它们 is a literal rendering of "what lists them" and reads awkwardly; the section means where the entries are listed (feeds, sitemap). | 此集合的名称、条目所在的位置,以及它们在哪里列出。 | +| `fields:types.select` | 选项 | The field type "Choice" is rendered 选项, the same word as fields:dialog.options ("Options") inside the same dialog. 单选/多选 or 选择 would separate the type from its option list. | | +| `listings:structuredData.richResults` | 在 Google 的 Rich Results Test 中测试 | Google's Chinese UI calls the tool 富媒体搜索结果测试; keeping the English name is acceptable as a product name but the localized one is what Chinese users see. | 在 Google 富媒体搜索结果测试中测试 | +| `build:chat.playgroundHint` | “用 AI 构建”依赖 Workers AI,而演练场不提供它。将 Cloudhal 部署到你的 Cloudflare 账户即可使用。 | 演练场 is used here, while zh-Hans.ts core (playground.*) keeps "playground" in English; pick one rendering for the playground across Studio. | | + +
+ +### Hindi (`hi`) + +collection is संग्रह in 38 keys but कलेक्शन in 8 (errors, tools, fields); entry is एंट्री in 45 keys but प्रविष्टि in 21 (all core/collections) — unified on the majority, though प्रविष्टि would pair better with संग्रह if a native reviewer prefers. approve mixes मंज़ूर/मंज़ूरी (button, majority) with स्वीकृत in 3 keys. Security strings (selfRegistered, lookalike, offline 90-day limit, never beyond your role, sign-up closes) are faithful. + +
37 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `core:errors.api.unknown_field` | इस कलेक्शन में इस कुंजी वाला कोई फ़ील्ड नहीं है। | इस संग्रह में इस कुंजी वाला कोई फ़ील्ड नहीं है। | Uses the transliteration कलेक्शन; 38 other keys (nav, collection list, settings, listings) use संग्रह for collection. | +| `core:errors.api.too_many_fields` | यह किसी कलेक्शन या साइट की सीमा से ज़्यादा फ़ील्ड हैं। | यह किसी संग्रह या साइट की सीमा से ज़्यादा फ़ील्ड हैं। | Uses the transliteration कलेक्शन; 38 other keys (nav, collection list, settings, listings) use संग्रह for collection. | +| `core:errors.api.operation_in_progress` | इस कलेक्शन में एक और फ़ील्ड बदलाव अभी चल रहा है। | इस संग्रह में एक और फ़ील्ड बदलाव अभी चल रहा है। | Uses the transliteration कलेक्शन; 38 other keys (nav, collection list, settings, listings) use संग्रह for collection. | +| `core:tools.list_collections` | कलेक्शन की सूची | संग्रहों की सूची | Uses the transliteration कलेक्शन; 38 other keys (nav, collection list, settings, listings) use संग्रह for collection. | +| `core:tools.create_collection` | कलेक्शन बनाएँ | संग्रह बनाएँ | Uses the transliteration कलेक्शन; 38 other keys (nav, collection list, settings, listings) use संग्रह for collection. | +| `core:tools.update_collection` | कलेक्शन बदलें | संग्रह बदलें | Uses the transliteration कलेक्शन; 38 other keys (nav, collection list, settings, listings) use संग्रह for collection. | +| `fields:issues.unknown_field` | इस कलेक्शन में ऐसा कोई फ़ील्ड नहीं है। | इस संग्रह में ऐसा कोई फ़ील्ड नहीं है। | Uses the transliteration कलेक्शन; 38 other keys (nav, collection list, settings, listings) use संग्रह for collection. | +| `fields:builder.description` | इस कलेक्शन की एंट्री के अपने फ़ील्ड, उसी क्रम में जिसमें एडिटर उन्हें दिखाता है। एजेंट भी इन्हें पढ़ते हैं। | इस संग्रह की एंट्री के अपने फ़ील्ड, उसी क्रम में जिसमें एडिटर उन्हें दिखाता है। एजेंट भी इन्हें पढ़ते हैं। | Uses the transliteration कलेक्शन; 38 other keys (nav, collection list, settings, listings) use संग्रह for collection. | +| `core:collectionList.description` | “{key}” संग्रह की प्रविष्टियाँ। | “{key}” संग्रह की एंट्री। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `core:collectionList.newEntry` | नई प्रविष्टि | नई एंट्री | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `core:collectionList.search` | प्रविष्टियाँ खोजें | एंट्री खोजें | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `core:collectionList.empty` | अभी कोई प्रविष्टि नहीं | अभी कोई एंट्री नहीं | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:description` | साइट में रखी जाने वाली सामग्री के प्रकार: लेख, इवेंट, टीम, जॉब, या अपनी प्रविष्टियों वाली कोई भी चीज़। हर संग्रह की अपनी सूची, अपना पता और अपनी सेटिंग्स होती हैं। | साइट में रखी जाने वाली सामग्री के प्रकार: लेख, इवेंट, टीम, जॉब, या अपनी एंट्री वाली कोई भी चीज़। हर संग्रह की अपनी सूची, अपना पता और अपनी सेटिंग्स होती हैं। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:columns.entries` | प्रविष्टियाँ | एंट्री | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:entries` | {count, plural, one {# प्रविष्टि} other {# प्रविष्टियाँ}} | {count, plural, one {# एंट्री} other {# एंट्री}} | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:inferredHint` | प्रविष्टियाँ मौजूद हैं, लेकिन इस संग्रह को अभी तक नाम नहीं दिया गया है। नाम देने के लिए इसकी सेटिंग्स खोलें। | एंट्री मौजूद हैं, लेकिन इस संग्रह को अभी तक नाम नहीं दिया गया है। नाम देने के लिए इसकी सेटिंग्स खोलें। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:create.description` | सामग्री का एक नया प्रकार, जिसकी अपनी सूची साइडबार में दिखती है। संग्रह बनने के बाद एजेंट उसमें प्रविष्टियाँ लिख सकते हैं। | सामग्री का एक नया प्रकार, जिसकी अपनी सूची साइडबार में दिखती है। संग्रह बनने के बाद एजेंट उसमें एंट्री लिख सकते हैं। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:create.singular` | एक प्रविष्टि को कहा जाता है | एक एंट्री को कहा जाता है | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:create.addressHint` | प्रविष्टियाँ इस उपसर्ग और उसके बाद अपने स्लग पर रहती हैं। | एंट्री इस उपसर्ग और उसके बाद अपने स्लग पर रहती हैं। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:create.createdDescription` | {name} साइडबार में है। उसकी पहली प्रविष्टि जोड़ें। | {name} साइडबार में है। उसकी पहली एंट्री जोड़ें। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:settings.description` | इस संग्रह का नाम कैसे रखा जाता है, उसकी प्रविष्टियाँ कहाँ रहती हैं और उन्हें कौन सूचीबद्ध करता है। | इस संग्रह का नाम कैसे रखा जाता है, उसकी एंट्री कहाँ रहती हैं और वे कहाँ सूचीबद्ध होती हैं। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. Also: 'what lists them' (which lists/feeds) was rendered with कौन (who); reworded to 'where they are listed'. | +| `collections:settings.listingDescription` | संग्रह की प्रविष्टियाँ सार्वजनिक साइट पर कहाँ दिखती हैं। | संग्रह की एंट्री सार्वजनिक साइट पर कहाँ दिखती हैं। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:settings.feedHint` | साइट की फ़ीड में, यह चालू रखने वाले हर संग्रह की सबसे नई प्रविष्टियाँ आती हैं। | साइट की फ़ीड में, यह चालू रखने वाले हर संग्रह की सबसे नई एंट्री आती हैं। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:settings.sitemapHint` | खोज इंजन प्रकाशित प्रविष्टियाँ sitemap.xml से खोजते हैं। | खोज इंजन प्रकाशित एंट्री sitemap.xml से खोजते हैं। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:settings.taxonomiesDescription` | इस संग्रह की प्रविष्टियाँ कौन-से वर्गीकरण उपयोग करती हैं। जिस वर्गीकरण में संग्रहों की सूची नहीं है, वह सभी पर लागू होता है। | इस संग्रह की एंट्री कौन-से वर्गीकरण उपयोग करती हैं। जिस वर्गीकरण में संग्रहों की सूची नहीं है, वह सभी पर लागू होता है। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:settings.commentsDescription` | क्या पाठक इस संग्रह की प्रविष्टियों पर टिप्पणी कर सकते हैं, और थ्रेड कब बंद होते हैं। साइट की टिप्पणी सेटिंग्स के साथ सहेजा जाता है। | क्या पाठक इस संग्रह की एंट्री पर टिप्पणी कर सकते हैं, और थ्रेड कब बंद होते हैं। साइट की टिप्पणी सेटिंग्स के साथ सहेजा जाता है। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:settings.commentsEnabledHint` | पाठक प्रकाशित प्रविष्टियों पर टिप्पणी कर सकते हैं। हर प्रविष्टि अब भी अपना थ्रेड खोल, बंद या छिपा सकती है। | पाठक प्रकाशित एंट्री पर टिप्पणी कर सकते हैं। हर एंट्री अब भी अपना थ्रेड खोल, बंद या छिपा सकती है। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:settings.commentsCloseAfterHint` | हर प्रविष्टि की प्रकाशन तिथि से गिना जाता है। “साइट के समान” साइट सेटिंग्स › टिप्पणियाँ का पालन करता है। | हर एंट्री की प्रकाशन तिथि से गिना जाता है। “साइट के समान” साइट सेटिंग्स › टिप्पणियाँ का पालन करता है। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `collections:settings.addressDescription` | प्रविष्टियाँ कहाँ रहती हैं। इसे बदलने से उनके सार्वजनिक URL बदल जाते हैं: पुराने पते स्थायी रीडायरेक्ट से उत्तर देते हैं। | एंट्री कहाँ रहती हैं। इसे बदलने से उनके सार्वजनिक URL बदल जाते हैं: पुराने पते स्थायी रीडायरेक्ट से उत्तर देते हैं। | entry is rendered प्रविष्टि here (21 keys, all in core/collections) but एंट्री in 45 keys (fields, listings, approvals, errors). Unified on the majority एंट्री; a native reviewer may instead choose प्रविष्टि and flip the other 45. | +| `oauthConsent:who.lookalike` | यह नाम {client} जैसा दिखता है, लेकिन कोई भी किसी भी नाम से क्लाइंट पंजीकृत कर सकता है। केवल तभी स्वीकृत करें जब आपने यह कनेक्शन खुद {client} से शुरू किया हो और ऊपर दिखाया गया वापसी पता वही हो जिसका वह उपयोग करता है। | यह नाम {client} जैसा दिखता है, लेकिन कोई भी किसी भी नाम से क्लाइंट पंजीकृत कर सकता है। केवल तभी मंज़ूर करें जब आपने यह कनेक्शन खुद {client} से शुरू किया हो और ऊपर दिखाया गया वापसी पता वही हो जिसका वह उपयोग करता है। | Meaning and the restriction are intact, but it tells the user to स्वीकृत करें while the button it refers to is मंज़ूर करें (oauthConsent:approve) and the sibling warning loopbackWarning says मंज़ूरी तभी दें. Use the button's verb. | +| `connectedAgents:setup.description` | किसी ऐप को इस Studio का MCP URL दें और उसके पूछने पर स्वीकृत करें, या उन स्क्रिप्ट और क्लाइंट के लिए एजेंट कुंजी बनाएं जो साइन इन नहीं कर सकते। | किसी ऐप को इस Studio का MCP URL दें और उसके पूछने पर मंज़ूरी दें, या उन स्क्रिप्ट और क्लाइंट के लिए एजेंट कुंजी बनाएं जो साइन इन नहीं कर सकते। | approve is मंज़ूरी/मंज़ूर करें everywhere else (button, emptyDescription, hints); स्वीकृत करें here breaks the term. | +| `connectedAgents:setup.hints.cursor` | इसे ~/.cursor/mcp.json या किसी प्रोजेक्ट में .cursor/mcp.json के रूप में सहेजें, फिर Cursor के कहने पर साइन इन करें। स्वीकृति के लिए Studio खुलता है। | इसे ~/.cursor/mcp.json या किसी प्रोजेक्ट में .cursor/mcp.json के रूप में सहेजें, फिर Cursor के कहने पर साइन इन करें। मंज़ूरी के लिए Studio खुलता है। | The other four hints say मंज़ूरी के लिए Studio खोलता है; this one says स्वीकृति के लिए. | +| `core:pageHeaders.articles.description` | पोस्ट और अन्य प्रविष्टियाँ, जो लोगों या एजेंटों ने लिखीं और साइट के साथ प्रकाशित होती हैं। | पोस्ट और अन्य एंट्री, जो लोगों या एजेंटों ने लिखीं और साइट के साथ प्रकाशित होती हैं। | Outside the 494 keys: a collection entry is एंट्री in the rest of Studio's Hindi (glossary). | +| `core:siteSettings.collections.description` | साइट पर हर संग्रह की प्रविष्टियाँ कहाँ रहती हैं। उपसर्ग बदलने से उस संग्रह की हर प्रविष्टि का पता बदल जाता है; पुराने पते स्थायी रीडायरेक्ट के ज़रिए काम करते रहते हैं। डिफ़ॉल्ट, यानी संग्रह के अपने नाम के लिए फ़ील्ड खाली छोड़ें। नए पते अगले प्रकाशन के साथ लाइव होते हैं। | साइट पर हर संग्रह की एंट्री कहाँ रहती हैं। उपसर्ग बदलने से उस संग्रह की हर एंट्री का पता बदल जाता है; पुराने पते स्थायी रीडायरेक्ट के ज़रिए काम करते रहते हैं। डिफ़ॉल्ट, यानी संग्रह के अपने नाम के लिए फ़ील्ड खाली छोड़ें। नए पते अगले प्रकाशन के साथ लाइव होते हैं। | Outside the 494 keys: a collection entry is एंट्री in the rest of Studio's Hindi (glossary). | +| `core:siteSettings.collections.preview` | प्रविष्टियाँ {url} जैसे पतों पर हैं | एंट्री {url} जैसे पतों पर हैं | Outside the 494 keys: a collection entry is एंट्री in the rest of Studio's Hindi (glossary). | +| `core:siteSettings.collections.previewMoved` | प्रविष्टियाँ {url} जैसे पतों पर होंगी। पुराना पता {old} वहाँ रीडायरेक्ट करता है। | एंट्री {url} जैसे पतों पर होंगी। पुराना पता {old} वहाँ रीडायरेक्ट करता है। | Outside the 494 keys: a collection entry is एंट्री in the rest of Studio's Hindi (glossary). | +| `core:siteSettings.collections.emptyDescription` | साइट पर लेख या अन्य प्रविष्टियाँ होने पर संग्रह यहाँ दिखते हैं। | साइट पर लेख या अन्य एंट्री होने पर संग्रह यहाँ दिखते हैं। | Outside the 494 keys: a collection entry is एंट्री in the rest of Studio's Hindi (glossary). | + +
+ +
8 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `oauthConsent:who.registered` | इस Studio में रजिस्टर्ड | Shown next to its counterpart 'स्वयं पंजीकृत, सत्यापित नहीं'. Using two different words (रजिस्टर्ड vs पंजीकृत) for the same idea weakens the contrast; consider 'इस Studio में पंजीकृत' (and the same in core:account.access.featureHints.mcpOauth). | | +| `listings:contentList.ops.lte` | {kind, select, time {को या उससे पहले है} number {अधिकतम है} other {अधिकतम है}} | lt/gt use the postposition pattern (से कम है / से ज़्यादा है) while lte/gte use adverbs (अधिकतम है / कम से कम है). In the Field \| operator \| value row Hindi postpositions read before the value; a native reviewer should check the row reads naturally, e.g. 'से ज़्यादा नहीं है' / 'से कम नहीं है' for at most / at least. | | +| `listings:contentList.ops.gte` | {kind, select, time {को या उसके बाद है} number {कम से कम है} other {कम से कम है}} | See ops.lte: mixed adverb/postposition patterns across the operator set. | | +| `listings:contentList.asc` | {kind, select, time {सबसे पुराने पहले} number {सबसे छोटे पहले} other {सबसे छोटे पहले}} | 'Earliest first' for dates that may be in the future (events) reads oddly as सबसे पुराने (oldest). Consider 'सबसे पहले की तारीख़ पहले' or 'सबसे शुरुआती पहले'. | | +| `listings:expiry.past` | {count, plural, =0 {अभी कोई प्रकाशित एंट्री इसके पार नहीं गई है।} one {# प्रकाशित एंट्री पहले ही इसके पार जा चुकी है।} other {# प्रकाशित एंट्री पहले ही इसके पार जा चुकी हैं।}} | इसके पार जाना (cross over it) is literal; 'जिनकी तारीख़ बीत चुकी है' would read more naturally. | | +| `collections:icons.megaphone` | लाउडस्पीकर | The icon is a megaphone; मेगाफ़ोन (or भोंपू) is closer than लाउडस्पीकर. | | +| `connectedAgents:setup.needsPublicUrl` | Claude.ai और ChatGPT अपने सर्वर से जुड़ते हैं, जो {url} तक नहीं पहुँच सकते। Studio को --base-url के साथ किसी सार्वजनिक https:// पते पर चलाएँ, या इसी कंप्यूटर के किसी ऐप का उपयोग करें, जैसे Claude Code या Codex। | EN means start Studio with --base-url set to a public address; the draft reads as running Studio at that address. Suggest 'Studio को --base-url किसी सार्वजनिक https:// पते पर सेट करके शुरू करें'. | | +| `listings:structuredData.type` | टाइप | Structured-data keys use टाइप while field types use प्रकार (11 keys). They are different concepts, so this may be deliberate; a reviewer may prefer प्रकार throughout. | | + +
+ +### Indonesian (`id`) + +Terms are consistent (Koleksi, Entri, Kolom, Kolom daftar, Kedaluwarsa). Problems: 'belum diverifikasi' (not yet verified) in the three verification labels, bare 'Putuskan' (reads as 'decide') for Disconnect, 'daftar/mendaftarkan' used for 'listing' where it means registration, and four keys slipping from 'Anda' to 'kamu/-mu'. + +
15 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `connectedAgents:selfRegistered` | Terdaftar sendiri, belum diverifikasi | Terdaftar sendiri, tidak terverifikasi | 'belum diverifikasi' means 'not yet verified' and suggests a verification step is pending. A self-registered client is never verified by anyone; the label must be a plain negation. | +| `oauthConsent:who.selfRegistered` | Terdaftar sendiri, belum diverifikasi | Terdaftar sendiri, tidak terverifikasi | Same as connectedAgents:selfRegistered: 'belum' (not yet) softens 'not verified'. | +| `connectedAgents:lookalike` | Tampak seperti {client}, tetapi belum diverifikasi sebagai aplikasi tersebut | Tampak seperti {client}, tetapi tidak terverifikasi sebagai aplikasi tersebut | 'belum diverifikasi' (not yet verified) softens the warning; use the plain negation, consistent with selfRegistered. | +| `connectedAgents:disconnect` | Putuskan | Putuskan koneksi | 'Putuskan' on its own is the imperative of memutuskan, which most readers take as 'decide'. Indonesian UIs say 'Putuskan koneksi' (or 'Putuskan sambungan') for Disconnect. | +| `connectedAgents:disconnectLabel` | Putuskan {client} | Putuskan koneksi {client} | Same ambiguity as connectedAgents:disconnect. | +| `connectedAgents:description` | Aplikasi yang Anda hubungkan lewat URL, seperti Claude, ChatGPT, atau Cursor. Masing-masing bekerja sebagai Anda, tidak pernah melampaui peran Anda, sampai Anda memutuskannya. | Aplikasi yang Anda hubungkan lewat URL, seperti Claude, ChatGPT, atau Cursor. Masing-masing bekerja sebagai Anda, tidak pernah melampaui peran Anda, sampai Anda memutus koneksinya. | 'sampai Anda memutuskannya' reads as 'until you decide it'; the 'never beyond your role' part is intact. Say disconnect explicitly. | +| `connectedAgents:allDescription` | Koneksi setiap anggota. Memutuskan salah satunya langsung mengakhirinya; anggotanya dapat menghubungkannya lagi. | Koneksi setiap anggota. Memutus koneksi salah satunya langsung mengakhirinya; anggotanya dapat menghubungkannya lagi. | 'Memutuskan salah satunya' is ambiguous (decide/disconnect); align with 'Putuskan koneksi'. | +| `collections:settings.listing` | Pendaftaran | Pencantuman | 'Pendaftaran' means registration/sign-up, not where entries are listed. The section is about where entries appear (feeds, sitemap). | +| `collections:settings.description` | Bagaimana koleksi ini dinamai, di mana entrinya berada, dan apa yang mendaftarkannya. | Bagaimana koleksi ini dinamai, di mana entrinya berada, dan apa yang mencantumkannya. | 'mendaftarkan' means 'to register'; 'what lists them' is 'mencantumkan'. | +| `listings:listFields.full` | Sudah 4 kolom, jumlah maksimum yang bisa didaftarkan koleksi. | Sudah 4 kolom, jumlah maksimum untuk satu koleksi. | 'didaftarkan' means 'registered'; the limit is on listing fields per collection. | +| `fields:builder.saveFirst` | Simpan atau buang perubahanmu sebelum mengganti nama, mengubah jenis, atau menghapus kolom. | Simpan atau buang perubahan Anda sebelum mengganti nama, mengubah jenis, atau menghapus kolom. | The file uses formal 'Anda' (22 keys); '-mu' breaks it. | +| `fields:operation.snapshotNote` | Snapshot dibuat sebelum dan sesudahnya, jadi kamu bisa membatalkannya. Situs langsung baru berubah saat kamu menerbitkan. | Snapshot dibuat sebelum dan sesudahnya, jadi Anda bisa membatalkannya. Situs live baru berubah saat Anda menerbitkan. | Uses informal 'kamu' against the file's 'Anda'; also 'Situs langsung' (direct site) for 'live site', where other keys say 'live' (Server live situs ini). | +| `oauthConsent:who.lookalike` | Namanya mirip {client}, tetapi siapa pun bisa mendaftarkan klien dengan nama apa pun. Setujui hanya jika kamu sendiri memulai koneksi ini dari {client} dan alamat tujuan kembali yang ditampilkan di atas adalah yang dipakainya. | Namanya mirip {client}, tetapi siapa pun bisa mendaftarkan klien dengan nama apa pun. Setujui hanya jika Anda sendiri memulai koneksi ini dari {client} dan alamat tujuan kembali yang ditampilkan di atas adalah yang dipakainya. | Meaning, 'siapa pun ... nama apa pun' and the 'Setujui hanya jika' restriction are intact, but it switches to informal 'kamu' on the consent screen where every sibling uses 'Anda'. | +| `oauthConsent:who.thisComputerApp` | Mengembalikanmu ke aplikasi di komputer ini ({scheme}:) | Mengembalikan Anda ke aplikasi di komputer ini ({scheme}:) | 'Mengembalikanmu' is informal; its sibling thisComputer says 'Mengembalikan Anda'. | +| `oauthConsent:who.loopbackWarning` | Setiap alamat tujuan agen ini mengembalikan Anda ada di komputer ini. Setujui hanya jika Anda memulai koneksi dari aplikasi di sini. | Setiap alamat tempat agen ini dapat mengembalikan Anda ada di komputer ini. Setujui hanya jika Anda memulai koneksi dari aplikasi di sini. | The first sentence lacks a relative construction and drops 'can' ('can send you back to'); a native speaker would call it ungrammatical. The restriction 'Setujui hanya jika' is fine. | + +
+ +
5 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `connectedAgents:disconnectedDescription` | {client} tidak dapat bekerja lagi di Studio ini. Jika meminta terhubung lagi, Anda memutuskan lagi. | Correct, but 'memutuskan' here means 'decide' right after the Disconnect action used the same verb; 'Anda yang menentukan lagi' avoids the clash. | | +| `status:backBy` | Kembali pada {time} | 'by {time}' means at the latest; 'pada' promises an exact time. Consider 'Kembali paling lambat {time}'. | | +| `fields:operation.revert` | Batalkan | 'Batalkan' is also the usual word for Cancel, so a Revert button next to a Close/Cancel can be misread. Consider 'Kembalikan' (and 'Dikembalikan', 'Mengembalikan…' for revertedTitle/reverting). | | +| `listings:listFields.description` | Hingga 4 kolom yang bisa dipakai daftar untuk memfilter dan mengurutkan: kolom tabel di daftar koleksi ini, kondisi di bagian daftar konten, dan kueri agen. | field = 'kolom' also means column; the draft disambiguates with 'kolom tabel', which works, but a reviewer may prefer 'isian'/'bidang' for field. Kept 'kolom' as it is used consistently in ~80 keys. | | +| `listings:structuredData.sources.default` | Bawaan: {source} | 'Bawaan' here vs 'default' in collections:settings.sort (Urutan default). Pick one. | | + +
+ +### Arabic (`ar`) + +Core terms are consistent and the security strings are faithful (غير مُتحقَّق منه, أي أحد ... بأي اسم, وافق فقط إذا, 90 يومًا على الأكثر, لا يتجاوز دورك أبدًا, يُغلق التسجيل). Inconsistencies: entry becomes عنصر in three comment keys, theme alternates السمات/القوالب, computer alternates الحاسوب/الكمبيوتر, deploy alternates وزّع/انشر. + +
7 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `collections:settings.commentsDescription` | هل يمكن للقرّاء التعليق على عناصر هذه المجموعة، ومتى تُغلق السلاسل. تُحفظ مع إعدادات التعليقات في الموقع. | هل يمكن للقرّاء التعليق على إدخالات هذه المجموعة، ومتى تُغلق السلاسل. تُحفظ مع إعدادات التعليقات في الموقع. | entry is إدخال in every other key (~90); these comment-settings keys switch to عنصر/العناصر (item). | +| `collections:settings.commentsEnabledHint` | يمكن للقرّاء التعليق على العناصر المنشورة. ويظل بإمكان كل عنصر فتح سلسلته أو إغلاقها أو إخفاؤها. | يمكن للقرّاء التعليق على الإدخالات المنشورة. ويظل بإمكان كل إدخال فتح سلسلته أو إغلاقها أو إخفاؤها. | entry is إدخال in every other key (~90); these comment-settings keys switch to عنصر/العناصر (item). | +| `collections:settings.commentsCloseAfterHint` | تُحسب من تاريخ نشر كل عنصر. «مثل الموقع» يتبع إعدادات الموقع › التعليقات. | تُحسب من تاريخ نشر كل إدخال. «مثل الموقع» يتبع إعدادات الموقع › التعليقات. | entry is إدخال in every other key (~90); these comment-settings keys switch to عنصر/العناصر (item). | +| `fields:dialog.keyHint` | الاسم الذي يستخدمه الوكلاء والقوالب لهذا الحقل. بصيغة lowerCamelCase مثل startsAt؛ ولا يمكن تعديله بعد الحفظ. | الاسم الذي يستخدمه الوكلاء والسمات لهذا الحقل. بصيغة lowerCamelCase مثل startsAt؛ ولا يمكن تعديله بعد الحفظ. | theme is السمات/سمتك in 4 keys (collections keyHint, namesDescription, sortHint, structuredData.themeReminder); these say القوالب (templates). | +| `fields:operation.themeWarning` | القوالب التي تقرأ entry.fields.{key} مباشرة تتوقف عن عرضه حتى تُحدَّث. القوالب التي تستخدم entryFields تستمر في العمل. | السمات التي تقرأ entry.fields.{key} مباشرة تتوقف عن عرضه حتى تُحدَّث. السمات التي تستخدم entryFields تستمر في العمل. | theme is السمات/سمتك in 4 keys (collections keyHint, namesDescription, sortHint, structuredData.themeReminder); these say القوالب (templates). | +| `fields:operation.descriptions.remove_field` | ستُزال الحقل وقيمته في كل إدخال. | سيُزال الحقل وقيمته في كل إدخال. | الحقل is masculine; the verb must be سيُزال, not ستُزال. | +| `oauthConsent:who.thisComputerApp` | يعيدك إلى تطبيق على هذا الكمبيوتر ({scheme}:) | يعيدك إلى تطبيق على هذا الحاسوب ({scheme}:) | Its siblings on the same consent screen (who.thisComputer, who.loopbackWarning) say الحاسوب; this one says الكمبيوتر. | + +
+ +
6 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `build:chat.playgroundHint` | تعمل ميزة «ابنِ بالذكاء الاصطناعي» على Workers AI، وهو غير متاح في بيئة التجربة. انشر Cloudhal على حسابك في Cloudflare لاستخدامها. | deploy is وزّع in errors.api.gates_unsupported and listings:expiry.gatesUnsupported, while publish is نشر everywhere; 'انشر Cloudhal' can read as publish. Consider 'وزّع Cloudhal على حسابك في Cloudflare' (also 'عند تشغيل Cloudhal أو نشره' in core:auth.setupDescription). | | +| `status:notPublished.body` | لم يُنشر هذا الموقع بعد. عُد للزيارة قريبًا. | Public status pages address an unknown visitor; the masculine singular imperative عُد is common but a neutral 'يُرجى العودة قريبًا' avoids gendering. Same for status:comingSoon.body. | | +| `status:maintenance.body` | هذا الموقع قيد الصيانة. شكرًا لصبرك. | For the public page, 'شكرًا لصبركم' or 'نشكركم على صبركم' is the usual neutral form. | | +| `connectedAgents:emptyDescription` | أضف عنوان MCP URL لهذا الـStudio إلى Claude أو ChatGPT أو Cursor أو VS Code. توافق على كل اتصال هنا. | 'عنوان MCP URL' doubles 'address'; setup.url says 'MCP URL' and setup.description 'عنوان MCP'. Pick one form (e.g. 'عنوان MCP URL' everywhere or 'MCP URL'). | | +| `fields:dialog.errors.options.value` | تستخدم القيم أحرفًا لاتينية صغيرة وأرقامًا وشرطات. | hyphens are واصلات in collections:create.keyHint/keyInvalid but شرطات here; also 'أحرف إنجليزية' there vs 'أحرف لاتينية' here. | | +| `connectedAgents:setup.needsPublicUrl` | يتصل Claude.ai وChatGPT من خوادمهما الخاصة، التي لا يمكنها الوصول إلى {url}. شغّل Studio مع --base-url مضبوطًا على عنوان https:// عام، أو استخدم تطبيقًا على هذا الكمبيوتر مثل Claude Code أو Codex. | Uses الكمبيوتر while the consent screen uses الحاسوب; harmonise if one is chosen for the whole UI. | | + +
+ +### Persian (`fa`) + +"entry" is split: 41 keys use ورودی (core list, collections, listings) and 25 use مطلب (almost all of the fields namespace, plus comment settings and two core errors); the findings align them to the majority ورودی, though a native reviewer may prefer مطلب everywhere (it reads more naturally) and then flip the whole set the other way. Also mixed: "theme" (قالب vs پوسته), "MCP URL" vs "نشانی MCP", "کلید عامل" vs "کلید agent", and a few keys slip from the file's formal شما register into informal تو. + +
29 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `connectedAgents:setup.description` | نشانی MCP این Studio را به یک برنامه بده و وقتی درخواست کرد تأییدش کن، یا برای اسکریپت‌ها و کلاینت‌هایی که نمی‌توانند وارد شوند یک کلید agent بساز. | MCP URL این Studio را به یک برنامه بدهید و وقتی درخواست کرد تأییدش کنید، یا برای اسکریپت‌ها و کلاینت‌هایی که نمی‌توانند وارد شوند یک کلید عامل بسازید. | Informal imperatives (بده/کن/بساز) break the file's formal شما register; leftover English 'agent' where every other key says کلید عامل; MCP URL rendered as نشانی MCP while setup.url and emptyDescription use MCP URL. | +| `connectedAgents:setup.hints.cursor` | آن را در ~/.cursor/mcp.json یا در یک پروژه در .cursor/mcp.json ذخیره کن، سپس وقتی Cursor خواست وارد شو. Studio برای تأیید باز می‌شود. | آن را در ~/.cursor/mcp.json یا در یک پروژه در .cursor/mcp.json ذخیره کنید، سپس وقتی Cursor خواست وارد شوید. Studio برای تأیید باز می‌شود. | Informal ذخیره کن / وارد شو; the other setup hints use the formal کنید form. | +| `oauthConsent:who.lookalike` | این نام شبیه {client} است، اما هر کسی می‌تواند کلاینتی با هر نامی ثبت کند. فقط وقتی تأیید کن که خودت این اتصال را از {client} شروع کرده‌ای و نشانی‌ای که تو را به آن برمی‌گرداند (بالا) همان نشانی‌ای است که استفاده می‌کند. | این نام شبیه {client} است، اما هر کسی می‌تواند کلاینتی با هر نامی ثبت کند. فقط وقتی تأیید کنید که خودتان این اتصال را از {client} شروع کرده‌اید و نشانی‌ای که شما را به آن برمی‌گرداند (در بالا) همان نشانی‌ای است که آن برنامه استفاده می‌کند. | Meaning and the 'only if' restriction are intact, but this security notice switches to informal تو/کن/خودت while the rest of oauthConsent (e.g. loopbackWarning) uses شما. Also makes 'the one it uses' refer clearly to the app. | +| `oauthConsent:who.thisComputerApp` | تو را به برنامه‌ای روی این رایانه برمی‌گرداند ({scheme}:) | شما را به برنامه‌ای در این رایانه برمی‌گرداند ({scheme}:) | Informal تو, while the sibling keys who.thisComputer and who.sendsBack use شما را. | +| `core:errors.api.field_key_reserved` | این کلید فیلد برای خود مطلب رزرو شده است. | این کلید فیلد برای خود ورودی رزرو شده است. | "entry" is ورودی in most keys (41 against 25 for مطلب). | +| `core:errors.api.field_values_unconvertible` | برخی مقدارها قابل تبدیل نیستند. اجازهٔ پاک‌کردنشان را بدهید یا اول آن مطالب را تغییر دهید. | برخی مقدارها قابل تبدیل نیستند. اجازهٔ پاک‌کردنشان را بدهید یا اول آن ورودی‌ها را تغییر دهید. | Term consistency: entry = ورودی. | +| `collections:settings.commentsDescription` | اینکه خوانندگان بتوانند برای مطالب این مجموعه دیدگاه بگذارند و گفتگوها کی بسته شوند. همراه تنظیمات دیدگاه سایت ذخیره می‌شود. | اینکه خوانندگان بتوانند برای ورودی‌های این مجموعه دیدگاه بگذارند و گفتگوها کی بسته شوند. همراه تنظیمات دیدگاه سایت ذخیره می‌شود. | Term consistency: the rest of the collections namespace says ورودی. | +| `collections:settings.commentsEnabledHint` | خوانندگان می‌توانند برای مطالب منتشرشده دیدگاه بگذارند. هر مطلب همچنان می‌تواند گفتگوی خودش را باز، بسته یا پنهان کند. | خوانندگان می‌توانند برای ورودی‌های منتشرشده دیدگاه بگذارند. هر ورودی همچنان می‌تواند گفتگوی خودش را باز، بسته یا پنهان کند. | Term consistency: entry = ورودی. | +| `collections:settings.commentsCloseAfterHint` | از تاریخ انتشار هر مطلب حساب می‌شود. «مانند سایت» از تنظیمات سایت › دیدگاه‌ها پیروی می‌کند. | از تاریخ انتشار هر ورودی حساب می‌شود. «مانند سایت» از تنظیمات سایت › دیدگاه‌ها پیروی می‌کند. | Term consistency: entry = ورودی. | +| `fields:issues.required_field` | لازم برای انتشار. مقداری وارد کنید یا مطلب را پیش‌نویس نگه دارید. | لازم برای انتشار. مقداری وارد کنید یا ورودی را پیش‌نویس نگه دارید. | Term consistency: entry = ورودی. | +| `fields:issues.too_large` | فیلدهای این مطلب روی هم خیلی بزرگ‌اند. | فیلدهای این ورودی روی هم خیلی بزرگ‌اند. | Term consistency: entry = ورودی. | +| `fields:builder.description` | فیلدهای اختصاصی مطالب این مجموعه، به ترتیبی که ویرایشگر نشان می‌دهد. عامل‌ها هم آن‌ها را می‌خوانند. | فیلدهای اختصاصی ورودی‌های این مجموعه، به ترتیبی که ویرایشگر نشان می‌دهد. عامل‌ها هم آن‌ها را می‌خوانند. | Term consistency: entry = ورودی. | +| `fields:builder.emptyDescription` | تاریخ، قیمت، سخنران یا هر چیزی که هر مطلب باید داشته باشد اضافه کنید. | تاریخ، قیمت، سخنران یا هر چیزی که هر ورودی باید داشته باشد اضافه کنید. | Term consistency: entry = ورودی. | +| `fields:builder.running` | {count, plural, =0 {مطالب در حال به‌روزرسانی‌اند.} one {# مطلب برای به‌روزرسانی مانده است.} other {# مطلب برای به‌روزرسانی مانده است.}} همین‌جا ادامه دهید، وگرنه با تغییر بعدی از سر گرفته می‌شود. | {count, plural, =0 {ورودی‌ها در حال به‌روزرسانی‌اند.} one {# ورودی برای به‌روزرسانی مانده است.} other {# ورودی برای به‌روزرسانی مانده است.}} همین‌جا ادامه دهید، وگرنه با تغییر بعدی از سر گرفته می‌شود. | Term consistency: entry = ورودی. | +| `fields:dialog.description` | برچسب‌ها و راهنما در ویرایشگر دیده می‌شوند و به عامل‌ها می‌گویند چه بنویسند. هر مطلب مقدار خودش را دارد. | برچسب‌ها و راهنما در ویرایشگر دیده می‌شوند و به عامل‌ها می‌گویند چه بنویسند. هر ورودی مقدار خودش را دارد. | Term consistency: entry = ورودی. | +| `fields:dialog.needsOperation` | در فیلدهای ذخیره‌شده این مورد از منوی فیلد تغییر می‌کند که اول مطالب را بررسی می‌کند. | در فیلدهای ذخیره‌شده این مورد از منوی فیلد تغییر می‌کند که اول ورودی‌ها را بررسی می‌کند. | Term consistency: entry = ورودی. | +| `fields:dialog.requiredHint` | مطالبِ در حال بازبینی یا منتشرشده به مقدار نیاز دارند. پیش‌نویس‌ها بدون آن ذخیره می‌شوند. | ورودی‌های در حال بازبینی یا منتشرشده به مقدار نیاز دارند. پیش‌نویس‌ها بدون آن ذخیره می‌شوند. | Term consistency: entry = ورودی. | +| `fields:dialog.searchableHint` | بازدیدکنندگان مطالب را با واژه‌های این فیلد پیدا می‌کنند. | بازدیدکنندگان ورودی‌ها را با واژه‌های این فیلد پیدا می‌کنند. | Term consistency: entry = ورودی. | +| `fields:dialog.multipleHint` | مطالب می‌توانند بیش از یک گزینه انتخاب کنند. | ورودی‌ها می‌توانند بیش از یک گزینه انتخاب کنند. | Term consistency: entry = ورودی. | +| `fields:dialog.errors.key.reserved` | این کلید برای خود مطلب رزرو شده است. کلید دیگری انتخاب کنید. | این کلید برای خود ورودی رزرو شده است. کلید دیگری انتخاب کنید. | Term consistency: entry = ورودی. | +| `fields:operation.descriptions.rename_field` | مقدار هر مطلب به کلید تازه منتقل می‌شود. چیزی تبدیل نمی‌شود. | مقدار هر ورودی به کلید تازه منتقل می‌شود. چیزی تبدیل نمی‌شود. | Term consistency: entry = ورودی. | +| `fields:operation.descriptions.change_field_type` | مقدار هر مطلب به نوع تازه تبدیل می‌شود. پیش از اجرا ببینید چه چیزی تغییر می‌کند. | مقدار هر ورودی به نوع تازه تبدیل می‌شود. پیش از اجرا ببینید چه چیزی تغییر می‌کند. | Term consistency: entry = ورودی. | +| `fields:operation.descriptions.remove_field` | فیلد و مقدارش در همهٔ مطالب حذف می‌شود. | فیلد و مقدارش در همهٔ ورودی‌ها حذف می‌شود. | Term consistency: entry = ورودی. | +| `fields:operation.checking` | در حال بررسی مطالب… | در حال بررسی ورودی‌ها… | Term consistency: entry = ورودی. | +| `fields:operation.running` | {count, plural, =0 {در حال به‌روزرسانی مطالب…} one {# مطلب به‌روز شد…} other {# مطلب به‌روز شد…}} | {count, plural, =0 {در حال به‌روزرسانی ورودی‌ها…} one {# ورودی به‌روز شد…} other {# ورودی به‌روز شد…}} | Term consistency: entry = ورودی. | +| `fields:operation.done` | {count, plural, =0 {هیچ مطلبی به تغییر نیاز نداشت.} one {# مطلب تغییر کرد.} other {# مطلب تغییر کرد.}} | {count, plural, =0 {هیچ ورودی‌ای به تغییر نیاز نداشت.} one {# ورودی تغییر کرد.} other {# ورودی تغییر کرد.}} | Term consistency: entry = ورودی. | +| `fields:operation.reverted` | {count, plural, =0 {فیلد به حالت قبل برگشت.} one {فیلد و # مطلب به حالت قبل برگشتند.} other {فیلد و # مطلب به حالت قبل برگشتند.}} | {count, plural, =0 {فیلد به حالت قبل برگشت.} one {فیلد و # ورودی به حالت قبل برگشتند.} other {فیلد و # ورودی به حالت قبل برگشتند.}} | Term consistency: entry = ورودی. | +| `fields:report.entries` | مطالب بررسی‌شده | ورودی‌های بررسی‌شده | Term consistency: entry = ورودی. | +| `fields:report.touched` | مطالبی که تغییر می‌کنند | ورودی‌هایی که تغییر می‌کنند | Term consistency: entry = ورودی. | + +
+ +
10 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `connectedAgents:selfRegistered` | خودثبت‌شده، تأییدنشده | The negation is clear, but تأیید is also this file's word for Approve (oauthConsent:approve), so تأییدنشده can read as 'not approved' rather than 'identity not verified'. A native reviewer may prefer احرازنشده / هویت تأییدنشده; the same applies to oauthConsent:who.selfRegistered and the lookalike keys. | خودثبت‌شده، احرازنشده | +| `connectedAgents:identifiedBy` | شناسایی‌شده با {host} | با reads as 'by means of / together with'; توسط makes clear that {host} is what identifies the app. The same applies to oauthConsent:who.fromHost. | شناسایی‌شده توسط {host} | +| `oauthConsent:scopes.offline` | متصل می‌ماند و دسترسی‌اش را خودش تمدید می‌کند، حداکثر ۹۰ روز، تا وقتی که اتصال لغو شود یا دسترسی شما تمام شود. | Meaning and the 90-day limit are correct. The number is written in Persian digits (۹۰), while every other hard-coded number in the file uses Western digits (4, 40, 10,080) and the registry formats fa with Western digits. Pick one convention. | | +| `listings:contentList.ops.lte` | {kind, select, time {در یا پیش از} number {حداکثر} other {حداکثر}} | 'در یا پیش از' (and 'در یا پس از' in ops.gte) is understandable but stiff; a native reviewer might prefer 'تا (و شامل)' / 'از (و شامل)' or 'هم‌زمان یا پیش از'. The operators also have no verb (است), which may read oddly after 'فقط ورودی‌هایی که'. | | +| `fields:operation.themeWarning` | پوسته‌هایی که entry.fields.{key} را مستقیم می‌خوانند، تا به‌روزرسانی آن را نشان نمی‌دهند. پوسته‌هایی که از entryFields استفاده می‌کنند کار می‌کنند. | 'Theme' is پوسته here and in fields:dialog.keyHint, but قالب in the collections keys and listings:structuredData.themeReminder. Also 'keep working' loses 'keep' (همچنان). | قالب‌هایی که entry.fields.{key} را مستقیم می‌خوانند، تا به‌روزرسانی نشوند آن را نشان نمی‌دهند. قالب‌هایی که از entryFields استفاده می‌کنند همچنان کار می‌کنند. | +| `fields:dialog.searchable` | در جست‌وجوی سایت بیاید | This is the only spelling جست‌وجو (elsewhere جستجو), and the subjunctive phrasing doesn't match the parallel toggles 'گنجاندن در فیدهای RSS' and 'گنجاندن در sitemap'. | گنجاندن در جستجوی سایت | +| `listings:expiry.graceHint` | این مدت پس از تاریخ صبر کنید تا ورودی پایان یابد. حداکثر 10,080 (یک هفته). | Read as an instruction for the user to wait, but it describes what the system does. | ورودی این مدت پس از تاریخ پایان می‌یابد. حداکثر 10,080 (یک هفته). | +| `listings:contentList.asc` | {kind, select, time {قدیمی‌ترین نخست} number {کوچک‌ترین نخست} other {کوچک‌ترین نخست}} | For dates that may be in the future (events), 'زودترین نخست' / 'دیرترین نخست' (earliest/latest) fits better than قدیمی‌ترین/جدیدترین (oldest/newest); the same applies to contentList.desc. Debatable. | | +| `collections:create.singular` | هر ورودی چه نامیده می‌شود | As a field label, an indirect question without a question mark reads unfinished. Optional. | نام هر ورودی | +| `fields:dialog.errors.key.pattern` | با حرف کوچک لاتین شروع کنید؛ فقط حرف و رقم، تا 40. | 'Lower-case letters' is حروف کوچک لاتین here and in errors.options.value, but حروف کوچک انگلیسی in collections:create.keyHint/keyInvalid. Choose one. | | + +
+ +### Hebrew (`he`) + +The terms are consistent overall: "entry" is רשומה everywhere except the three comment-settings keys, which use פריט. Other inconsistencies: "theme" (ערכת נושא vs ערכת עיצוב) and "MCP URL" vs "כתובת ה-MCP". The file speaks in gender-neutral plural imperatives or impersonal forms, but four keys slip into masculine-singular verbs. + +
11 fixed in this PR + +| Key | Was | Now | Why | +|---|---|---|---| +| `oauthConsent:who.lookalike` | השם נראה כמו {client}, אבל כל אחד יכול לרשום לקוח בכל שם. אשר רק אם אתה התחלת את החיבור הזה מ-{client} והכתובת שאליה הוא מחזיר אותך, המוצגת למעלה, היא זו שהוא משתמש בה. | השם נראה כמו {client}, אבל כל אחד יכול לרשום לקוח בכל שם. יש לאשר רק אם התחלת בעצמך את החיבור הזה מ-{client} והכתובת שאליה הוא מחזיר אותך, המוצגת למעלה, היא זו שהוא משתמש בה. | Meaning and the restriction are intact, but the masculine-only 'אשר ... אתה' breaks the file's gender-neutral register (loopbackWarning uses 'יש לאשר רק אם התחלת'). Using בעצמך keeps 'yourself'. | +| `connectedAgents:description` | אפליקציות שחיברת באמצעות URL, כמו Claude,‏ ChatGPT או Cursor. כל אחת פועלת בשמך, אף פעם לא מעבר לתפקיד שלך, עד שתנתק אותה. | אפליקציות שחיברת באמצעות URL, כמו Claude,‏ ChatGPT או Cursor. כל אחת פועלת בשמך, אף פעם לא מעבר לתפקיד שלך, עד שהיא מנותקת. | 'תנתק' is masculine-only. 'Never' is correctly kept. | +| `connectedAgents:setup.description` | תן לאפליקציה את כתובת ה-MCP של ה-Studio הזה ואשר אותה כשהיא מבקשת, או צור מפתח סוכן לסקריפטים וללקוחות שלא יכולים להתחבר. | תנו לאפליקציה את ה-MCP URL של ה-Studio הזה ואשרו אותה כשהיא מבקשת, או צרו מפתח סוכן לסקריפטים וללקוחות שלא יכולים להתחבר. | Masculine-singular imperatives (תן/אשר/צור), while the file uses plural imperatives (בדקו, שנו, הוסיפו). The draft also says 'כתובת ה-MCP', while setup.url and emptyDescription keep 'MCP URL'. | +| `connectedAgents:setup.hints.cursor` | שמור אותו בתור ~/.cursor/mcp.json, או ‎.cursor/mcp.json בפרויקט, ואז התחבר כש-Cursor מבקש. ‏Studio נפתח לאישור. | שומרים אותו בתור ~/.cursor/mcp.json, או ‎.cursor/mcp.json בפרויקט, ואז מתחברים כש-Cursor מבקש. ‏Studio נפתח לאישור. | Masculine imperatives; the sibling hints (claudeCode, codex, vscode, inspector) use the impersonal present (מריצים, שומרים). | +| `collections:settings.commentsDescription` | האם קוראים יכולים להגיב לפריטים באוסף הזה, ומתי שרשורים נסגרים. נשמר עם הגדרות התגובות של האתר. | האם קוראים יכולים להגיב לרשומות באוסף הזה, ומתי שרשורים נסגרים. נשמר עם הגדרות התגובות של האתר. | "entry" is רשומה in every other key; פריט appears only in the comment-settings keys. | +| `collections:settings.commentsEnabledHint` | קוראים יכולים להגיב לפריטים שפורסמו. כל פריט עדיין יכול לפתוח, לסגור או להסתיר את השרשור שלו. | קוראים יכולים להגיב לרשומות שפורסמו. כל רשומה עדיין יכולה לפתוח, לסגור או להסתיר את השרשור שלה. | Term consistency: entry = רשומה (feminine agreement adjusted). | +| `collections:settings.commentsCloseAfterHint` | נספר מתאריך הפרסום של כל פריט. „כמו באתר” פועל לפי הגדרות האתר › תגובות. | נספר מתאריך הפרסום של כל רשומה. „כמו באתר” פועל לפי הגדרות האתר › תגובות. | Term consistency: entry = רשומה. | +| `core:siteSettings.collections.description` | היכן נמצאים הפריטים של כל אוסף באתר. שינוי קידומת מעביר את הכתובת של כל פריט באוסף; הכתובות הישנות ממשיכות לעבוד באמצעות הפניה קבועה. השאירו שדה ריק לברירת המחדל, שם האוסף עצמו. הכתובות החדשות עולות לאוויר בפרסום הבא. | היכן נמצאות הרשומות של כל אוסף באתר. שינוי קידומת מעביר את הכתובת של כל רשומה באוסף; הכתובות הישנות ממשיכות לעבוד באמצעות הפניה קבועה. השאירו שדה ריק לברירת המחדל, שם האוסף עצמו. הכתובות החדשות עולות לאוויר בפרסום הבא. | Outside the 494 keys: an entry is רשומה everywhere else in Studio's Hebrew, not פריט. | +| `core:siteSettings.collections.preview` | הפריטים נמצאים בכתובות כמו {url} | הרשומות נמצאות בכתובות כמו {url} | Outside the 494 keys: an entry is רשומה everywhere else in Studio's Hebrew, not פריט. | +| `core:siteSettings.collections.previewMoved` | הפריטים יהיו בכתובות כמו {url}. הכתובת הישנה {old} מפנה לשם. | הרשומות יהיו בכתובות כמו {url}. הכתובת הישנה {old} מפנה לשם. | Outside the 494 keys: an entry is רשומה everywhere else in Studio's Hebrew, not פריט. | +| `core:siteSettings.collections.emptyDescription` | אוספים יופיעו כאן כשיהיו באתר מאמרים או פריטים אחרים. | אוספים יופיעו כאן כשיהיו באתר מאמרים או רשומות אחרות. | Outside the 494 keys: an entry is רשומה everywhere else in Studio's Hebrew, not פריט. | + +
+ +
9 for the reviewer + +| Key | Draft | Note | Possible wording | +|---|---|---|---| +| `core:auth.setupDescription` | קישור ההגדרה שהוצג כש־Cloudhal הופעל או נפרס נפתח. החשבון שנוצר עכשיו הופך לבעלים; לאחר מכן ההרשמה נסגרת. | Meaning is kept ('sign-up closes afterwards' is intact), but the passive verb at the end ('...נפתח') is clumsy, and 'שנוצר' is ambiguous between 'was created' and 'is created'. 'הגדרה' alone can read as 'settings'; 'הגדרה ראשונית' makes clear it is the first-time setup. | פתחת את קישור ההגדרה הראשונית שהוצג כש־Cloudhal הופעל או נפרס. החשבון שייווצר עכשיו יהפוך לבעלים; לאחר מכן ההרשמה תיסגר. | +| `oauthConsent:scopes.sites` | {count, plural, one {הוא מגיע רק לאתר שאת/ה עובד/ת עליו.} two {הוא מגיע רק לשני האתרים שאת/ה עובד/ת עליהם.} other {הוא מגיע רק ל-# האתרים שאת/ה עובד/ת עליהם.}} | Meaning is correct ('only' is kept). Slash forms (את/ה עובד/ת) appear nowhere else in the file. The suggestion uses the plural that the file's imperatives use; a native reviewer may prefer a singular gender-neutral wording to match the rest of oauthConsent (שלך / התחלת). | {count, plural, one {הוא מגיע רק לאתר שאתם עובדים עליו.} two {הוא מגיע רק לשני האתרים שאתם עובדים עליהם.} other {הוא מגיע רק ל-# האתרים שאתם עובדים עליהם.}} | +| `oauthConsent:description` | סוכן מבקש לעבוד ב-Studio הזה בשמך. כדאי לבדוק מה מותר לו לפני האישור. | 'כדאי' (it's advisable) is slightly softer than the EN imperative 'Check'. Minor. | סוכן מבקש לעבוד ב-Studio הזה בשמך. בדקו מה מותר לו לפני האישור. | +| `listings:contentList.ops.lte` | {kind, select, time {ב- או לפני} number {לכל היותר} other {לכל היותר}} | A dangling prefix 'ב- או לפני' (and 'ב- או אחרי' in ops.gte) is understandable but unusual in a dropdown; alternatives are 'לא אחרי' / 'לא לפני' or 'עד (כולל)' / 'החל מ'. Native choice. | | +| `fields:operation.revert` | ביטול | ביטול is the standard word for the Cancel button, but this button reverts a finished field change (with a snapshot). A user may take it for 'close without action'. Also check revertedTitle (בוטל) and reverting (מבטלים…). | החזרה למצב הקודם | +| `fields:builder.running` | {count, plural, =0 {הרשומות מתעדכנות.} one {נשארה רשומה אחת לעדכון.} two {נשארו שתי רשומות לעדכון.} other {נשארו # רשומות לעדכון.}} המשיכו כאן, אחרת הוא יתחדש עם השינוי הבא. | 'יתחדש' reads as 'be renewed'; 'יימשך' / 'יחודש' better conveys 'resumes'. | {count, plural, =0 {הרשומות מתעדכנות.} one {נשארה רשומה אחת לעדכון.} two {נשארו שתי רשומות לעדכון.} other {נשארו # רשומות לעדכון.}} המשיכו כאן, אחרת הוא יימשך עם השינוי הבא. | +| `fields:dialog.keyHint` | השם שבו סוכנים וערכות עיצוב קוראים לשדה. lowerCamelCase, כמו startsAt; אי אפשר לערוך אחרי השמירה. | 'Theme' is ערכת עיצוב here and in fields:operation.themeWarning, but ערכת נושא in collections:create.keyHint, settings.namesDescription, settings.sortHint and structuredData.themeReminder. Unify. | | +| `oauthConsent:who.thisComputerApp` | מחזיר אותך לאפליקציה במחשב הזה ({scheme}:) | The siblings who.sendsBack and who.thisComputer use the future tense (יחזיר); this one uses the present. Align. | יחזיר אותך לאפליקציה במחשב הזה ({scheme}:) | +| `status:error.body` | לא ניתן היה להציג את הדף הזה. נסו שוב בעוד רגע. | This is the only key with דף for 'page'; elsewhere it is עמוד. Both are fine for the public, so this is optional. | | + +
+ diff --git a/docs/i18n-review/tr.md b/docs/i18n-review/tr.md new file mode 100644 index 00000000..83f56458 --- /dev/null +++ b/docs/i18n-review/tr.md @@ -0,0 +1,181 @@ +# Turkish review pack: strings changed since your last review + +Every Turkish string added or changed after your review of collections, fields and listings (issue #112, 2026-10-23, commit 2e896582), as of this PR: 92 keys, plus one older string fixed for the glossary (last section). Security-relevant screens come first. + +- **English**: the source (`en`). +- **Current Turkish**: what Studio shows after this PR. Rows marked **fixed in this PR** were clear errors; the machine draft is quoted under the table. +- **Suggested**: only where I would change it. Empty means I would keep it. These are suggestions, not applied. + +To accept or change a line, edit `.i18n/tr/.json` after `pnpm i18n:export --locale tr`, then `pnpm i18n:import --locale tr` (the key column is `:`). Or reply on the PR and an agent applies it. + +## Consent screen (OAuth) — security + +Shown when an agent asks to connect. Every line decides whether someone approves an agent; none may soften. + +| Key | English | Current Turkish | Suggested | +|---|---|---|---| +| `oauthConsent:title` (new) | Connect {client} | {client} bağla | {client} bağlantısı | +| `oauthConsent:titleFrom` (new) | {host}: connect {client} | {host}: {client} bağla | {host}: {client} bağlantısı | +| `oauthConsent:description` (new) | An agent asks to work in this Studio for you. Check what it may do before you approve. | Bir agent bu Studio'da senin adına çalışmak istiyor. Onaylamadan önce neler yapabileceğine bak. | | +| `oauthConsent:invalid.title` (new) | This request can't be used | Bu istek kullanılamaz | | +| `oauthConsent:invalid.description` (new) | It expired, was already answered, or was changed on the way. Start the connection again from the agent. | Süresi doldu, zaten yanıtlandı ya da yolda değiştirildi. Bağlantıyı agent'tan yeniden başlat. | Süresi doldu, zaten yanıtlandı ya da aktarılırken değiştirildi. Bağlantıyı agent'tan yeniden başlat. | +| `oauthConsent:who.title` (new) | Who is asking | Kim istiyor | | +| `oauthConsent:who.fromHost` (new) | Identified by {host} | {host} ile tanımlanıyor | | +| `oauthConsent:who.registered` (new) | Registered with this Studio | Bu Studio'ya kayıtlı | | +| `oauthConsent:who.selfRegistered` (new) | Self-registered, not verified | Kendini kaydetmiş, doğrulanmamış | | +| `oauthConsent:who.lookalike` (new) | The name looks like {client}, but anyone can register a client under any name. Approve only if you started this connection from {client} yourself and the address it sends you back to, shown above, is the one it uses. | Ad {client} gibi görünüyor ama herkes herhangi bir adla istemci kaydedebilir. Yalnızca bu bağlantıyı {client} üzerinden kendin başlattıysan ve yukarıda gösterilen dönüş adresi onun kullandığı adresse onayla. | Adı {client} gibi görünüyor, ama herkes istediği adla istemci kaydedebilir. Yalnızca bu bağlantıyı {client} üzerinden kendin başlattıysan ve yukarıda gösterilen dönüş adresi gerçekten onun kullandığı adresse onayla. | +| `oauthConsent:who.sendsBack` (new) | Sends you back to {host} | Seni {host} adresine geri gönderir | | +| `oauthConsent:who.thisComputer` (new) | Sends you back to an app on this computer | Seni bu bilgisayardaki bir uygulamaya geri gönderir | | +| `oauthConsent:who.thisComputerApp` (new) | Sends you back to an app on this computer ({scheme}:) | Seni bu bilgisayardaki bir uygulamaya geri gönderir ({scheme}:) | | +| `oauthConsent:who.loopbackWarning` (new) | Every address this agent can send you back to is on this computer. Approve only if you started the connection from an app here. | Bu agent'ın seni geri gönderebileceği her adres bu bilgisayarda. Yalnızca bağlantıyı buradaki bir uygulamadan başlattıysan onayla. | | +| `oauthConsent:who.stepUp` (new) | This agent is already connected and asks for more. What it may do today is ticked. | Bu agent zaten bağlı ve daha fazlasını istiyor. Bugün yapabildikleri işaretli. | Bu agent zaten bağlı ve daha fazlasını istiyor. Şu an yapabildikleri işaretli. | +| `oauthConsent:scopes.title` (new) | What it may do | Neler yapabilir | | +| `oauthConsent:scopes.description` (new) | Untick anything it should not do. Your role decides the rest: what it does not give is left out. | Yapmaması gerekenlerin işaretini kaldır. Gerisine rolün karar verir: rolünün vermediği şeyler dışarıda kalır. | | +| `oauthConsent:scopes.legend` (new) | Permissions | İzinler | | +| `oauthConsent:scopes.notInRole` (new) | {label} (not in your role) | {label} (rolünde yok) | | +| `oauthConsent:scopes.narrowed` (new) | {label}, only for your own work in your role ({scope}) | {label}, rolünde yalnızca kendi işin için ({scope}) | | +| `oauthConsent:scopes.added` (new) | {label} (new) | {label} (yeni) | | +| `oauthConsent:scopes.offline` (new) | It stays connected and renews its access by itself, for at most 90 days, until the connection is revoked or your access ends. | Bağlantı geri alınana ya da erişimin bitene kadar, en fazla 90 gün boyunca bağlı kalır ve erişimini kendisi yeniler. | Bağlantı iptal edilene ya da erişimin bitene kadar, en fazla 90 gün boyunca bağlı kalır ve erişimini kendisi yeniler. | +| `oauthConsent:scopes.sites` (new) | {count, plural, one {It reaches only the site you work on.} other {It reaches only the # sites you work on.}} | {count, plural, one {Yalnızca üzerinde çalıştığın siteye erişir.} other {Yalnızca üzerinde çalıştığın {count, number} siteye erişir.}} | | +| `oauthConsent:scopes.none` (new) | Choose at least one permission. | En az bir izin seç. | | +| `oauthConsent:mode.title` (new) | How it works | Nasıl çalışır | | +| `oauthConsent:mode.description` (new) | How independently the agent may work. You can change it later. | Agent'ın ne kadar bağımsız çalışabileceği. Sonra değiştirebilirsin. | | +| `oauthConsent:mode.legend` (new) | Agent mode | Agent modu | | +| `oauthConsent:approve` (new) | Approve | Onayla | | +| `oauthConsent:deny` (new) | Deny | Reddet | | + +## Connected agents: identity labels — security + +The badges and messages that say who a connected agent is. Each label here and its consent-screen twin (`connectedAgents:identifiedBy` = `oauthConsent:who.fromHost`, `connectedAgents:selfRegistered` = `oauthConsent:who.selfRegistered`) must stay word for word the same, so a person sees the same words for the same state on both screens; change both or neither. + +| Key | English | Current Turkish | Suggested | +|---|---|---|---| +| `connectedAgents:description` (new) | Apps you connected by URL, such as Claude, ChatGPT or Cursor. Each works as you, never beyond your role, until you disconnect it. | URL ile bağladığın Claude, ChatGPT veya Cursor gibi uygulamalar. Her biri sen bağlantısını kesene kadar senin adına, rolünün ötesine geçmeden çalışır. | URL ile bağladığın Claude, ChatGPT veya Cursor gibi uygulamalar. Her biri, sen bağlantısını kesene kadar senin adına çalışır ve hiçbir zaman rolünün ötesine geçmez. | +| `connectedAgents:allDescription` (new) | Every member's connections. Disconnecting one ends it at once; its member can connect it again. | Tüm üyelerin bağlantıları. Birinin bağlantısını kesmek onu hemen sonlandırır; üyesi yeniden bağlayabilir. | | +| `connectedAgents:identifiedBy` (new) | Identified by {host} | {host} ile tanımlanıyor | | +| `connectedAgents:selfRegistered` (new) | Self-registered, not verified | Kendini kaydetmiş, doğrulanmamış | | +| `connectedAgents:lookalike` (new) | Looks like {client}, not verified as it | {client} gibi görünüyor, öyle olduğu doğrulanmadı | | +| `connectedAgents:disconnectedDescription` (new) | {client} can no longer work in this Studio. If it asks to connect again, you decide again. | {client} artık bu Studio'da çalışamaz. Yeniden bağlanmak isterse yine sen karar verirsin. | | + +## Sign-up with the setup link — security + +The first-account screen opened from the setup link. + +| Key | English | Current Turkish | Suggested | +|---|---|---|---| +| `core:auth.setupDescription` (changed) | You opened the setup link printed when Cloudhal started or was deployed. The account you create now becomes the owner; afterwards sign-up closes. | Cloudhal başlarken ya da dağıtılırken yazdırılan kurulum bağlantısıyla geldin. Şimdi oluşturacağın hesap sahip olur; ardından yeni kayıtlar kapanır. | Cloudhal başlarken ya da dağıtılırken yazdırılan kurulum bağlantısıyla geldin. Şimdi oluşturacağın hesap Sahip olur; ardından kayıt kapanır. | + +## Account › Access + +| Key | English | Current Turkish | Suggested | +|---|---|---|---| +| `core:account.access.features.mcpOauth` (new) | OAuth for MCP clients | MCP istemcileri için OAuth | | +| `core:account.access.featureHints.mcpOauth` **fixed in this PR** (new) | MCP clients registered with this Studio sign in at /mcp with OAuth; you approve each connection. | Bu Studio'ya kayıtlı MCP istemcileri /mcp adresinde OAuth ile giriş yapar; her bağlantıyı sen onaylarsın. | | + +Fixed in this PR: +- `core:account.access.featureHints.mcpOauth`: was “Bu Studio'ya kayıtlı MCP istemcileri /mcp adresinde OAuth ile oturum açar; her bağlantıyı sen onaylarsın.”. Studio says "giriş yap" for sign in everywhere else. + +## Connected agents page + +Account › Connected agents and the everyone's list for administrators. + +| Key | English | Current Turkish | Suggested | +|---|---|---|---| +| `connectedAgents:title` (new) | Connected agents | Bağlı agent'lar | | +| `connectedAgents:allTitle` (new) | Everyone's connected agents | Herkesin bağlı agent'ları | | +| `connectedAgents:columns.agent` (new) | Agent | Agent | | +| `connectedAgents:columns.owner` (new) | Member | Üye | | +| `connectedAgents:columns.access` (new) | Access | Erişim | | +| `connectedAgents:columns.lastUsed` (new) | Last used | Son kullanım | | +| `connectedAgents:columns.connected` (new) | Connected | Bağlanma | Bağlanma tarihi | +| `connectedAgents:never` (new) | Never | Hiç | Hiç kullanılmadı | +| `connectedAgents:disconnect` (new) | Disconnect | Bağlantıyı kes | | +| `connectedAgents:disconnectLabel` (new) | Disconnect {client} | {client} bağlantısını kes | | +| `connectedAgents:resource` (new) | connection | bağlantı | | +| `connectedAgents:disconnected` (new) | Disconnected | Bağlantı kesildi | | +| `connectedAgents:empty` (new) | No agents connected by URL | URL ile bağlı agent yok | | +| `connectedAgents:emptyDescription` (new) | Add this Studio's MCP URL to Claude, ChatGPT, Cursor or VS Code. You approve each connection here. | Bu Studio'nun MCP URL'sini Claude, ChatGPT, Cursor veya VS Code'a ekle. Her bağlantıyı burada onaylarsın. | | +| `connectedAgents:allEmpty` (new) | Nobody has connected an agent by URL | Henüz kimse URL ile agent bağlamadı | | + +## Connect an agent (MCP client setup) + +The Connect by URL / With an agent key panel. + +| Key | English | Current Turkish | Suggested | +|---|---|---|---| +| `connectedAgents:setup.description` **fixed in this PR** (new) | Give an app this Studio's MCP URL and approve it when it asks, or create an agent key for scripts and clients that cannot sign in. | Bir uygulamaya bu Studio'nun MCP URL'sini ver ve istediğinde onayla ya da giriş yapamayan betikler ve istemciler için bir agent anahtarı oluştur. | | +| `connectedAgents:setup.tabs.key` (new) | With an agent key | Agent anahtarıyla | | +| `connectedAgents:setup.tabs.url` (new) | Connect by URL | URL ile bağlan | | +| `connectedAgents:setup.url` (new) | MCP URL | MCP URL'si | | +| `connectedAgents:setup.urlDescription` **fixed in this PR** (new) | The app opens this Studio in your browser, you sign in and approve what it may do. No key to copy. | Uygulama bu Studio'yu tarayıcında açar; giriş yapıp neler yapabileceğini onaylarsın. Kopyalanacak anahtar yok. | | +| `connectedAgents:setup.client` (new) | App | Uygulama | | +| `connectedAgents:setup.clients.claudeAi` (new) | Claude.ai, Desktop and mobile | Claude.ai, masaüstü ve mobil | | +| `connectedAgents:setup.clients.claudeCode` (new) | Claude Code | Claude Code | | +| `connectedAgents:setup.clients.codex` (new) | ChatGPT and Codex | ChatGPT ve Codex | | +| `connectedAgents:setup.clients.cursor` (new) | Cursor | Cursor | | +| `connectedAgents:setup.clients.vscode` (new) | VS Code | VS Code | | +| `connectedAgents:setup.clients.inspector` (new) | MCP Inspector | MCP Inspector | | +| `connectedAgents:setup.hints.claudeAi` (new) | In Claude, open Settings, then Connectors, and add a custom connector with this URL. Claude opens Studio to approve it. | Claude'da Settings'i, ardından Connectors'ı aç ve bu URL ile özel bir bağlayıcı (custom connector) ekle. Claude onay için Studio'yu açar. | | +| `connectedAgents:setup.hints.claudeCode` (new) | Run it in a terminal, then type /mcp inside Claude Code and choose Authenticate. Your browser opens Studio to approve it. | Bir terminalde çalıştır, sonra Claude Code içinde /mcp yaz ve Authenticate'i seç. Tarayıcın onay için Studio'yu açar. | | +| `connectedAgents:setup.hints.codex` (new) | Codex: run both lines; the second opens Studio to approve it. ChatGPT: add a connector with this URL in its settings. | Codex: iki satırı da çalıştır; ikincisi onay için Studio'yu açar. ChatGPT: ayarlarında bu URL ile bir bağlayıcı ekle. | | +| `connectedAgents:setup.hints.cursor` **fixed in this PR** (new) | Save it as ~/.cursor/mcp.json, or .cursor/mcp.json in a project, then sign in when Cursor asks. Studio opens to approve it. | ~/.cursor/mcp.json ya da bir projede .cursor/mcp.json olarak kaydet, sonra Cursor isteyince giriş yap. Onaylaman için Studio açılır. | | +| `connectedAgents:setup.hints.vscode` (new) | Save it as .vscode/mcp.json in your project, then start the server. VS Code asks you to sign in and opens Studio. | Projende .vscode/mcp.json olarak kaydet, sonra sunucuyu başlat. VS Code giriş yapmanı ister ve Studio'yu açar. | | +| `connectedAgents:setup.hints.inspector` (new) | Run it, choose Streamable HTTP, paste the URL and open Auth Settings, then Quick OAuth Flow. Good for checking a connection. | Çalıştır, Streamable HTTP'yi seç, URL'yi yapıştır ve Auth Settings'i, ardından Quick OAuth Flow'u aç. Bir bağlantıyı denemek için iyidir. | | +| `connectedAgents:setup.needsDcr` (new) | {client} registers itself (dynamic client registration), which is off on this server. Ask its operator to turn CLOUDHAL_MCP_DCR back on, or use an agent key. | {client} kendini kaydeder (dinamik istemci kaydı) ve bu sunucuda bu özellik kapalı. Sunucunun yöneticisinden CLOUDHAL_MCP_DCR'ı yeniden açmasını iste ya da bir agent anahtarı kullan. | {client} kendini kaydeder (dinamik istemci kaydı) ve bu sunucuda bu özellik kapalı. Sunucunun yöneticisinden CLOUDHAL_MCP_DCR ayarını yeniden açmasını iste ya da bir agent anahtarı kullan. | +| `connectedAgents:setup.needsPublicUrl` (new) | Claude.ai and ChatGPT connect from their own servers, which cannot reach {url}. Start Studio with --base-url set to a public https:// address, or use an app on this computer, such as Claude Code or Codex. | Claude.ai ve ChatGPT kendi sunucularından bağlanır; bu sunucular {url} adresine erişemez. Studio'yu --base-url ile herkese açık bir https:// adresine ayarlayarak başlat ya da bu bilgisayardaki Claude Code veya Codex gibi bir uygulama kullan. | | +| `connectedAgents:setup.unavailable` (new) | Neither way an app can identify itself is on here (metadata documents and dynamic registration). Ask this server's operator, or use an agent key. | Bir uygulamanın kendini tanıtabileceği iki yol da (meta veri belgeleri ve dinamik kayıt) burada kapalı. Bu sunucunun yöneticisine sor ya da bir agent anahtarı kullan. | | + +Fixed in this PR: +- `connectedAgents:setup.description`: was “Bir uygulamaya bu Studio'nun MCP URL'sini ver ve istediğinde onayla ya da oturum açamayan betikler ve istemciler için bir agent anahtarı oluştur.”. Studio says "giriş yap" for sign in everywhere else. +- `connectedAgents:setup.urlDescription`: was “Uygulama bu Studio'yu tarayıcında açar; giriş yapar ve neler yapabileceğini onaylarsın. Kopyalanacak anahtar yok.”. "giriş yapar" reads as the app signing in; in English the person signs in. "giriş yapıp … onaylarsın" keeps both verbs on the person. +- `connectedAgents:setup.hints.cursor`: was “~/.cursor/mcp.json ya da bir projede .cursor/mcp.json olarak kaydet, sonra Cursor isteyince oturum aç. Onaylaman için Studio açılır.”. Studio says "giriş yap" for sign in everywhere else. + +## Collections: Ended badge + +Added on 2026-10-25 (#113), after your collections review. + +| Key | English | Current Turkish | Suggested | +|---|---|---|---| +| `listings:ended.badge` (new) | Ended (collection rule) | Sona erdi (koleksiyon kuralı) | | +| `listings:ended.reason` (new) | {action, select, unlist {This entry ended on {time} ({zone} time) under its collection's expiry on “{field}”. It's still published and its page stays at its address, but it has left lists, feeds, the sitemap and search.} hide {This entry ended on {time} ({zone} time) under its collection's expiry on “{field}”. It's still published, but its page answers “not found”, and it has left every list, feed and search.} other {This entry ended on {time} ({zone} time) under its collection's expiry on “{field}”.}} | {action, select, unlist {Bu kayıt, koleksiyonun “{field}” alanına bağlı sona erme kuralıyla {time} zamanında ({zone} saatiyle) sona erdi. Hâlâ yayında ve sayfası adresinde duruyor, ama listelerden, akışlardan, site haritasından ve aramadan çıktı.} hide {Bu kayıt, koleksiyonun “{field}” alanına bağlı sona erme kuralıyla {time} zamanında ({zone} saatiyle) sona erdi. Hâlâ yayında, ama sayfası “bulunamadı” yanıtı veriyor ve tüm listelerden, akışlardan ve aramadan çıktı.} other {Bu kayıt, koleksiyonun “{field}” alanına bağlı sona erme kuralıyla {time} zamanında ({zone} saatiyle) sona erdi.}} | | + +## Build chat on a playground + +Added on 2026-10-23 evening, after your review. + +| Key | English | Current Turkish | Suggested | +|---|---|---|---| +| `build:chat.playgroundHint` (new) | “Build with AI” runs on Workers AI, which the playground leaves out. Deploy Cloudhal to your Cloudflare account to use it. | “AI ile kur” Workers AI ile çalışır; deneme alanında bu yok. Kullanmak için Cloudhal'ı kendi Cloudflare hesabına kur. | | + +## Status pages (site visitors) + +Public pages a visitor sees instead of the site (RFC-0043). Formal register ("siz"); simple `{name}` arguments only. + +| Key | English | Current Turkish | Suggested | +|---|---|---|---| +| `status:notPublished.title` (new) | Coming soon | Çok yakında | | +| `status:notPublished.body` (new) | This site isn't published yet. Check back soon. | Bu site henüz yayımlanmadı. Yakında tekrar bakın. | | +| `status:maintenance.title` (new) | We'll be back soon | Yakında geri döneceğiz | | +| `status:maintenance.body` (new) | This site is down for maintenance. Thanks for your patience. | Bu site bakım nedeniyle kapalı. Sabrınız için teşekkürler. | | +| `status:comingSoon.title` (new) | Coming soon | Çok yakında | | +| `status:comingSoon.body` (new) | This site isn't open yet. Check back soon. | Bu site henüz açılmadı. Yakında tekrar bakın. | | +| `status:unavailable.title` (new) | Temporarily unavailable | Geçici olarak erişilemiyor | | +| `status:unavailable.body` (new) | This site can't be reached right now. Please try again in a few minutes. | Bu siteye şu anda ulaşılamıyor. Lütfen birkaç dakika sonra tekrar deneyin. | | +| `status:error.title` (new) | Something went wrong | Bir sorun oluştu | | +| `status:error.body` (new) | This page couldn't be shown. Please try again in a moment. | Bu sayfa gösterilemedi. Lütfen birazdan tekrar deneyin. | | +| `status:previewExpired.title` (new) | This preview link has expired | Bu önizleme bağlantısının süresi doldu | | +| `status:previewExpired.body` (new) | Ask for a new link to see this version. | Bu sürümü görmek için yeni bir bağlantı isteyin. | | +| `status:backBy` (new) | Back by {time} | {time} itibarıyla geri döneceğiz | Tahmini dönüş: {time} | +| `status:reference` (new) | Reference: {reference} | Referans: {reference} | | +| `status:builtWith` (new) | Built with Cloudhal | Cloudhal ile yapıldı | | + +## Fixed outside the changed keys + +Strings you had already reviewed, changed only to keep a glossary term (sign in is *giriş yap*). + +| Key | English | Was | Now | +|---|---|---|---| +| `core:agents.notEnabledDescription` | This server runs without sign-in, so it can't issue keys. Agents on your machine can still connect over stdio with cloudhal mcp. | Sunucu oturum açma olmadan çalışıyor, bu yüzden anahtar üretemez. Kendi bilgisayarındaki agent'lar yine de cloudhal mcp ile stdio üzerinden bağlanabilir. | Sunucu giriş olmadan çalışıyor, bu yüzden anahtar üretemez. Kendi bilgisayarındaki agent'lar yine de cloudhal mcp ile stdio üzerinden bağlanabilir. | + +Left as they are: the session strings say *oturumu kapat* (close the session) for "sign out" of one session or device (`core:account.sessions.*`, `core:members.remove.signOut`) and in the invite page (`core:inviteAccept.signOutFirst`, `core:inviteAccept.otherSession`), where Studio's own button is *Çıkış yap*. Your call whether the invite page should say *Önce çıkış yap*. + diff --git a/packages/astro-renderer/src/status-strings/nl.ts b/packages/astro-renderer/src/status-strings/nl.ts index 1b9b8e4f..c72c1ce8 100644 --- a/packages/astro-renderer/src/status-strings/nl.ts +++ b/packages/astro-renderer/src/status-strings/nl.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): nl status page messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: fe371781027a8452 +// hash: adde194c8154eea8 import type { StatusMessages } from "./en.ts"; export const messages: StatusMessages = { @@ -28,7 +28,7 @@ export const messages: StatusMessages = { title: "Deze voorbeeldlink is verlopen", body: "Vraag een nieuwe link aan om deze versie te bekijken.", }, - backBy: "Terug om {time}", + backBy: "Uiterlijk {time} terug", reference: "Referentie: {reference}", builtWith: "Gemaakt met Cloudhal", }; diff --git a/packages/astro-renderer/src/status-strings/pl.ts b/packages/astro-renderer/src/status-strings/pl.ts index 9bf495d4..8b5b1e89 100644 --- a/packages/astro-renderer/src/status-strings/pl.ts +++ b/packages/astro-renderer/src/status-strings/pl.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): pl status page messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: a0de1472a18c209e +// hash: 4f1b530b5c2a7acb import type { StatusMessages } from "./en.ts"; export const messages: StatusMessages = { @@ -28,7 +28,7 @@ export const messages: StatusMessages = { title: "Ten link do podglądu wygasł", body: "Poproś o nowy link, aby zobaczyć tę wersję.", }, - backBy: "Wracamy {time}", + backBy: "Wrócimy najpóźniej {time}", reference: "Numer referencyjny: {reference}", builtWith: "Stworzone z Cloudhal", }; diff --git a/packages/astro-renderer/src/status-strings/pt-BR.ts b/packages/astro-renderer/src/status-strings/pt-BR.ts index 0f0a7d24..5f602262 100644 --- a/packages/astro-renderer/src/status-strings/pt-BR.ts +++ b/packages/astro-renderer/src/status-strings/pt-BR.ts @@ -1,6 +1,6 @@ // Generated by `pnpm i18n:import` (ADR-0034): pt-BR status page messages. // Do not edit: change the translation file and import it; only English is edited here. -// hash: 85bbd6c18a5d4a89 +// hash: c3245ee3938a11fe import type { StatusMessages } from "./en.ts"; export const messages: StatusMessages = { @@ -28,7 +28,7 @@ export const messages: StatusMessages = { title: "Este link de pré-visualização expirou", body: "Peça um novo link para ver esta versão.", }, - backBy: "De volta em {time}", + backBy: "De volta até {time}", reference: "Referência: {reference}", builtWith: "Feito com Cloudhal", };