diff --git a/apps/desktop-ui/messages/af.json b/apps/desktop-ui/messages/af.json index 9a2ee336..dcf0428c 100644 --- a/apps/desktop-ui/messages/af.json +++ b/apps/desktop-ui/messages/af.json @@ -1926,7 +1926,70 @@ "connectionStringRequired": "Voer 'n koppelingsstring in.", "connectionStringScheme": "Koppelingsstring moet begin met mongodb:// of mongodb+srv://.", "redisUrlRequired": "Voer 'n Redis-URL in.", - "redisUrlScheme": "Redis-URL moet begin met redis:// of rediss://." + "redisUrlScheme": "Redis-URL moet begin met redis:// of rediss://.", + "serviceAccountRequired": "Plak 'n diensrekening-JSON-sleutel.", + "serviceAccountInvalidJson": "Dit is nie geldige JSON nie.", + "serviceAccountNotServiceAccount": "Hierdie JSON is nie 'n diensrekeningsleutel nie (tipe \"service_account\" met project_id en client_email word verwag).", + "serviceAccountBadKey": "Die private_key-veld ontbreek of is nie 'n PKCS#8 PEM-sleutel nie.", + "databaseIdInvalid": "Databasis-ID moet 4–63 kleinletters, syfers of koppeltekens wees, of (default)." + }, + "firestore": { + "serviceAccount": "Diensrekeningsleutel (JSON)", + "serviceAccountPlaceholder": "Plak die JSON-sleutellêer van 'n diensrekening met Firestore-toegang…", + "serviceAccountHint": "Skep een in Google Cloud Console → IAM → Diensrekeninge → Sleutels. Dit benodig die roles/datastore.user-rol (of roles/datastore.viewer vir leesalleen).", + "loadFromFile": "Laai vanaf lêer…", + "parsedProject": "Projek:", + "databaseId": "Databasis-ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Laat leeg tensy die projek benoemde Firestore-databasisse gebruik.", + "noCollections": "Geen versamelings nie", + "noMatches": "Geen resultate nie", + "docCount": "{count, plural, =0 {Geen dokumente} one {# dokument} other {# dokumente}}", + "newDocument": "Nuwe dokument", + "docIdLabel": "Dokument-ID", + "docIdAutoHint": "Laat leeg vir 'n outomaties gegenereerde ID.", + "newFieldTypesHint": "Nuwe velde kan stringe, getalle, boolese waardes, skikkings of kaarte wees. Wysiging van 'n bestaande timestamp-, verwysings-, bytes- of geopoint-veld behou sy tipe.", + "create": "Skep", + "edit": "Wysig", + "save": "Stoor", + "cancel": "Kanselleer", + "deleteDocTitle": "Vee dokument uit?", + "deleteDocBody": "Dit sal {id} uitvee. Sy sub-versamelings word NIE uitgevee nie en sal verweesd raak (steeds bereikbaar via die pad, onsigbaar in lyste).", + "subcollections": "Sub-versamelings", + "noSubcollections": "Geen sub-versamelings nie", + "filterField": "Veld", + "filterValue": "Waarde", + "orderBy": "Sorteer volgens", + "orderByHint": "Dokumente sonder die sorteerveld word deur Firestore uitgesluit.", + "apply": "Toepas", + "clear": "Maak skoon", + "nextPage": "Volgende", + "prevPage": "Vorige", + "emptyCollection": "Geen dokumente in hierdie versameling nie.", + "queryLimitNote": "Wys die eerste {count} resultate — verhoog die bladsygrootte vir meer.", + "selectDoc": "Kies 'n dokument om dit te bekyk.", + "errPermissionDenied": "Toegang geweier. Die diensrekening benodig die roles/datastore.user-rol (of roles/datastore.viewer om te lees).", + "errServiceDisabled": "Die Firestore-API is nie vir hierdie projek geaktiveer nie.", + "errOpenConsole": "Aktiveer API in console", + "errDatastoreMode": "Hierdie databasis is in Datastore-modus, wat Firestore-nutsmiddels nie kan deurblaai nie.", + "errIndexRequired": "Hierdie navraag benodig 'n saamgestelde indeks.", + "errCreateIndex": "Skep indeks in console", + "errQuota": "Firestore-kwota oorskry — probeer later weer.", + "errClockSkew": "Google het die ondertekende token verwerp. Kontroleer of hierdie rekenaar se horlosie korrek ingestel is.", + "errServiceAccountRejected": "Die diensrekening is gedeaktiveer of uitgevee. Skep 'n nuwe sleutel in die Google Cloud Console.", + "errNetwork": "Netwerkfout — kontroleer jou verbinding.", + "errNotFound": "Databasis nie gevind nie. Kontroleer die databasis-ID.", + "errDocTooLarge": "Die dokument oorskry Firestore se 1 MB-limiet.", + "errInvalidDocJson": "Die dokument is nie geldige JSON nie.", + "errDocNotObject": "'n Dokument moet op die boonste vlak 'n JSON-objek wees.", + "toast": { + "docCreated": "Dokument geskep", + "docUpdated": "Dokument gestoor", + "docDeleted": "Dokument uitgevee", + "createFailed": "Kon nie skep nie: {message}", + "saveFailed": "Kon nie stoor nie: {message}", + "deleteFailed": "Kon nie uitvee nie: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/ar.json b/apps/desktop-ui/messages/ar.json index c9d270d1..8b75bc11 100644 --- a/apps/desktop-ui/messages/ar.json +++ b/apps/desktop-ui/messages/ar.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "أدخل سلسلة الاتصال.", "connectionStringScheme": "يجب أن تبدأ سلسلة الاتصال بـ mongodb:// أو mongodb+srv://.", "redisUrlRequired": "أدخل رابط Redis.", - "redisUrlScheme": "يجب أن يبدأ رابط Redis بـ redis:// أو rediss://." + "redisUrlScheme": "يجب أن يبدأ رابط Redis بـ redis:// أو rediss://.", + "serviceAccountRequired": "الصق مفتاح JSON لحساب الخدمة.", + "serviceAccountInvalidJson": "هذا ليس JSON صالحًا.", + "serviceAccountNotServiceAccount": "هذا JSON ليس مفتاح حساب خدمة (يُتوقع النوع \"service_account\" مع project_id وclient_email).", + "serviceAccountBadKey": "حقل private_key مفقود أو ليس مفتاح PEM بتنسيق PKCS#8.", + "databaseIdInvalid": "يجب أن يتكون معرّف قاعدة البيانات من 4–63 حرفًا صغيرًا أو رقمًا أو شرطة، أو أن يكون (default)." + }, + "firestore": { + "serviceAccount": "مفتاح حساب الخدمة (JSON)", + "serviceAccountPlaceholder": "الصق ملف مفتاح JSON لحساب خدمة لديه إمكانية الوصول إلى Firestore…", + "serviceAccountHint": "أنشئه في Google Cloud console → IAM → Service Accounts → Keys. يحتاج إلى دور roles/datastore.user (أو roles/datastore.viewer للقراءة فقط).", + "loadFromFile": "التحميل من ملف…", + "parsedProject": "المشروع:", + "databaseId": "معرّف قاعدة البيانات", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "اتركه فارغًا ما لم يكن المشروع يستخدم قواعد بيانات Firestore مسمّاة.", + "noCollections": "لا توجد مجموعات", + "noMatches": "لا توجد نتائج مطابقة", + "docCount": "{count, plural, zero {لا توجد مستندات} one {مستند واحد} two {مستندان} few {# مستندات} many {# مستندًا} other {# مستند}}", + "newDocument": "مستند جديد", + "docIdLabel": "معرّف المستند", + "docIdAutoHint": "اتركه فارغًا لإنشاء معرّف تلقائيًا.", + "newFieldTypesHint": "يمكن أن تكون الحقول الجديدة سلاسل نصية أو أرقامًا أو قيمًا منطقية أو مصفوفات أو خرائط (maps). تعديل حقل timestamp أو reference أو bytes أو geopoint موجود يحافظ على نوعه.", + "create": "إنشاء", + "edit": "تعديل", + "save": "حفظ", + "cancel": "إلغاء", + "deleteDocTitle": "حذف المستند؟", + "deleteDocBody": "سيؤدي هذا إلى حذف {id}. لن تُحذف مجموعاته الفرعية وستصبح يتيمة (لا تزال قابلة للوصول عبر المسار لكنها غير مرئية في القوائم).", + "subcollections": "المجموعات الفرعية", + "noSubcollections": "لا توجد مجموعات فرعية", + "filterField": "الحقل", + "filterValue": "القيمة", + "orderBy": "الترتيب حسب", + "orderByHint": "تستبعد Firestore المستندات التي لا يوجد بها الحقل المستخدم في الترتيب.", + "apply": "تطبيق", + "clear": "مسح", + "nextPage": "التالي", + "prevPage": "السابق", + "emptyCollection": "لا توجد مستندات في هذه المجموعة.", + "queryLimitNote": "يتم عرض أول {count} نتيجة — قم بزيادة حجم الصفحة لعرض المزيد.", + "selectDoc": "اختر مستندًا لعرضه.", + "errPermissionDenied": "تم رفض الإذن. يحتاج حساب الخدمة إلى دور roles/datastore.user (أو roles/datastore.viewer للقراءة).", + "errServiceDisabled": "واجهة برمجة تطبيقات Firestore غير مفعّلة لهذا المشروع.", + "errOpenConsole": "تفعيل الواجهة البرمجية في وحدة التحكم", + "errDatastoreMode": "قاعدة البيانات هذه في وضع Datastore، ولا يمكن لأدوات Firestore تصفحها.", + "errIndexRequired": "يحتاج هذا الاستعلام إلى فهرس مركّب.", + "errCreateIndex": "إنشاء فهرس في وحدة التحكم", + "errQuota": "تم تجاوز حصة Firestore — يُرجى المحاولة مرة أخرى لاحقًا.", + "errClockSkew": "رفض Google الرمز الموقّع. تحقق من أن ساعة هذا الجهاز مضبوطة بشكل صحيح.", + "errServiceAccountRejected": "تم تعطيل حساب الخدمة أو حذفه. أصدر مفتاحًا جديدًا من وحدة تحكم Google Cloud.", + "errNetwork": "خطأ في الشبكة — تحقق من اتصالك.", + "errNotFound": "قاعدة البيانات غير موجودة. تحقق من معرّف قاعدة البيانات.", + "errDocTooLarge": "يتجاوز المستند حد 1 ميغابايت الخاص بـ Firestore.", + "errInvalidDocJson": "هذا المستند ليس JSON صالحًا.", + "errDocNotObject": "يجب أن يكون المستند كائن JSON في المستوى الأعلى.", + "toast": { + "docCreated": "تم إنشاء المستند", + "docUpdated": "تم حفظ المستند", + "docDeleted": "تم حذف المستند", + "createFailed": "فشل الإنشاء: {message}", + "saveFailed": "فشل الحفظ: {message}", + "deleteFailed": "فشل الحذف: {message}" + } }, "redis": { "urlMode": "الرابط", diff --git a/apps/desktop-ui/messages/ca.json b/apps/desktop-ui/messages/ca.json index 735a35f7..1e076e99 100644 --- a/apps/desktop-ui/messages/ca.json +++ b/apps/desktop-ui/messages/ca.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Introdueix una cadena de connexió.", "connectionStringScheme": "La cadena de connexió ha de començar amb mongodb:// o mongodb+srv://.", "redisUrlRequired": "Introdueix una URL de Redis.", - "redisUrlScheme": "La URL de Redis ha de començar amb redis:// o rediss://." + "redisUrlScheme": "La URL de Redis ha de començar amb redis:// o rediss://.", + "serviceAccountRequired": "Enganxa una clau JSON de compte de servei.", + "serviceAccountInvalidJson": "Això no és JSON vàlid.", + "serviceAccountNotServiceAccount": "Aquest JSON no és una clau de compte de servei (s'esperava el tipus \"service_account\" amb project_id i client_email).", + "serviceAccountBadKey": "Falta el camp private_key o no és una clau PEM PKCS#8.", + "databaseIdInvalid": "L'ID de la base de dades ha de tenir entre 4 i 63 lletres minúscules, dígits o guionets, o ser (default)." + }, + "firestore": { + "serviceAccount": "Clau de compte de servei (JSON)", + "serviceAccountPlaceholder": "Enganxa el fitxer de clau JSON d'un compte de servei amb accés a Firestore…", + "serviceAccountHint": "Crea'n una a la consola de Google Cloud → IAM → Comptes de servei → Claus. Necessita el rol roles/datastore.user (o roles/datastore.viewer només per a lectura).", + "loadFromFile": "Carrega des d'un fitxer…", + "parsedProject": "Projecte:", + "databaseId": "ID de la base de dades", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Deixa-ho buit tret que el projecte utilitzi bases de dades Firestore amb nom.", + "noCollections": "Sense col·leccions", + "noMatches": "Sense coincidències", + "docCount": "{count, plural, =0 {Sense documents} one {# document} other {# documents}}", + "newDocument": "Document nou", + "docIdLabel": "ID del document", + "docIdAutoHint": "Deixa-ho buit per generar un ID automàticament.", + "newFieldTypesHint": "Els camps nous poden ser cadenes, números, booleans, matrius o mapes. Si edites un camp existent de tipus timestamp, referència, bytes o geopoint, en conserva el tipus.", + "create": "Crea", + "edit": "Edita", + "save": "Desa", + "cancel": "Cancel·la", + "deleteDocTitle": "Vols eliminar el document?", + "deleteDocBody": "Això elimina {id}. Les seves subcol·leccions NO s'eliminen i quedaran orfes (encara accessibles per ruta, però invisibles als llistats).", + "subcollections": "Subcol·leccions", + "noSubcollections": "Sense subcol·leccions", + "filterField": "Camp", + "filterValue": "Valor", + "orderBy": "Ordena per", + "orderByHint": "Firestore exclou els documents als quals els falta el camp d'ordenació.", + "apply": "Aplica", + "clear": "Neteja", + "nextPage": "Següent", + "prevPage": "Anterior", + "emptyCollection": "No hi ha documents en aquesta col·lecció.", + "queryLimitNote": "Es mostren els primers {count} resultats — augmenta la mida de pàgina per veure'n més.", + "selectDoc": "Tria un document per veure'l.", + "errPermissionDenied": "Permís denegat. El compte de servei necessita el rol roles/datastore.user (o roles/datastore.viewer per llegir).", + "errServiceDisabled": "L'API de Firestore no està habilitada per a aquest projecte.", + "errOpenConsole": "Habilita l'API a la consola", + "errDatastoreMode": "Aquesta base de dades està en mode Datastore, que les eines de Firestore no poden explorar.", + "errIndexRequired": "Aquesta consulta necessita un índex compost.", + "errCreateIndex": "Crea l'índex a la consola", + "errQuota": "S'ha superat la quota de Firestore — torna-ho a provar més tard.", + "errClockSkew": "Google ha rebutjat el testimoni signat. Comprova que el rellotge d'aquest ordinador estigui ben configurat.", + "errServiceAccountRejected": "El compte de servei s'ha inhabilitat o eliminat. Emet una clau nova a la consola de Google Cloud.", + "errNetwork": "Error de xarxa — comprova la teva connexió.", + "errNotFound": "No s'ha trobat la base de dades. Comprova l'ID de la base de dades.", + "errDocTooLarge": "El document supera el límit d'1 MB de Firestore.", + "errInvalidDocJson": "El document no és JSON vàlid.", + "errDocNotObject": "Un document ha de ser un objecte JSON al nivell superior.", + "toast": { + "docCreated": "Document creat", + "docUpdated": "Document desat", + "docDeleted": "Document eliminat", + "createFailed": "Error en crear: {message}", + "saveFailed": "Error en desar: {message}", + "deleteFailed": "Error en eliminar: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/cs.json b/apps/desktop-ui/messages/cs.json index 3480cafa..c5396233 100644 --- a/apps/desktop-ui/messages/cs.json +++ b/apps/desktop-ui/messages/cs.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Zadejte připojovací řetězec.", "connectionStringScheme": "Připojovací řetězec musí začínat na mongodb:// nebo mongodb+srv://.", "redisUrlRequired": "Zadejte URL adresu Redis.", - "redisUrlScheme": "URL adresa Redis musí začínat na redis:// nebo rediss://." + "redisUrlScheme": "URL adresa Redis musí začínat na redis:// nebo rediss://.", + "serviceAccountRequired": "Vložte klíč servisního účtu ve formátu JSON.", + "serviceAccountInvalidJson": "Toto není platný JSON.", + "serviceAccountNotServiceAccount": "Tento JSON není klíčem servisního účtu (očekávaný typ \"service_account\" s project_id a client_email).", + "serviceAccountBadKey": "Pole private_key chybí nebo není klíčem PKCS#8 PEM.", + "databaseIdInvalid": "Database ID musí obsahovat 4–63 malých písmen, číslic nebo pomlček, nebo být (default)." + }, + "firestore": { + "serviceAccount": "Klíč servisního účtu (JSON)", + "serviceAccountPlaceholder": "Vložte soubor JSON klíče servisního účtu s přístupem k Firestore…", + "serviceAccountHint": "Vytvořte jej v konzoli Google Cloud → IAM → Servisní účty → Klíče. Je potřeba role roles/datastore.user (nebo roles/datastore.viewer pouze pro čtení).", + "loadFromFile": "Načíst ze souboru…", + "parsedProject": "Projekt:", + "databaseId": "Database ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Ponechte prázdné, pokud projekt nepoužívá pojmenované databáze Firestore.", + "noCollections": "Žádné kolekce", + "noMatches": "Žádné shody", + "docCount": "{count, plural, =0 {Žádné dokumenty} one {# dokument} few {# dokumenty} many {# dokumentu} other {# dokumentů}}", + "newDocument": "Nový dokument", + "docIdLabel": "ID dokumentu", + "docIdAutoHint": "Ponechte prázdné pro automaticky vygenerované ID.", + "newFieldTypesHint": "Nová pole mohou být řetězce, čísla, booleovské hodnoty, pole nebo mapy. Úprava existujícího pole typu timestamp, reference, bytes nebo geopoint zachová jeho typ.", + "create": "Vytvořit", + "edit": "Upravit", + "save": "Uložit", + "cancel": "Zrušit", + "deleteDocTitle": "Smazat dokument?", + "deleteDocBody": "Toto smaže {id}. Jeho podkolekce NEBUDOU smazány a zůstanou osiřelé (stále dostupné podle cesty, ale neviditelné ve výpisech).", + "subcollections": "Podkolekce", + "noSubcollections": "Žádné podkolekce", + "filterField": "Pole", + "filterValue": "Hodnota", + "orderBy": "Řadit podle", + "orderByHint": "Dokumenty, které postrádají řadicí pole, Firestore vynechá.", + "apply": "Použít", + "clear": "Vymazat", + "nextPage": "Další", + "prevPage": "Předchozí", + "emptyCollection": "V této kolekci nejsou žádné dokumenty.", + "queryLimitNote": "Zobrazeno prvních {count} výsledků — pro zobrazení dalších zvyšte velikost stránky.", + "selectDoc": "Vyberte dokument pro zobrazení.", + "errPermissionDenied": "Přístup odepřen. Servisní účet potřebuje roli roles/datastore.user (nebo roles/datastore.viewer pro čtení).", + "errServiceDisabled": "Firestore API není pro tento projekt povoleno.", + "errOpenConsole": "Povolit API v konzoli", + "errDatastoreMode": "Tato databáze běží v režimu Datastore, který nástroje Firestore nemohou procházet.", + "errIndexRequired": "Tento dotaz vyžaduje složený index.", + "errCreateIndex": "Vytvořit index v konzoli", + "errQuota": "Kvóta Firestore byla vyčerpána — zkuste to znovu později.", + "errClockSkew": "Google odmítl podepsaný token. Zkontrolujte, zda jsou hodiny tohoto počítače nastaveny správně.", + "errServiceAccountRejected": "Servisní účet byl deaktivován nebo smazán. Vydejte nový klíč v konzoli Google Cloud.", + "errNetwork": "Chyba sítě — zkontrolujte připojení.", + "errNotFound": "Databáze nebyla nalezena. Zkontrolujte Database ID.", + "errDocTooLarge": "Dokument překračuje limit Firestore 1 MB.", + "errInvalidDocJson": "Dokument není platný JSON.", + "errDocNotObject": "Dokument musí být na nejvyšší úrovni objektem JSON.", + "toast": { + "docCreated": "Dokument vytvořen", + "docUpdated": "Dokument uložen", + "docDeleted": "Dokument smazán", + "createFailed": "Vytvoření se nezdařilo: {message}", + "saveFailed": "Uložení se nezdařilo: {message}", + "deleteFailed": "Smazání se nezdařilo: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/da.json b/apps/desktop-ui/messages/da.json index 94f0713a..5cf883a6 100644 --- a/apps/desktop-ui/messages/da.json +++ b/apps/desktop-ui/messages/da.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Indtast en forbindelsesstreng.", "connectionStringScheme": "Forbindelsesstrengen skal starte med mongodb:// eller mongodb+srv://.", "redisUrlRequired": "Indtast en Redis-URL.", - "redisUrlScheme": "Redis-URL skal starte med redis:// eller rediss://." + "redisUrlScheme": "Redis-URL skal starte med redis:// eller rediss://.", + "serviceAccountRequired": "Indsæt en tjenestekontos JSON-nøgle.", + "serviceAccountInvalidJson": "Dette er ikke gyldig JSON.", + "serviceAccountNotServiceAccount": "Denne JSON er ikke en tjenestekontonøgle (forventer typen \"service_account\" med project_id og client_email).", + "serviceAccountBadKey": "Feltet private_key mangler eller er ikke en PKCS#8 PEM-nøgle.", + "databaseIdInvalid": "Database-ID skal være 4–63 små bogstaver, cifre eller bindestreger, eller (default)." + }, + "firestore": { + "serviceAccount": "Tjenestekontonøgle (JSON)", + "serviceAccountPlaceholder": "Indsæt JSON-nøglefilen for en tjenestekonto med Firestore-adgang…", + "serviceAccountHint": "Opret én i Google Cloud Console → IAM → Tjenestekonti → Nøgler. Den skal have rollen roles/datastore.user (eller roles/datastore.viewer for skrivebeskyttet adgang).", + "loadFromFile": "Indlæs fra fil…", + "parsedProject": "Projekt:", + "databaseId": "Database-ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Lad stå tom, medmindre projektet bruger navngivne Firestore-databaser.", + "noCollections": "Ingen samlinger", + "noMatches": "Ingen match", + "docCount": "{count, plural, =0 {Ingen dokumenter} one {# dokument} other {# dokumenter}}", + "newDocument": "Nyt dokument", + "docIdLabel": "Dokument-ID", + "docIdAutoHint": "Lad stå tom for en automatisk genereret ID.", + "newFieldTypesHint": "Nye felter kan være strenge, tal, booleaner, arrays eller maps. Redigering af et eksisterende timestamp-, reference-, bytes- eller geopoint-felt bevarer dets type.", + "create": "Opret", + "edit": "Rediger", + "save": "Gem", + "cancel": "Annuller", + "deleteDocTitle": "Slet dokument?", + "deleteDocBody": "Dette sletter {id}. Dets undersamlinger bliver IKKE slettet og vil blive forældreløse (stadig tilgængelige via stien, usynlige i lister).", + "subcollections": "Undersamlinger", + "noSubcollections": "Ingen undersamlinger", + "filterField": "Felt", + "filterValue": "Værdi", + "orderBy": "Sorter efter", + "orderByHint": "Dokumenter, der mangler sorteringsfeltet, udelukkes af Firestore.", + "apply": "Anvend", + "clear": "Ryd", + "nextPage": "Næste", + "prevPage": "Forrige", + "emptyCollection": "Ingen dokumenter i denne samling.", + "queryLimitNote": "Viser de første {count} resultater — øg sidestørrelsen for flere.", + "selectDoc": "Vælg et dokument for at se det.", + "errPermissionDenied": "Adgang nægtet. Tjenestekontoen skal have rollen roles/datastore.user (eller roles/datastore.viewer for at læse).", + "errServiceDisabled": "Firestore API'et er ikke aktiveret for dette projekt.", + "errOpenConsole": "Aktiver API i console", + "errDatastoreMode": "Denne database er i Datastore-tilstand, som Firestore-værktøjer ikke kan gennemse.", + "errIndexRequired": "Denne forespørgsel kræver et sammensat indeks.", + "errCreateIndex": "Opret indeks i console", + "errQuota": "Firestore-kvote overskredet — prøv igen senere.", + "errClockSkew": "Google afviste det signerede token. Kontroller, at denne computers ur er indstillet korrekt.", + "errServiceAccountRejected": "Tjenestekontoen blev deaktiveret eller slettet. Udsted en ny nøgle i Google Cloud Console.", + "errNetwork": "Netværksfejl — tjek din forbindelse.", + "errNotFound": "Database ikke fundet. Tjek database-ID'et.", + "errDocTooLarge": "Dokumentet overskrider Firestores grænse på 1 MB.", + "errInvalidDocJson": "Dokumentet er ikke gyldig JSON.", + "errDocNotObject": "Et dokument skal være et JSON-objekt på øverste niveau.", + "toast": { + "docCreated": "Dokument oprettet", + "docUpdated": "Dokument gemt", + "docDeleted": "Dokument slettet", + "createFailed": "Oprettelse mislykkedes: {message}", + "saveFailed": "Kunne ikke gemme: {message}", + "deleteFailed": "Kunne ikke slette: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/de.json b/apps/desktop-ui/messages/de.json index d9c15c3d..ae9f08e1 100644 --- a/apps/desktop-ui/messages/de.json +++ b/apps/desktop-ui/messages/de.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Geben Sie eine Verbindungszeichenfolge ein.", "connectionStringScheme": "Die Verbindungszeichenfolge muss mit mongodb:// oder mongodb+srv:// beginnen.", "redisUrlRequired": "Geben Sie eine Redis-URL ein.", - "redisUrlScheme": "Die Redis-URL muss mit redis:// oder rediss:// beginnen." + "redisUrlScheme": "Die Redis-URL muss mit redis:// oder rediss:// beginnen.", + "serviceAccountRequired": "Fügen Sie einen Dienstkonto-JSON-Schlüssel ein.", + "serviceAccountInvalidJson": "Dies ist kein gültiges JSON.", + "serviceAccountNotServiceAccount": "Dieses JSON ist kein Dienstkonto-Schlüssel (erwartet wird der Typ \"service_account\" mit project_id und client_email).", + "serviceAccountBadKey": "Das Feld private_key fehlt oder ist kein PKCS#8-PEM-Schlüssel.", + "databaseIdInvalid": "Die Datenbank-ID muss 4–63 Kleinbuchstaben, Ziffern oder Bindestriche enthalten, oder (default) sein." + }, + "firestore": { + "serviceAccount": "Dienstkonto-Schlüssel (JSON)", + "serviceAccountPlaceholder": "Fügen Sie die JSON-Schlüsseldatei eines Dienstkontos mit Firestore-Zugriff ein…", + "serviceAccountHint": "Erstellen Sie eines in der Google Cloud Console → IAM → Dienstkonten → Schlüssel. Es benötigt die Rolle roles/datastore.user (oder roles/datastore.viewer für Lesezugriff).", + "loadFromFile": "Aus Datei laden…", + "parsedProject": "Projekt:", + "databaseId": "Datenbank-ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Leer lassen, außer das Projekt verwendet benannte Firestore-Datenbanken.", + "noCollections": "Keine Sammlungen", + "noMatches": "Keine Treffer", + "docCount": "{count, plural, =0 {Keine Dokumente} one {# Dokument} other {# Dokumente}}", + "newDocument": "Neues Dokument", + "docIdLabel": "Dokument-ID", + "docIdAutoHint": "Leer lassen für eine automatisch generierte ID.", + "newFieldTypesHint": "Neue Felder können Zeichenfolgen, Zahlen, boolesche Werte, Arrays oder Maps sein. Beim Bearbeiten eines vorhandenen Timestamp-, Referenz-, Bytes- oder Geopoint-Felds bleibt der Typ erhalten.", + "create": "Erstellen", + "edit": "Bearbeiten", + "save": "Speichern", + "cancel": "Abbrechen", + "deleteDocTitle": "Dokument löschen?", + "deleteDocBody": "Dadurch wird {id} gelöscht. Untersammlungen werden NICHT gelöscht und verwaisen (weiterhin über den Pfad erreichbar, aber unsichtbar in Listen).", + "subcollections": "Untersammlungen", + "noSubcollections": "Keine Untersammlungen", + "filterField": "Feld", + "filterValue": "Wert", + "orderBy": "Sortieren nach", + "orderByHint": "Dokumente ohne das Sortierfeld werden von Firestore ausgeschlossen.", + "apply": "Anwenden", + "clear": "Zurücksetzen", + "nextPage": "Weiter", + "prevPage": "Zurück", + "emptyCollection": "Keine Dokumente in dieser Sammlung.", + "queryLimitNote": "Zeigt die ersten {count} Ergebnisse — erhöhen Sie die Seitengröße für mehr.", + "selectDoc": "Wählen Sie ein Dokument aus, um es anzuzeigen.", + "errPermissionDenied": "Zugriff verweigert. Das Dienstkonto benötigt die Rolle roles/datastore.user (oder roles/datastore.viewer zum Lesen).", + "errServiceDisabled": "Die Firestore-API ist für dieses Projekt nicht aktiviert.", + "errOpenConsole": "API in der Console aktivieren", + "errDatastoreMode": "Diese Datenbank befindet sich im Datastore-Modus, den Firestore-Tools nicht durchsuchen können.", + "errIndexRequired": "Diese Abfrage benötigt einen zusammengesetzten Index.", + "errCreateIndex": "Index in der Console erstellen", + "errQuota": "Firestore-Kontingent überschritten — versuchen Sie es später erneut.", + "errClockSkew": "Google hat das signierte Token abgelehnt. Prüfen Sie, ob die Uhrzeit dieses Computers korrekt eingestellt ist.", + "errServiceAccountRejected": "Das Dienstkonto wurde deaktiviert oder gelöscht. Erstellen Sie einen neuen Schlüssel in der Google Cloud Console.", + "errNetwork": "Netzwerkfehler — überprüfen Sie Ihre Verbindung.", + "errNotFound": "Datenbank nicht gefunden. Überprüfen Sie die Datenbank-ID.", + "errDocTooLarge": "Das Dokument überschreitet das 1-MB-Limit von Firestore.", + "errInvalidDocJson": "Das Dokument ist kein gültiges JSON.", + "errDocNotObject": "Ein Dokument muss auf oberster Ebene ein JSON-Objekt sein.", + "toast": { + "docCreated": "Dokument erstellt", + "docUpdated": "Dokument gespeichert", + "docDeleted": "Dokument gelöscht", + "createFailed": "Erstellen fehlgeschlagen: {message}", + "saveFailed": "Speichern fehlgeschlagen: {message}", + "deleteFailed": "Löschen fehlgeschlagen: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/el.json b/apps/desktop-ui/messages/el.json index 92c8214f..f703773d 100644 --- a/apps/desktop-ui/messages/el.json +++ b/apps/desktop-ui/messages/el.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Εισαγάγετε μια συμβολοσειρά σύνδεσης.", "connectionStringScheme": "Η συμβολοσειρά σύνδεσης πρέπει να ξεκινά με mongodb:// ή mongodb+srv://.", "redisUrlRequired": "Εισαγάγετε ένα Redis URL.", - "redisUrlScheme": "Το Redis URL πρέπει να ξεκινά με redis:// ή rediss://." + "redisUrlScheme": "Το Redis URL πρέπει να ξεκινά με redis:// ή rediss://.", + "serviceAccountRequired": "Επικολλήστε ένα κλειδί λογαριασμού υπηρεσίας σε μορφή JSON.", + "serviceAccountInvalidJson": "Αυτό δεν είναι έγκυρο JSON.", + "serviceAccountNotServiceAccount": "Αυτό το JSON δεν είναι κλειδί λογαριασμού υπηρεσίας (αναμενόμενος τύπος \"service_account\" με project_id και client_email).", + "serviceAccountBadKey": "Το πεδίο private_key λείπει ή δεν είναι κλειδί PKCS#8 PEM.", + "databaseIdInvalid": "Το Database ID πρέπει να έχει 4–63 πεζά γράμματα, ψηφία ή παύλες, ή να είναι (default)." + }, + "firestore": { + "serviceAccount": "Κλειδί λογαριασμού υπηρεσίας (JSON)", + "serviceAccountPlaceholder": "Επικολλήστε το αρχείο κλειδιού JSON ενός λογαριασμού υπηρεσίας με πρόσβαση στο Firestore…", + "serviceAccountHint": "Δημιουργήστε ένα στην κονσόλα Google Cloud → IAM → Λογαριασμοί υπηρεσίας → Κλειδιά. Χρειάζεται τον ρόλο roles/datastore.user (ή roles/datastore.viewer μόνο για ανάγνωση).", + "loadFromFile": "Φόρτωση από αρχείο…", + "parsedProject": "Έργο:", + "databaseId": "Database ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Αφήστε το κενό, εκτός αν το έργο χρησιμοποιεί επώνυμες βάσεις δεδομένων Firestore.", + "noCollections": "Καμία συλλογή", + "noMatches": "Καμία αντιστοίχιση", + "docCount": "{count, plural, =0 {Δεν υπάρχουν έγγραφα} one {# έγγραφο} other {# έγγραφα}}", + "newDocument": "Νέο έγγραφο", + "docIdLabel": "ID εγγράφου", + "docIdAutoHint": "Αφήστε το κενό για αυτόματα δημιουργημένο ID.", + "newFieldTypesHint": "Τα νέα πεδία μπορούν να είναι συμβολοσειρές, αριθμοί, boolean τιμές, πίνακες ή αντικείμενα (maps). Η επεξεργασία υπάρχοντος πεδίου τύπου timestamp, reference, bytes ή geopoint διατηρεί τον τύπο του.", + "create": "Δημιουργία", + "edit": "Επεξεργασία", + "save": "Αποθήκευση", + "cancel": "Ακύρωση", + "deleteDocTitle": "Διαγραφή εγγράφου;", + "deleteDocBody": "Αυτό θα διαγράψει το {id}. Οι υποσυλλογές του ΔΕΝ διαγράφονται και θα μείνουν ορφανές (παραμένουν προσβάσιμες μέσω διαδρομής, αλλά αόρατες στις λίστες).", + "subcollections": "Υποσυλλογές", + "noSubcollections": "Καμία υποσυλλογή", + "filterField": "Πεδίο", + "filterValue": "Τιμή", + "orderBy": "Ταξινόμηση κατά", + "orderByHint": "Τα έγγραφα χωρίς το πεδίο ταξινόμησης εξαιρούνται από το Firestore.", + "apply": "Εφαρμογή", + "clear": "Απαλοιφή", + "nextPage": "Επόμενο", + "prevPage": "Προηγούμενο", + "emptyCollection": "Δεν υπάρχουν έγγραφα σε αυτήν τη συλλογή.", + "queryLimitNote": "Εμφανίζονται τα πρώτα {count} αποτελέσματα — αυξήστε το μέγεθος σελίδας για περισσότερα.", + "selectDoc": "Επιλέξτε ένα έγγραφο για να το προβάλετε.", + "errPermissionDenied": "Δεν επιτρέπεται η πρόσβαση. Ο λογαριασμός υπηρεσίας χρειάζεται τον ρόλο roles/datastore.user (ή roles/datastore.viewer για ανάγνωση).", + "errServiceDisabled": "Το Firestore API δεν είναι ενεργοποιημένο για αυτό το έργο.", + "errOpenConsole": "Ενεργοποίηση API στην κονσόλα", + "errDatastoreMode": "Αυτή η βάση δεδομένων βρίσκεται σε λειτουργία Datastore, την οποία τα εργαλεία Firestore δεν μπορούν να περιηγηθούν.", + "errIndexRequired": "Αυτό το ερώτημα χρειάζεται σύνθετο ευρετήριο.", + "errCreateIndex": "Δημιουργία ευρετηρίου στην κονσόλα", + "errQuota": "Η ποσόστωση του Firestore εξαντλήθηκε — δοκιμάστε ξανά αργότερα.", + "errClockSkew": "Το Google απέρριψε το υπογεγραμμένο token. Ελέγξτε ότι το ρολόι αυτού του υπολογιστή είναι σωστά ρυθμισμένο.", + "errServiceAccountRejected": "Ο λογαριασμός υπηρεσίας απενεργοποιήθηκε ή διαγράφηκε. Εκδώστε νέο κλειδί στην κονσόλα Google Cloud.", + "errNetwork": "Σφάλμα δικτύου — ελέγξτε τη σύνδεσή σας.", + "errNotFound": "Η βάση δεδομένων δεν βρέθηκε. Ελέγξτε το Database ID.", + "errDocTooLarge": "Το έγγραφο υπερβαίνει το όριο του Firestore του 1 MB.", + "errInvalidDocJson": "Το έγγραφο δεν είναι έγκυρο JSON.", + "errDocNotObject": "Ένα έγγραφο πρέπει να είναι αντικείμενο JSON στο ανώτατο επίπεδο.", + "toast": { + "docCreated": "Το έγγραφο δημιουργήθηκε", + "docUpdated": "Το έγγραφο αποθηκεύτηκε", + "docDeleted": "Το έγγραφο διαγράφηκε", + "createFailed": "Η δημιουργία απέτυχε: {message}", + "saveFailed": "Η αποθήκευση απέτυχε: {message}", + "deleteFailed": "Η διαγραφή απέτυχε: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/en.json b/apps/desktop-ui/messages/en.json index a7a156fb..6a95c895 100644 --- a/apps/desktop-ui/messages/en.json +++ b/apps/desktop-ui/messages/en.json @@ -1941,7 +1941,70 @@ "connectionStringRequired": "Enter a connection string.", "connectionStringScheme": "Connection string must start with mongodb:// or mongodb+srv://.", "redisUrlRequired": "Enter a Redis URL.", - "redisUrlScheme": "Redis URL must start with redis:// or rediss://." + "redisUrlScheme": "Redis URL must start with redis:// or rediss://.", + "serviceAccountRequired": "Paste a service account JSON key.", + "serviceAccountInvalidJson": "This is not valid JSON.", + "serviceAccountNotServiceAccount": "This JSON is not a service account key (expected type \"service_account\" with project_id and client_email).", + "serviceAccountBadKey": "The private_key field is missing or not a PKCS#8 PEM key.", + "databaseIdInvalid": "Database ID must be 4–63 lowercase letters, digits or hyphens, or (default)." + }, + "firestore": { + "serviceAccount": "Service account key (JSON)", + "serviceAccountPlaceholder": "Paste the JSON key file of a service account with Firestore access…", + "serviceAccountHint": "Create one in Google Cloud console → IAM → Service Accounts → Keys. It needs the roles/datastore.user role (or roles/datastore.viewer for read-only).", + "loadFromFile": "Load from file…", + "parsedProject": "Project:", + "databaseId": "Database ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Leave empty unless the project uses named Firestore databases.", + "noCollections": "No collections", + "noMatches": "No matches", + "docCount": "{count, plural, =0 {No documents} one {# document} other {# documents}}", + "newDocument": "New document", + "docIdLabel": "Document ID", + "docIdAutoHint": "Leave empty for an auto-generated ID.", + "newFieldTypesHint": "New fields can be strings, numbers, booleans, arrays or maps. Editing an existing timestamp, reference, bytes or geopoint field keeps its type.", + "create": "Create", + "edit": "Edit", + "save": "Save", + "cancel": "Cancel", + "deleteDocTitle": "Delete document?", + "deleteDocBody": "This deletes {id}. Its subcollections are NOT deleted and will be orphaned (still reachable by path, invisible in listings).", + "subcollections": "Subcollections", + "noSubcollections": "No subcollections", + "filterField": "Field", + "filterValue": "Value", + "orderBy": "Order by", + "orderByHint": "Documents missing the ordered field are excluded by Firestore.", + "apply": "Apply", + "clear": "Clear", + "nextPage": "Next", + "prevPage": "Previous", + "emptyCollection": "No documents in this collection.", + "queryLimitNote": "Showing the first {count} results — raise the page size for more.", + "selectDoc": "Select a document to view it.", + "errPermissionDenied": "Permission denied. The service account needs the roles/datastore.user role (or roles/datastore.viewer to read).", + "errServiceDisabled": "The Firestore API is not enabled for this project.", + "errOpenConsole": "Enable API in console", + "errDatastoreMode": "This database is in Datastore mode, which Firestore tools cannot browse.", + "errIndexRequired": "This query needs a composite index.", + "errCreateIndex": "Create index in console", + "errQuota": "Firestore quota exceeded — try again later.", + "errClockSkew": "Google rejected the signed token. Check that this computer's clock is set correctly.", + "errServiceAccountRejected": "The service account was disabled or deleted. Issue a new key in the Google Cloud console.", + "errNetwork": "Network error — check your connection.", + "errNotFound": "Database not found. Check the database ID.", + "errDocTooLarge": "Document exceeds Firestore's 1 MB limit.", + "errInvalidDocJson": "The document is not valid JSON.", + "errDocNotObject": "A document must be a JSON object at the top level.", + "toast": { + "docCreated": "Document created", + "docUpdated": "Document saved", + "docDeleted": "Document deleted", + "createFailed": "Create failed: {message}", + "saveFailed": "Save failed: {message}", + "deleteFailed": "Delete failed: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/es.json b/apps/desktop-ui/messages/es.json index 6ddab914..bef84327 100644 --- a/apps/desktop-ui/messages/es.json +++ b/apps/desktop-ui/messages/es.json @@ -1926,7 +1926,70 @@ "connectionStringRequired": "Introduce una cadena de conexión.", "connectionStringScheme": "La cadena de conexión debe empezar con mongodb:// o mongodb+srv://.", "redisUrlRequired": "Introduce una URL de Redis.", - "redisUrlScheme": "La URL de Redis debe empezar con redis:// o rediss://." + "redisUrlScheme": "La URL de Redis debe empezar con redis:// o rediss://.", + "serviceAccountRequired": "Pega una clave JSON de cuenta de servicio.", + "serviceAccountInvalidJson": "Esto no es JSON válido.", + "serviceAccountNotServiceAccount": "Este JSON no es una clave de cuenta de servicio (se esperaba el tipo \"service_account\" con project_id y client_email).", + "serviceAccountBadKey": "Falta el campo private_key o no es una clave PEM PKCS#8.", + "databaseIdInvalid": "El ID de la base de datos debe tener entre 4 y 63 letras minúsculas, dígitos o guiones, o ser (default)." + }, + "firestore": { + "serviceAccount": "Clave de cuenta de servicio (JSON)", + "serviceAccountPlaceholder": "Pega el archivo de clave JSON de una cuenta de servicio con acceso a Firestore…", + "serviceAccountHint": "Créala en Google Cloud console → IAM → Cuentas de servicio → Claves. Necesita el rol roles/datastore.user (o roles/datastore.viewer solo para lectura).", + "loadFromFile": "Cargar desde archivo…", + "parsedProject": "Proyecto:", + "databaseId": "ID de la base de datos", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Déjalo vacío salvo que el proyecto use bases de datos Firestore con nombre.", + "noCollections": "Sin colecciones", + "noMatches": "Sin coincidencias", + "docCount": "{count, plural, =0 {Sin documentos} one {# documento} other {# documentos}}", + "newDocument": "Nuevo documento", + "docIdLabel": "ID del documento", + "docIdAutoHint": "Déjalo vacío para generar un ID automáticamente.", + "newFieldTypesHint": "Los campos nuevos pueden ser cadenas, números, booleanos, arrays o mapas. Editar un campo existente de tipo timestamp, referencia, bytes o geopoint conserva su tipo.", + "create": "Crear", + "edit": "Editar", + "save": "Guardar", + "cancel": "Cancelar", + "deleteDocTitle": "¿Eliminar documento?", + "deleteDocBody": "Esto elimina {id}. Sus subcolecciones NO se eliminan y quedarán huérfanas (siguen siendo accesibles por ruta, pero invisibles en los listados).", + "subcollections": "Subcolecciones", + "noSubcollections": "Sin subcolecciones", + "filterField": "Campo", + "filterValue": "Valor", + "orderBy": "Ordenar por", + "orderByHint": "Firestore excluye los documentos a los que les falta el campo de ordenación.", + "apply": "Aplicar", + "clear": "Borrar", + "nextPage": "Siguiente", + "prevPage": "Anterior", + "emptyCollection": "No hay documentos en esta colección.", + "queryLimitNote": "Mostrando los primeros {count} resultados — aumenta el tamaño de página para ver más.", + "selectDoc": "Selecciona un documento para verlo.", + "errPermissionDenied": "Permiso denegado. La cuenta de servicio necesita el rol roles/datastore.user (o roles/datastore.viewer para leer).", + "errServiceDisabled": "La API de Firestore no está habilitada para este proyecto.", + "errOpenConsole": "Habilitar API en la consola", + "errDatastoreMode": "Esta base de datos está en modo Datastore, que las herramientas de Firestore no pueden explorar.", + "errIndexRequired": "Esta consulta necesita un índice compuesto.", + "errCreateIndex": "Crear índice en la consola", + "errQuota": "Se superó la cuota de Firestore — inténtalo de nuevo más tarde.", + "errClockSkew": "Google rechazó el token firmado. Comprueba que el reloj de este ordenador esté bien configurado.", + "errServiceAccountRejected": "La cuenta de servicio se deshabilitó o eliminó. Genera una nueva clave en la consola de Google Cloud.", + "errNetwork": "Error de red — comprueba tu conexión.", + "errNotFound": "Base de datos no encontrada. Comprueba el ID de la base de datos.", + "errDocTooLarge": "El documento supera el límite de 1 MB de Firestore.", + "errInvalidDocJson": "El documento no es JSON válido.", + "errDocNotObject": "Un documento debe ser un objeto JSON en el nivel superior.", + "toast": { + "docCreated": "Documento creado", + "docUpdated": "Documento guardado", + "docDeleted": "Documento eliminado", + "createFailed": "Error al crear: {message}", + "saveFailed": "Error al guardar: {message}", + "deleteFailed": "Error al eliminar: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/fa.json b/apps/desktop-ui/messages/fa.json index 6b78344d..adc05921 100644 --- a/apps/desktop-ui/messages/fa.json +++ b/apps/desktop-ui/messages/fa.json @@ -1926,7 +1926,70 @@ "connectionStringRequired": "یک رشته اتصال وارد کنید.", "connectionStringScheme": "رشته اتصال باید با mongodb:// یا mongodb+srv:// شروع شود.", "redisUrlRequired": "آدرس Redis را وارد کنید.", - "redisUrlScheme": "آدرس Redis باید با redis:// یا rediss:// شروع شود." + "redisUrlScheme": "آدرس Redis باید با redis:// یا rediss:// شروع شود.", + "serviceAccountRequired": "کلید JSON حساب سرویس را جای‌گذاری کنید.", + "serviceAccountInvalidJson": "این یک JSON معتبر نیست.", + "serviceAccountNotServiceAccount": "این JSON یک کلید حساب سرویس نیست (نوع \"service_account\" همراه با project_id و client_email مورد نیاز است).", + "serviceAccountBadKey": "فیلد private_key وجود ندارد یا یک کلید PEM با فرمت PKCS#8 نیست.", + "databaseIdInvalid": "شناسه پایگاه داده باید ۴ تا ۶۳ حرف کوچک، رقم یا خط تیره باشد، یا (default) باشد." + }, + "firestore": { + "serviceAccount": "کلید حساب سرویس (JSON)", + "serviceAccountPlaceholder": "فایل کلید JSON یک حساب سرویس با دسترسی به Firestore را جای‌گذاری کنید…", + "serviceAccountHint": "آن را در Google Cloud console → IAM → Service Accounts → Keys ایجاد کنید. به نقش roles/datastore.user نیاز دارد (یا roles/datastore.viewer فقط برای خواندن).", + "loadFromFile": "بارگذاری از فایل…", + "parsedProject": "پروژه:", + "databaseId": "شناسه پایگاه داده", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "مگر اینکه پروژه از پایگاه‌های داده Firestore نام‌گذاری‌شده استفاده کند، آن را خالی بگذارید.", + "noCollections": "مجموعه‌ای وجود ندارد", + "noMatches": "موردی یافت نشد", + "docCount": "{count, plural, =0 {سندی وجود ندارد} other {# سند}}", + "newDocument": "سند جدید", + "docIdLabel": "شناسه سند", + "docIdAutoHint": "برای تولید خودکار شناسه، خالی بگذارید.", + "newFieldTypesHint": "فیلدهای جدید می‌توانند رشته، عدد، بولین، آرایه یا مپ باشند. ویرایش یک فیلد timestamp، reference، bytes یا geopoint موجود، نوع آن را حفظ می‌کند.", + "create": "ایجاد", + "edit": "ویرایش", + "save": "ذخیره", + "cancel": "لغو", + "deleteDocTitle": "سند حذف شود؟", + "deleteDocBody": "این کار {id} را حذف می‌کند. زیرمجموعه‌های آن حذف نمی‌شوند و بی‌سرپرست باقی می‌مانند (همچنان از طریق مسیر قابل دسترسی هستند اما در فهرست‌ها نمایش داده نمی‌شوند).", + "subcollections": "زیرمجموعه‌ها", + "noSubcollections": "زیرمجموعه‌ای وجود ندارد", + "filterField": "فیلد", + "filterValue": "مقدار", + "orderBy": "مرتب‌سازی بر اساس", + "orderByHint": "اسنادی که فیلد مرتب‌سازی را ندارند توسط Firestore حذف می‌شوند.", + "apply": "اعمال", + "clear": "پاک کردن", + "nextPage": "بعدی", + "prevPage": "قبلی", + "emptyCollection": "هیچ سندی در این مجموعه وجود ندارد.", + "queryLimitNote": "{count} نتیجه اول نمایش داده می‌شود — برای دیدن بیشتر، اندازه صفحه را افزایش دهید.", + "selectDoc": "برای مشاهده، یک سند انتخاب کنید.", + "errPermissionDenied": "دسترسی رد شد. حساب سرویس به نقش roles/datastore.user نیاز دارد (یا roles/datastore.viewer برای خواندن).", + "errServiceDisabled": "Firestore API برای این پروژه فعال نشده است.", + "errOpenConsole": "فعال‌سازی API در کنسول", + "errDatastoreMode": "این پایگاه داده در حالت Datastore است که ابزارهای Firestore نمی‌توانند آن را مرور کنند.", + "errIndexRequired": "این پرس‌وجو به یک ایندکس ترکیبی نیاز دارد.", + "errCreateIndex": "ایجاد ایندکس در کنسول", + "errQuota": "سهمیه Firestore تمام شده است — بعداً دوباره امتحان کنید.", + "errClockSkew": "Google توکن امضاشده را رد کرد. بررسی کنید که ساعت این رایانه به‌درستی تنظیم شده باشد.", + "errServiceAccountRejected": "حساب سرویس غیرفعال یا حذف شده است. یک کلید جدید در Google Cloud console صادر کنید.", + "errNetwork": "خطای شبکه — اتصال خود را بررسی کنید.", + "errNotFound": "پایگاه داده یافت نشد. شناسه پایگاه داده را بررسی کنید.", + "errDocTooLarge": "سند از محدودیت ۱ مگابایتی Firestore بیشتر است.", + "errInvalidDocJson": "این سند یک JSON معتبر نیست.", + "errDocNotObject": "سند باید در سطح بالا یک شیء JSON باشد.", + "toast": { + "docCreated": "سند ایجاد شد", + "docUpdated": "سند ذخیره شد", + "docDeleted": "سند حذف شد", + "createFailed": "ایجاد ناموفق بود: {message}", + "saveFailed": "ذخیره ناموفق بود: {message}", + "deleteFailed": "حذف ناموفق بود: {message}" + } }, "redis": { "urlMode": "آدرس", diff --git a/apps/desktop-ui/messages/fr.json b/apps/desktop-ui/messages/fr.json index 8b95c6fc..9c45a00e 100644 --- a/apps/desktop-ui/messages/fr.json +++ b/apps/desktop-ui/messages/fr.json @@ -1926,7 +1926,70 @@ "connectionStringRequired": "Saisissez une chaîne de connexion.", "connectionStringScheme": "La chaîne de connexion doit commencer par mongodb:// ou mongodb+srv://.", "redisUrlRequired": "Saisissez une URL Redis.", - "redisUrlScheme": "L'URL Redis doit commencer par redis:// ou rediss://." + "redisUrlScheme": "L'URL Redis doit commencer par redis:// ou rediss://.", + "serviceAccountRequired": "Collez une clé JSON de compte de service.", + "serviceAccountInvalidJson": "Ceci n'est pas un JSON valide.", + "serviceAccountNotServiceAccount": "Ce JSON n'est pas une clé de compte de service (le type \"service_account\" avec project_id et client_email est attendu).", + "serviceAccountBadKey": "Le champ private_key est manquant ou n'est pas une clé PEM PKCS#8.", + "databaseIdInvalid": "L'ID de la base de données doit comporter entre 4 et 63 lettres minuscules, chiffres ou tirets, ou être (default)." + }, + "firestore": { + "serviceAccount": "Clé de compte de service (JSON)", + "serviceAccountPlaceholder": "Collez le fichier de clé JSON d'un compte de service ayant accès à Firestore…", + "serviceAccountHint": "Créez-en une dans la console Google Cloud → IAM → Comptes de service → Clés. Le rôle roles/datastore.user est requis (ou roles/datastore.viewer pour un accès en lecture seule).", + "loadFromFile": "Charger depuis un fichier…", + "parsedProject": "Projet :", + "databaseId": "ID de la base de données", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Laissez vide sauf si le projet utilise des bases de données Firestore nommées.", + "noCollections": "Aucune collection", + "noMatches": "Aucun résultat", + "docCount": "{count, plural, =0 {Aucun document} one {# document} other {# documents}}", + "newDocument": "Nouveau document", + "docIdLabel": "ID du document", + "docIdAutoHint": "Laissez vide pour générer un ID automatiquement.", + "newFieldTypesHint": "Les nouveaux champs peuvent être des chaînes, nombres, booléens, tableaux ou maps. La modification d'un champ existant de type timestamp, référence, bytes ou geopoint conserve son type.", + "create": "Créer", + "edit": "Modifier", + "save": "Enregistrer", + "cancel": "Annuler", + "deleteDocTitle": "Supprimer le document ?", + "deleteDocBody": "Cette action supprime {id}. Ses sous-collections ne sont PAS supprimées et deviendront orphelines (toujours accessibles par leur chemin, mais invisibles dans les listes).", + "subcollections": "Sous-collections", + "noSubcollections": "Aucune sous-collection", + "filterField": "Champ", + "filterValue": "Valeur", + "orderBy": "Trier par", + "orderByHint": "Les documents ne comportant pas le champ de tri sont exclus par Firestore.", + "apply": "Appliquer", + "clear": "Effacer", + "nextPage": "Suivant", + "prevPage": "Précédent", + "emptyCollection": "Aucun document dans cette collection.", + "queryLimitNote": "Affichage des {count} premiers résultats — augmentez la taille de page pour en voir plus.", + "selectDoc": "Sélectionnez un document pour l'afficher.", + "errPermissionDenied": "Accès refusé. Le compte de service doit disposer du rôle roles/datastore.user (ou roles/datastore.viewer pour la lecture).", + "errServiceDisabled": "L'API Firestore n'est pas activée pour ce projet.", + "errOpenConsole": "Activer l'API dans la console", + "errDatastoreMode": "Cette base de données est en mode Datastore, que les outils Firestore ne peuvent pas explorer.", + "errIndexRequired": "Cette requête nécessite un index composite.", + "errCreateIndex": "Créer l'index dans la console", + "errQuota": "Quota Firestore dépassé — réessayez plus tard.", + "errClockSkew": "Google a rejeté le jeton signé. Vérifiez que l'horloge de cet ordinateur est correctement réglée.", + "errServiceAccountRejected": "Le compte de service a été désactivé ou supprimé. Générez une nouvelle clé dans la console Google Cloud.", + "errNetwork": "Erreur réseau — vérifiez votre connexion.", + "errNotFound": "Base de données introuvable. Vérifiez l'ID de la base de données.", + "errDocTooLarge": "Le document dépasse la limite de 1 Mo de Firestore.", + "errInvalidDocJson": "Le document n'est pas un JSON valide.", + "errDocNotObject": "Un document doit être un objet JSON au premier niveau.", + "toast": { + "docCreated": "Document créé", + "docUpdated": "Document enregistré", + "docDeleted": "Document supprimé", + "createFailed": "Échec de la création : {message}", + "saveFailed": "Échec de l'enregistrement : {message}", + "deleteFailed": "Échec de la suppression : {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/id.json b/apps/desktop-ui/messages/id.json index 47f9db98..d2bf16cf 100644 --- a/apps/desktop-ui/messages/id.json +++ b/apps/desktop-ui/messages/id.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Masukkan string koneksi.", "connectionStringScheme": "String koneksi harus dimulai dengan mongodb:// atau mongodb+srv://.", "redisUrlRequired": "Masukkan URL Redis.", - "redisUrlScheme": "URL Redis harus dimulai dengan redis:// atau rediss://." + "redisUrlScheme": "URL Redis harus dimulai dengan redis:// atau rediss://.", + "serviceAccountRequired": "Tempel kunci JSON akun layanan.", + "serviceAccountInvalidJson": "Ini bukan JSON yang valid.", + "serviceAccountNotServiceAccount": "JSON ini bukan kunci akun layanan (harus bertipe \"service_account\" dengan project_id dan client_email).", + "serviceAccountBadKey": "Kolom private_key tidak ada atau bukan kunci PEM PKCS#8.", + "databaseIdInvalid": "ID database harus terdiri dari 4–63 huruf kecil, angka, atau tanda hubung, atau (default)." + }, + "firestore": { + "serviceAccount": "Kunci akun layanan (JSON)", + "serviceAccountPlaceholder": "Tempel file kunci JSON dari akun layanan yang memiliki akses Firestore…", + "serviceAccountHint": "Buat di Google Cloud console → IAM → Service Accounts → Keys. Diperlukan peran roles/datastore.user (atau roles/datastore.viewer untuk akses baca saja).", + "loadFromFile": "Muat dari file…", + "parsedProject": "Proyek:", + "databaseId": "ID database", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Biarkan kosong kecuali proyek menggunakan database Firestore bernama.", + "noCollections": "Tidak ada koleksi", + "noMatches": "Tidak ada yang cocok", + "docCount": "{count, plural, =0 {Tidak ada dokumen} other {# dokumen}}", + "newDocument": "Dokumen baru", + "docIdLabel": "ID dokumen", + "docIdAutoHint": "Biarkan kosong agar ID dibuat otomatis.", + "newFieldTypesHint": "Kolom baru bisa berupa string, angka, boolean, array, atau map. Mengedit kolom timestamp, reference, bytes, atau geopoint yang sudah ada akan mempertahankan tipenya.", + "create": "Buat", + "edit": "Edit", + "save": "Simpan", + "cancel": "Batal", + "deleteDocTitle": "Hapus dokumen?", + "deleteDocBody": "Ini akan menghapus {id}. Subkoleksinya TIDAK dihapus dan akan menjadi yatim (masih dapat diakses lewat path, tetapi tidak terlihat pada daftar).", + "subcollections": "Subkoleksi", + "noSubcollections": "Tidak ada subkoleksi", + "filterField": "Kolom", + "filterValue": "Nilai", + "orderBy": "Urutkan berdasarkan", + "orderByHint": "Dokumen yang tidak memiliki kolom pengurutan akan dikecualikan oleh Firestore.", + "apply": "Terapkan", + "clear": "Bersihkan", + "nextPage": "Berikutnya", + "prevPage": "Sebelumnya", + "emptyCollection": "Tidak ada dokumen dalam koleksi ini.", + "queryLimitNote": "Menampilkan {count} hasil pertama — perbesar ukuran halaman untuk melihat lebih banyak.", + "selectDoc": "Pilih dokumen untuk melihatnya.", + "errPermissionDenied": "Izin ditolak. Akun layanan memerlukan peran roles/datastore.user (atau roles/datastore.viewer untuk membaca).", + "errServiceDisabled": "Firestore API belum diaktifkan untuk proyek ini.", + "errOpenConsole": "Aktifkan API di console", + "errDatastoreMode": "Database ini dalam mode Datastore, yang tidak bisa dijelajahi oleh alat Firestore.", + "errIndexRequired": "Kueri ini memerlukan indeks komposit.", + "errCreateIndex": "Buat indeks di console", + "errQuota": "Kuota Firestore terlampaui — coba lagi nanti.", + "errClockSkew": "Google menolak token yang ditandatangani. Periksa apakah jam komputer ini sudah diatur dengan benar.", + "errServiceAccountRejected": "Akun layanan telah dinonaktifkan atau dihapus. Terbitkan kunci baru di Google Cloud console.", + "errNetwork": "Kesalahan jaringan — periksa koneksi Anda.", + "errNotFound": "Database tidak ditemukan. Periksa ID database.", + "errDocTooLarge": "Dokumen melebihi batas 1 MB Firestore.", + "errInvalidDocJson": "Dokumen ini bukan JSON yang valid.", + "errDocNotObject": "Dokumen harus berupa objek JSON di tingkat atas.", + "toast": { + "docCreated": "Dokumen dibuat", + "docUpdated": "Dokumen disimpan", + "docDeleted": "Dokumen dihapus", + "createFailed": "Gagal membuat: {message}", + "saveFailed": "Gagal menyimpan: {message}", + "deleteFailed": "Gagal menghapus: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/it.json b/apps/desktop-ui/messages/it.json index 69a77d37..9bc3c9fe 100644 --- a/apps/desktop-ui/messages/it.json +++ b/apps/desktop-ui/messages/it.json @@ -1926,7 +1926,70 @@ "connectionStringRequired": "Inserisci una stringa di connessione.", "connectionStringScheme": "La stringa di connessione deve iniziare con mongodb:// o mongodb+srv://.", "redisUrlRequired": "Inserisci un URL Redis.", - "redisUrlScheme": "L'URL Redis deve iniziare con redis:// o rediss://." + "redisUrlScheme": "L'URL Redis deve iniziare con redis:// o rediss://.", + "serviceAccountRequired": "Incolla una chiave JSON di un account di servizio.", + "serviceAccountInvalidJson": "Questo non è un JSON valido.", + "serviceAccountNotServiceAccount": "Questo JSON non è una chiave di account di servizio (era previsto il tipo \"service_account\" con project_id e client_email).", + "serviceAccountBadKey": "Il campo private_key manca oppure non è una chiave PEM PKCS#8.", + "databaseIdInvalid": "L'ID del database deve avere da 4 a 63 lettere minuscole, cifre o trattini, oppure essere (default)." + }, + "firestore": { + "serviceAccount": "Chiave dell'account di servizio (JSON)", + "serviceAccountPlaceholder": "Incolla il file della chiave JSON di un account di servizio con accesso a Firestore…", + "serviceAccountHint": "Creane una nella console di Google Cloud → IAM → Account di servizio → Chiavi. Serve il ruolo roles/datastore.user (oppure roles/datastore.viewer per il solo accesso in lettura).", + "loadFromFile": "Carica da file…", + "parsedProject": "Progetto:", + "databaseId": "ID del database", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Lascia vuoto a meno che il progetto non usi database Firestore con nome.", + "noCollections": "Nessuna raccolta", + "noMatches": "Nessun risultato", + "docCount": "{count, plural, =0 {Nessun documento} one {# documento} other {# documenti}}", + "newDocument": "Nuovo documento", + "docIdLabel": "ID documento", + "docIdAutoHint": "Lascia vuoto per generare automaticamente un ID.", + "newFieldTypesHint": "I nuovi campi possono essere stringhe, numeri, booleani, array o mappe. Modificare un campo esistente di tipo timestamp, riferimento, bytes o geopoint ne mantiene il tipo.", + "create": "Crea", + "edit": "Modifica", + "save": "Salva", + "cancel": "Annulla", + "deleteDocTitle": "Eliminare il documento?", + "deleteDocBody": "Questa azione elimina {id}. Le sue sottoraccolte NON vengono eliminate e resteranno orfane (ancora raggiungibili tramite percorso, ma invisibili negli elenchi).", + "subcollections": "Sottoraccolte", + "noSubcollections": "Nessuna sottoraccolta", + "filterField": "Campo", + "filterValue": "Valore", + "orderBy": "Ordina per", + "orderByHint": "Firestore esclude i documenti privi del campo di ordinamento.", + "apply": "Applica", + "clear": "Cancella", + "nextPage": "Successivo", + "prevPage": "Precedente", + "emptyCollection": "Nessun documento in questa raccolta.", + "queryLimitNote": "Vengono mostrati i primi {count} risultati — aumenta la dimensione della pagina per vederne altri.", + "selectDoc": "Seleziona un documento per visualizzarlo.", + "errPermissionDenied": "Permesso negato. L'account di servizio necessita del ruolo roles/datastore.user (oppure roles/datastore.viewer per la lettura).", + "errServiceDisabled": "L'API Firestore non è abilitata per questo progetto.", + "errOpenConsole": "Abilita l'API nella console", + "errDatastoreMode": "Questo database è in modalità Datastore, che gli strumenti Firestore non possono esplorare.", + "errIndexRequired": "Questa query richiede un indice composito.", + "errCreateIndex": "Crea l'indice nella console", + "errQuota": "Quota Firestore superata — riprova più tardi.", + "errClockSkew": "Google ha rifiutato il token firmato. Verifica che l'orologio di questo computer sia impostato correttamente.", + "errServiceAccountRejected": "L'account di servizio è stato disabilitato o eliminato. Genera una nuova chiave nella console di Google Cloud.", + "errNetwork": "Errore di rete — controlla la tua connessione.", + "errNotFound": "Database non trovato. Controlla l'ID del database.", + "errDocTooLarge": "Il documento supera il limite di 1 MB di Firestore.", + "errInvalidDocJson": "Il documento non è JSON valido.", + "errDocNotObject": "Un documento deve essere un oggetto JSON al livello superiore.", + "toast": { + "docCreated": "Documento creato", + "docUpdated": "Documento salvato", + "docDeleted": "Documento eliminato", + "createFailed": "Creazione non riuscita: {message}", + "saveFailed": "Salvataggio non riuscito: {message}", + "deleteFailed": "Eliminazione non riuscita: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/ja.json b/apps/desktop-ui/messages/ja.json index 7fa0dc53..6f3b3346 100644 --- a/apps/desktop-ui/messages/ja.json +++ b/apps/desktop-ui/messages/ja.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "接続文字列を入力してください。", "connectionStringScheme": "接続文字列はmongodb://またはmongodb+srv://で始まる必要があります。", "redisUrlRequired": "Redis URLを入力してください。", - "redisUrlScheme": "Redis URLはredis://またはrediss://で始まる必要があります。" + "redisUrlScheme": "Redis URLはredis://またはrediss://で始まる必要があります。", + "serviceAccountRequired": "サービスアカウントのJSONキーを貼り付けてください。", + "serviceAccountInvalidJson": "これは有効なJSONではありません。", + "serviceAccountNotServiceAccount": "このJSONはサービスアカウントキーではありません(\"service_account\"タイプでproject_idとclient_emailが必要です)。", + "serviceAccountBadKey": "private_keyフィールドがないか、PKCS#8形式のPEMキーではありません。", + "databaseIdInvalid": "データベースIDは4〜63文字の小文字・数字・ハイフン、または(default)である必要があります。" + }, + "firestore": { + "serviceAccount": "サービスアカウントキー(JSON)", + "serviceAccountPlaceholder": "Firestoreへのアクセス権を持つサービスアカウントのJSONキーファイルを貼り付けてください…", + "serviceAccountHint": "Google Cloud コンソール → IAM → サービスアカウント → キー で作成します。roles/datastore.user ロール(読み取り専用の場合は roles/datastore.viewer)が必要です。", + "loadFromFile": "ファイルから読み込む…", + "parsedProject": "プロジェクト:", + "databaseId": "データベースID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "プロジェクトが名前付きFirestoreデータベースを使用していない限り、空欄のままにしてください。", + "noCollections": "コレクションがありません", + "noMatches": "一致するものがありません", + "docCount": "{count, plural, =0 {ドキュメントがありません} other {#件のドキュメント}}", + "newDocument": "新規ドキュメント", + "docIdLabel": "ドキュメントID", + "docIdAutoHint": "空欄にすると自動生成されたIDが使用されます。", + "newFieldTypesHint": "新しいフィールドは文字列、数値、真偽値、配列またはマップにできます。既存のtimestamp、reference、bytes、geopointフィールドを編集してもその型は保持されます。", + "create": "作成", + "edit": "編集", + "save": "保存", + "cancel": "キャンセル", + "deleteDocTitle": "ドキュメントを削除しますか?", + "deleteDocBody": "これにより{id}が削除されます。サブコレクションは削除されず、孤立した状態になります(パスからは引き続きアクセス可能ですが、一覧には表示されません)。", + "subcollections": "サブコレクション", + "noSubcollections": "サブコレクションがありません", + "filterField": "フィールド", + "filterValue": "値", + "orderBy": "並べ替え", + "orderByHint": "並べ替えに使うフィールドがないドキュメントはFirestoreによって除外されます。", + "apply": "適用", + "clear": "クリア", + "nextPage": "次へ", + "prevPage": "前へ", + "emptyCollection": "このコレクションにはドキュメントがありません。", + "queryLimitNote": "最初の{count}件の結果を表示しています — さらに表示するにはページサイズを増やしてください。", + "selectDoc": "表示するドキュメントを選択してください。", + "errPermissionDenied": "権限がありません。サービスアカウントには roles/datastore.user ロール(読み取りのみの場合は roles/datastore.viewer)が必要です。", + "errServiceDisabled": "このプロジェクトではFirestore APIが有効になっていません。", + "errOpenConsole": "コンソールでAPIを有効にする", + "errDatastoreMode": "このデータベースはDatastoreモードのため、Firestoreツールでは参照できません。", + "errIndexRequired": "このクエリには複合インデックスが必要です。", + "errCreateIndex": "コンソールでインデックスを作成", + "errQuota": "Firestoreのクォータを超過しました — しばらくしてから再試行してください。", + "errClockSkew": "Googleが署名付きトークンを拒否しました。このコンピューターの時刻が正しく設定されているか確認してください。", + "errServiceAccountRejected": "サービスアカウントが無効化または削除されました。Google Cloud コンソールで新しいキーを発行してください。", + "errNetwork": "ネットワークエラー — 接続を確認してください。", + "errNotFound": "データベースが見つかりません。データベースIDを確認してください。", + "errDocTooLarge": "ドキュメントがFirestoreの1MB制限を超えています。", + "errInvalidDocJson": "このドキュメントは有効なJSONではありません。", + "errDocNotObject": "ドキュメントは最上位がJSONオブジェクトである必要があります。", + "toast": { + "docCreated": "ドキュメントを作成しました", + "docUpdated": "ドキュメントを保存しました", + "docDeleted": "ドキュメントを削除しました", + "createFailed": "作成に失敗しました: {message}", + "saveFailed": "保存に失敗しました: {message}", + "deleteFailed": "削除に失敗しました: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/ko.json b/apps/desktop-ui/messages/ko.json index 3e87ae45..5bab3552 100644 --- a/apps/desktop-ui/messages/ko.json +++ b/apps/desktop-ui/messages/ko.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "연결 문자열을 입력하세요.", "connectionStringScheme": "연결 문자열은 mongodb:// 또는 mongodb+srv://로 시작해야 합니다.", "redisUrlRequired": "Redis URL을 입력하세요.", - "redisUrlScheme": "Redis URL은 redis:// 또는 rediss://로 시작해야 합니다." + "redisUrlScheme": "Redis URL은 redis:// 또는 rediss://로 시작해야 합니다.", + "serviceAccountRequired": "서비스 계정 JSON 키를 붙여넣으세요.", + "serviceAccountInvalidJson": "유효한 JSON이 아닙니다.", + "serviceAccountNotServiceAccount": "이 JSON은 서비스 계정 키가 아닙니다(\"service_account\" 유형에 project_id와 client_email이 필요합니다).", + "serviceAccountBadKey": "private_key 필드가 없거나 PKCS#8 PEM 키가 아닙니다.", + "databaseIdInvalid": "데이터베이스 ID는 4~63자의 소문자, 숫자, 하이픈으로 구성되거나 (default)여야 합니다." + }, + "firestore": { + "serviceAccount": "서비스 계정 키(JSON)", + "serviceAccountPlaceholder": "Firestore 액세스 권한이 있는 서비스 계정의 JSON 키 파일을 붙여넣으세요…", + "serviceAccountHint": "Google Cloud 콘솔 → IAM → 서비스 계정 → 키에서 생성하세요. roles/datastore.user 역할(읽기 전용은 roles/datastore.viewer)이 필요합니다.", + "loadFromFile": "파일에서 불러오기…", + "parsedProject": "프로젝트:", + "databaseId": "데이터베이스 ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "프로젝트가 명명된 Firestore 데이터베이스를 사용하지 않는 한 비워 두세요.", + "noCollections": "컬렉션이 없습니다", + "noMatches": "일치하는 항목이 없습니다", + "docCount": "{count, plural, =0 {문서가 없습니다} other {문서 #개}}", + "newDocument": "새 문서", + "docIdLabel": "문서 ID", + "docIdAutoHint": "비워 두면 자동으로 ID가 생성됩니다.", + "newFieldTypesHint": "새 필드는 문자열, 숫자, 불리언, 배열 또는 맵일 수 있습니다. 기존 timestamp, reference, bytes, geopoint 필드를 수정해도 형식은 유지됩니다.", + "create": "생성", + "edit": "수정", + "save": "저장", + "cancel": "취소", + "deleteDocTitle": "문서를 삭제하시겠습니까?", + "deleteDocBody": "{id}이(가) 삭제됩니다. 하위 컬렉션은 삭제되지 않고 그대로 남아 고아 상태가 됩니다(경로로는 계속 접근할 수 있지만 목록에는 표시되지 않습니다).", + "subcollections": "하위 컬렉션", + "noSubcollections": "하위 컬렉션이 없습니다", + "filterField": "필드", + "filterValue": "값", + "orderBy": "정렬 기준", + "orderByHint": "정렬 기준 필드가 없는 문서는 Firestore에서 제외됩니다.", + "apply": "적용", + "clear": "지우기", + "nextPage": "다음", + "prevPage": "이전", + "emptyCollection": "이 컬렉션에 문서가 없습니다.", + "queryLimitNote": "처음 {count}개의 결과를 표시하고 있습니다 — 더 보려면 페이지 크기를 늘리세요.", + "selectDoc": "문서를 선택하면 내용을 볼 수 있습니다.", + "errPermissionDenied": "권한이 거부되었습니다. 서비스 계정에는 roles/datastore.user 역할(읽기만 하려면 roles/datastore.viewer)이 필요합니다.", + "errServiceDisabled": "이 프로젝트에서는 Firestore API가 활성화되어 있지 않습니다.", + "errOpenConsole": "콘솔에서 API 활성화", + "errDatastoreMode": "이 데이터베이스는 Datastore 모드이므로 Firestore 도구로 탐색할 수 없습니다.", + "errIndexRequired": "이 쿼리에는 복합 색인이 필요합니다.", + "errCreateIndex": "콘솔에서 색인 만들기", + "errQuota": "Firestore 할당량을 초과했습니다 — 나중에 다시 시도하세요.", + "errClockSkew": "Google이 서명된 토큰을 거부했습니다. 이 컴퓨터의 시계가 올바르게 설정되어 있는지 확인하세요.", + "errServiceAccountRejected": "서비스 계정이 비활성화되었거나 삭제되었습니다. Google Cloud 콘솔에서 새 키를 발급하세요.", + "errNetwork": "네트워크 오류 — 연결 상태를 확인하세요.", + "errNotFound": "데이터베이스를 찾을 수 없습니다. 데이터베이스 ID를 확인하세요.", + "errDocTooLarge": "문서가 Firestore의 1MB 제한을 초과합니다.", + "errInvalidDocJson": "이 문서는 유효한 JSON이 아닙니다.", + "errDocNotObject": "문서는 최상위가 JSON 객체여야 합니다.", + "toast": { + "docCreated": "문서가 생성되었습니다", + "docUpdated": "문서가 저장되었습니다", + "docDeleted": "문서가 삭제되었습니다", + "createFailed": "생성 실패: {message}", + "saveFailed": "저장 실패: {message}", + "deleteFailed": "삭제 실패: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/ms.json b/apps/desktop-ui/messages/ms.json index 29f17371..8463bfae 100644 --- a/apps/desktop-ui/messages/ms.json +++ b/apps/desktop-ui/messages/ms.json @@ -1926,7 +1926,70 @@ "connectionStringRequired": "Masukkan rentetan sambungan.", "connectionStringScheme": "Rentetan sambungan mesti bermula dengan mongodb:// atau mongodb+srv://.", "redisUrlRequired": "Masukkan URL Redis.", - "redisUrlScheme": "URL Redis mesti bermula dengan redis:// atau rediss://." + "redisUrlScheme": "URL Redis mesti bermula dengan redis:// atau rediss://.", + "serviceAccountRequired": "Tampal kunci JSON akaun perkhidmatan.", + "serviceAccountInvalidJson": "Ini bukan JSON yang sah.", + "serviceAccountNotServiceAccount": "JSON ini bukan kunci akaun perkhidmatan (jenis \"service_account\" dengan project_id dan client_email diperlukan).", + "serviceAccountBadKey": "Medan private_key tiada atau bukan kunci PEM PKCS#8.", + "databaseIdInvalid": "ID pangkalan data mestilah 4–63 huruf kecil, digit atau sengkang, atau (default)." + }, + "firestore": { + "serviceAccount": "Kunci akaun perkhidmatan (JSON)", + "serviceAccountPlaceholder": "Tampal fail kunci JSON akaun perkhidmatan yang mempunyai akses Firestore…", + "serviceAccountHint": "Cipta satu dalam Google Cloud console → IAM → Service Accounts → Keys. Ia memerlukan peranan roles/datastore.user (atau roles/datastore.viewer untuk baca sahaja).", + "loadFromFile": "Muat dari fail…", + "parsedProject": "Projek:", + "databaseId": "ID pangkalan data", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Biarkan kosong melainkan projek menggunakan pangkalan data Firestore bernama.", + "noCollections": "Tiada koleksi", + "noMatches": "Tiada padanan", + "docCount": "{count, plural, =0 {Tiada dokumen} other {# dokumen}}", + "newDocument": "Dokumen baharu", + "docIdLabel": "ID dokumen", + "docIdAutoHint": "Biarkan kosong untuk ID yang dijana secara automatik.", + "newFieldTypesHint": "Medan baharu boleh berupa rentetan, nombor, boolean, tatasusunan atau peta. Mengedit medan timestamp, reference, bytes atau geopoint sedia ada akan mengekalkan jenisnya.", + "create": "Cipta", + "edit": "Edit", + "save": "Simpan", + "cancel": "Batal", + "deleteDocTitle": "Padam dokumen?", + "deleteDocBody": "Ini akan memadamkan {id}. Subkoleksinya TIDAK dipadam dan akan menjadi yatim (masih boleh dicapai melalui laluan, tetapi tidak kelihatan dalam senarai).", + "subcollections": "Subkoleksi", + "noSubcollections": "Tiada subkoleksi", + "filterField": "Medan", + "filterValue": "Nilai", + "orderBy": "Susun mengikut", + "orderByHint": "Dokumen yang tiada medan susunan akan dikecualikan oleh Firestore.", + "apply": "Guna pakai", + "clear": "Kosongkan", + "nextPage": "Seterusnya", + "prevPage": "Sebelumnya", + "emptyCollection": "Tiada dokumen dalam koleksi ini.", + "queryLimitNote": "Memaparkan {count} hasil pertama — tingkatkan saiz halaman untuk melihat lebih banyak.", + "selectDoc": "Pilih dokumen untuk melihatnya.", + "errPermissionDenied": "Kebenaran ditolak. Akaun perkhidmatan memerlukan peranan roles/datastore.user (atau roles/datastore.viewer untuk membaca).", + "errServiceDisabled": "Firestore API tidak diaktifkan untuk projek ini.", + "errOpenConsole": "Aktifkan API dalam console", + "errDatastoreMode": "Pangkalan data ini dalam mod Datastore, yang tidak boleh diimbas oleh alat Firestore.", + "errIndexRequired": "Pertanyaan ini memerlukan indeks komposit.", + "errCreateIndex": "Cipta indeks dalam console", + "errQuota": "Kuota Firestore telah melebihi had — cuba lagi kemudian.", + "errClockSkew": "Google menolak token yang ditandatangani. Periksa sama ada jam komputer ini ditetapkan dengan betul.", + "errServiceAccountRejected": "Akaun perkhidmatan telah dilumpuhkan atau dipadam. Keluarkan kunci baharu dalam Google Cloud console.", + "errNetwork": "Ralat rangkaian — periksa sambungan anda.", + "errNotFound": "Pangkalan data tidak ditemui. Periksa ID pangkalan data.", + "errDocTooLarge": "Dokumen melebihi had 1 MB Firestore.", + "errInvalidDocJson": "Dokumen ini bukan JSON yang sah.", + "errDocNotObject": "Dokumen mestilah objek JSON di peringkat atas.", + "toast": { + "docCreated": "Dokumen dicipta", + "docUpdated": "Dokumen disimpan", + "docDeleted": "Dokumen dipadam", + "createFailed": "Gagal cipta: {message}", + "saveFailed": "Gagal simpan: {message}", + "deleteFailed": "Gagal padam: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/nb.json b/apps/desktop-ui/messages/nb.json index 68141c94..1bd71666 100644 --- a/apps/desktop-ui/messages/nb.json +++ b/apps/desktop-ui/messages/nb.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Skriv inn en tilkoblingsstreng.", "connectionStringScheme": "Tilkoblingsstrengen må starte med mongodb:// eller mongodb+srv://.", "redisUrlRequired": "Skriv inn en Redis-URL.", - "redisUrlScheme": "Redis-URL-en må starte med redis:// eller rediss://." + "redisUrlScheme": "Redis-URL-en må starte med redis:// eller rediss://.", + "serviceAccountRequired": "Lim inn en JSON-nøkkel for en tjenestekonto.", + "serviceAccountInvalidJson": "Dette er ikke gyldig JSON.", + "serviceAccountNotServiceAccount": "Denne JSON-en er ikke en tjenestekontonøkkel (forventer typen \"service_account\" med project_id og client_email).", + "serviceAccountBadKey": "Feltet private_key mangler eller er ikke en PKCS#8 PEM-nøkkel.", + "databaseIdInvalid": "Database-ID må være 4–63 små bokstaver, sifre eller bindestreker, eller (default)." + }, + "firestore": { + "serviceAccount": "Tjenestekontonøkkel (JSON)", + "serviceAccountPlaceholder": "Lim inn JSON-nøkkelfilen til en tjenestekonto med Firestore-tilgang…", + "serviceAccountHint": "Opprett én i Google Cloud Console → IAM → Tjenestekontoer → Nøkler. Den trenger rollen roles/datastore.user (eller roles/datastore.viewer for skrivebeskyttet tilgang).", + "loadFromFile": "Last inn fra fil…", + "parsedProject": "Prosjekt:", + "databaseId": "Database-ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "La stå tomt med mindre prosjektet bruker navngitte Firestore-databaser.", + "noCollections": "Ingen samlinger", + "noMatches": "Ingen treff", + "docCount": "{count, plural, =0 {Ingen dokumenter} one {# dokument} other {# dokumenter}}", + "newDocument": "Nytt dokument", + "docIdLabel": "Dokument-ID", + "docIdAutoHint": "La stå tomt for en automatisk generert ID.", + "newFieldTypesHint": "Nye felt kan være strenger, tall, boolske verdier, arrayer eller maps. Redigering av et eksisterende timestamp-, referanse-, bytes- eller geopoint-felt beholder typen.", + "create": "Opprett", + "edit": "Rediger", + "save": "Lagre", + "cancel": "Avbryt", + "deleteDocTitle": "Slette dokument?", + "deleteDocBody": "Dette sletter {id}. Underliggende samlinger blir IKKE slettet og blir foreldreløse (fortsatt nåbare via banen, usynlige i lister).", + "subcollections": "Undersamlinger", + "noSubcollections": "Ingen undersamlinger", + "filterField": "Felt", + "filterValue": "Verdi", + "orderBy": "Sorter etter", + "orderByHint": "Dokumenter som mangler sorteringsfeltet, utelates av Firestore.", + "apply": "Bruk", + "clear": "Tøm", + "nextPage": "Neste", + "prevPage": "Forrige", + "emptyCollection": "Ingen dokumenter i denne samlingen.", + "queryLimitNote": "Viser de første {count} resultatene — øk sidestørrelsen for flere.", + "selectDoc": "Velg et dokument for å vise det.", + "errPermissionDenied": "Tilgang nektet. Tjenestekontoen trenger rollen roles/datastore.user (eller roles/datastore.viewer for å lese).", + "errServiceDisabled": "Firestore API er ikke aktivert for dette prosjektet.", + "errOpenConsole": "Aktiver API i console", + "errDatastoreMode": "Denne databasen er i Datastore-modus, som Firestore-verktøy ikke kan bla gjennom.", + "errIndexRequired": "Denne spørringen trenger en sammensatt indeks.", + "errCreateIndex": "Opprett indeks i console", + "errQuota": "Firestore-kvoten er overskredet — prøv igjen senere.", + "errClockSkew": "Google avviste det signerte tokenet. Kontroller at klokken på denne datamaskinen er riktig innstilt.", + "errServiceAccountRejected": "Tjenestekontoen ble deaktivert eller slettet. Utsted en ny nøkkel i Google Cloud Console.", + "errNetwork": "Nettverksfeil — sjekk tilkoblingen din.", + "errNotFound": "Fant ikke databasen. Sjekk database-ID-en.", + "errDocTooLarge": "Dokumentet overskrider Firestores grense på 1 MB.", + "errInvalidDocJson": "Dokumentet er ikke gyldig JSON.", + "errDocNotObject": "Et dokument må være et JSON-objekt på øverste nivå.", + "toast": { + "docCreated": "Dokument opprettet", + "docUpdated": "Dokument lagret", + "docDeleted": "Dokument slettet", + "createFailed": "Opprettelse mislyktes: {message}", + "saveFailed": "Kunne ikke lagre: {message}", + "deleteFailed": "Kunne ikke slette: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/nl.json b/apps/desktop-ui/messages/nl.json index f25dbc40..a1d18dff 100644 --- a/apps/desktop-ui/messages/nl.json +++ b/apps/desktop-ui/messages/nl.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Voer een verbindingsreeks in.", "connectionStringScheme": "De verbindingsreeks moet beginnen met mongodb:// of mongodb+srv://.", "redisUrlRequired": "Voer een Redis-URL in.", - "redisUrlScheme": "De Redis-URL moet beginnen met redis:// of rediss://." + "redisUrlScheme": "De Redis-URL moet beginnen met redis:// of rediss://.", + "serviceAccountRequired": "Plak een JSON-sleutel van een serviceaccount.", + "serviceAccountInvalidJson": "Dit is geen geldige JSON.", + "serviceAccountNotServiceAccount": "Deze JSON is geen serviceaccountsleutel (verwacht type \"service_account\" met project_id en client_email).", + "serviceAccountBadKey": "Het veld private_key ontbreekt of is geen PKCS#8 PEM-sleutel.", + "databaseIdInvalid": "Database-ID moet 4–63 kleine letters, cijfers of streepjes bevatten, of (default) zijn." + }, + "firestore": { + "serviceAccount": "Serviceaccountsleutel (JSON)", + "serviceAccountPlaceholder": "Plak het JSON-sleutelbestand van een serviceaccount met Firestore-toegang…", + "serviceAccountHint": "Maak er een aan in Google Cloud Console → IAM → Serviceaccounts → Sleutels. Het heeft de rol roles/datastore.user nodig (of roles/datastore.viewer voor alleen-lezen).", + "loadFromFile": "Laden uit bestand…", + "parsedProject": "Project:", + "databaseId": "Database-ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Laat leeg tenzij het project benoemde Firestore-databases gebruikt.", + "noCollections": "Geen collecties", + "noMatches": "Geen overeenkomsten", + "docCount": "{count, plural, =0 {Geen documenten} one {# document} other {# documenten}}", + "newDocument": "Nieuw document", + "docIdLabel": "Document-ID", + "docIdAutoHint": "Laat leeg voor een automatisch gegenereerde ID.", + "newFieldTypesHint": "Nieuwe velden kunnen tekenreeksen, getallen, booleans, arrays of maps zijn. Het bewerken van een bestaand timestamp-, referentie-, bytes- of geopoint-veld behoudt het type.", + "create": "Aanmaken", + "edit": "Bewerken", + "save": "Opslaan", + "cancel": "Annuleren", + "deleteDocTitle": "Document verwijderen?", + "deleteDocBody": "Dit verwijdert {id}. De subcollecties worden NIET verwijderd en raken verweesd (nog steeds bereikbaar via het pad, onzichtbaar in lijsten).", + "subcollections": "Subcollecties", + "noSubcollections": "Geen subcollecties", + "filterField": "Veld", + "filterValue": "Waarde", + "orderBy": "Sorteren op", + "orderByHint": "Documenten zonder het sorteerveld worden door Firestore uitgesloten.", + "apply": "Toepassen", + "clear": "Wissen", + "nextPage": "Volgende", + "prevPage": "Vorige", + "emptyCollection": "Geen documenten in deze collectie.", + "queryLimitNote": "Toont de eerste {count} resultaten — verhoog de paginagrootte voor meer.", + "selectDoc": "Kies een document om het te bekijken.", + "errPermissionDenied": "Toegang geweigerd. Het serviceaccount heeft de rol roles/datastore.user nodig (of roles/datastore.viewer om te lezen).", + "errServiceDisabled": "De Firestore-API is niet ingeschakeld voor dit project.", + "errOpenConsole": "API inschakelen in console", + "errDatastoreMode": "Deze database staat in Datastore-modus, die Firestore-tools niet kunnen doorbladeren.", + "errIndexRequired": "Deze query heeft een samengestelde index nodig.", + "errCreateIndex": "Index aanmaken in console", + "errQuota": "Firestore-quotum overschreden — probeer het later opnieuw.", + "errClockSkew": "Google heeft het ondertekende token geweigerd. Controleer of de klok van deze computer correct is ingesteld.", + "errServiceAccountRejected": "Het serviceaccount is uitgeschakeld of verwijderd. Genereer een nieuwe sleutel in de Google Cloud Console.", + "errNetwork": "Netwerkfout — controleer je verbinding.", + "errNotFound": "Database niet gevonden. Controleer de database-ID.", + "errDocTooLarge": "Het document overschrijdt de limiet van 1 MB van Firestore.", + "errInvalidDocJson": "Het document is geen geldige JSON.", + "errDocNotObject": "Een document moet op het hoogste niveau een JSON-object zijn.", + "toast": { + "docCreated": "Document aangemaakt", + "docUpdated": "Document opgeslagen", + "docDeleted": "Document verwijderd", + "createFailed": "Aanmaken mislukt: {message}", + "saveFailed": "Opslaan mislukt: {message}", + "deleteFailed": "Verwijderen mislukt: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/pl.json b/apps/desktop-ui/messages/pl.json index 816c95ac..9987771a 100644 --- a/apps/desktop-ui/messages/pl.json +++ b/apps/desktop-ui/messages/pl.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Wprowadź ciąg połączenia.", "connectionStringScheme": "Ciąg połączenia musi zaczynać się od mongodb:// lub mongodb+srv://.", "redisUrlRequired": "Wprowadź URL Redis.", - "redisUrlScheme": "URL Redis musi zaczynać się od redis:// lub rediss://." + "redisUrlScheme": "URL Redis musi zaczynać się od redis:// lub rediss://.", + "serviceAccountRequired": "Wklej klucz konta usługi w formacie JSON.", + "serviceAccountInvalidJson": "To nie jest poprawny JSON.", + "serviceAccountNotServiceAccount": "Ten JSON nie jest kluczem konta usługi (oczekiwany typ \"service_account\" z project_id i client_email).", + "serviceAccountBadKey": "Brak pola private_key lub nie jest ono kluczem PKCS#8 PEM.", + "databaseIdInvalid": "Database ID musi zawierać od 4 do 63 małych liter, cyfr lub myślników, albo być (default)." + }, + "firestore": { + "serviceAccount": "Klucz konta usługi (JSON)", + "serviceAccountPlaceholder": "Wklej plik klucza JSON konta usługi z dostępem do Firestore…", + "serviceAccountHint": "Utwórz go w konsoli Google Cloud → IAM → Konta usług → Klucze. Wymagana jest rola roles/datastore.user (lub roles/datastore.viewer tylko do odczytu).", + "loadFromFile": "Wczytaj z pliku…", + "parsedProject": "Projekt:", + "databaseId": "Database ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Pozostaw puste, chyba że projekt używa nazwanych baz danych Firestore.", + "noCollections": "Brak kolekcji", + "noMatches": "Brak wyników", + "docCount": "{count, plural, =0 {Brak dokumentów} one {# dokument} few {# dokumenty} many {# dokumentów} other {# dokumentu}}", + "newDocument": "Nowy dokument", + "docIdLabel": "ID dokumentu", + "docIdAutoHint": "Pozostaw puste, aby ID zostało wygenerowane automatycznie.", + "newFieldTypesHint": "Nowe pola mogą być ciągami znaków, liczbami, wartościami logicznymi, tablicami lub mapami. Edycja istniejącego pola typu timestamp, reference, bytes lub geopoint zachowuje jego typ.", + "create": "Utwórz", + "edit": "Edytuj", + "save": "Zapisz", + "cancel": "Anuluj", + "deleteDocTitle": "Usunąć dokument?", + "deleteDocBody": "To usunie {id}. Jego podkolekcje NIE zostaną usunięte i staną się osierocone (nadal dostępne po ścieżce, ale niewidoczne na listach).", + "subcollections": "Podkolekcje", + "noSubcollections": "Brak podkolekcji", + "filterField": "Pole", + "filterValue": "Wartość", + "orderBy": "Sortuj według", + "orderByHint": "Dokumenty bez pola sortowania są pomijane przez Firestore.", + "apply": "Zastosuj", + "clear": "Wyczyść", + "nextPage": "Dalej", + "prevPage": "Wstecz", + "emptyCollection": "Brak dokumentów w tej kolekcji.", + "queryLimitNote": "Wyświetlono pierwsze {count} wyników — zwiększ rozmiar strony, aby zobaczyć więcej.", + "selectDoc": "Wybierz dokument, aby go wyświetlić.", + "errPermissionDenied": "Odmowa dostępu. Konto usługi wymaga roli roles/datastore.user (lub roles/datastore.viewer do odczytu).", + "errServiceDisabled": "Firestore API nie jest włączone dla tego projektu.", + "errOpenConsole": "Włącz API w konsoli", + "errDatastoreMode": "Ta baza danych działa w trybie Datastore, którego narzędzia Firestore nie mogą przeglądać.", + "errIndexRequired": "To zapytanie wymaga indeksu złożonego.", + "errCreateIndex": "Utwórz indeks w konsoli", + "errQuota": "Przekroczono limit Firestore — spróbuj ponownie później.", + "errClockSkew": "Google odrzucił podpisany token. Sprawdź, czy zegar tego komputera jest ustawiony poprawnie.", + "errServiceAccountRejected": "Konto usługi zostało wyłączone lub usunięte. Wygeneruj nowy klucz w konsoli Google Cloud.", + "errNetwork": "Błąd sieci — sprawdź połączenie.", + "errNotFound": "Nie znaleziono bazy danych. Sprawdź Database ID.", + "errDocTooLarge": "Dokument przekracza limit Firestore wynoszący 1 MB.", + "errInvalidDocJson": "Dokument nie jest poprawnym JSON.", + "errDocNotObject": "Dokument musi być obiektem JSON na najwyższym poziomie.", + "toast": { + "docCreated": "Dokument utworzony", + "docUpdated": "Dokument zapisany", + "docDeleted": "Dokument usunięty", + "createFailed": "Nie udało się utworzyć: {message}", + "saveFailed": "Nie udało się zapisać: {message}", + "deleteFailed": "Nie udało się usunąć: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/pt-BR.json b/apps/desktop-ui/messages/pt-BR.json index 568471d0..b6f19582 100644 --- a/apps/desktop-ui/messages/pt-BR.json +++ b/apps/desktop-ui/messages/pt-BR.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Digite uma string de conexão.", "connectionStringScheme": "A string de conexão deve começar com mongodb:// ou mongodb+srv://.", "redisUrlRequired": "Digite uma URL do Redis.", - "redisUrlScheme": "A URL do Redis deve começar com redis:// ou rediss://." + "redisUrlScheme": "A URL do Redis deve começar com redis:// ou rediss://.", + "serviceAccountRequired": "Cole uma chave JSON de conta de serviço.", + "serviceAccountInvalidJson": "Isso não é um JSON válido.", + "serviceAccountNotServiceAccount": "Este JSON não é uma chave de conta de serviço (era esperado o tipo \"service_account\" com project_id e client_email).", + "serviceAccountBadKey": "O campo private_key está ausente ou não é uma chave PEM PKCS#8.", + "databaseIdInvalid": "O ID do banco de dados deve ter de 4 a 63 letras minúsculas, dígitos ou hífens, ou ser (default)." + }, + "firestore": { + "serviceAccount": "Chave de conta de serviço (JSON)", + "serviceAccountPlaceholder": "Cole o arquivo de chave JSON de uma conta de serviço com acesso ao Firestore…", + "serviceAccountHint": "Crie uma no console do Google Cloud → IAM → Contas de serviço → Chaves. É necessário o papel roles/datastore.user (ou roles/datastore.viewer somente para leitura).", + "loadFromFile": "Carregar de arquivo…", + "parsedProject": "Projeto:", + "databaseId": "ID do banco de dados", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Deixe em branco a menos que o projeto use bancos de dados Firestore nomeados.", + "noCollections": "Nenhuma coleção", + "noMatches": "Nenhum resultado", + "docCount": "{count, plural, =0 {Nenhum documento} one {# documento} other {# documentos}}", + "newDocument": "Novo documento", + "docIdLabel": "ID do documento", + "docIdAutoHint": "Deixe em branco para gerar um ID automaticamente.", + "newFieldTypesHint": "Os campos novos podem ser strings, números, booleanos, arrays ou mapas. Editar um campo existente do tipo timestamp, referência, bytes ou geopoint mantém o tipo dele.", + "create": "Criar", + "edit": "Editar", + "save": "Salvar", + "cancel": "Cancelar", + "deleteDocTitle": "Excluir documento?", + "deleteDocBody": "Isso exclui {id}. As subcoleções dele NÃO são excluídas e ficarão órfãs (continuam acessíveis pelo caminho, mas invisíveis nas listagens).", + "subcollections": "Subcoleções", + "noSubcollections": "Nenhuma subcoleção", + "filterField": "Campo", + "filterValue": "Valor", + "orderBy": "Ordenar por", + "orderByHint": "Documentos sem o campo de ordenação são excluídos pelo Firestore.", + "apply": "Aplicar", + "clear": "Limpar", + "nextPage": "Próxima", + "prevPage": "Anterior", + "emptyCollection": "Nenhum documento nesta coleção.", + "queryLimitNote": "Mostrando os primeiros {count} resultados — aumente o tamanho da página para ver mais.", + "selectDoc": "Selecione um documento para visualizá-lo.", + "errPermissionDenied": "Permissão negada. A conta de serviço precisa do papel roles/datastore.user (ou roles/datastore.viewer para leitura).", + "errServiceDisabled": "A API do Firestore não está ativada para este projeto.", + "errOpenConsole": "Ativar API no console", + "errDatastoreMode": "Este banco de dados está no modo Datastore, que as ferramentas do Firestore não conseguem navegar.", + "errIndexRequired": "Esta consulta precisa de um índice composto.", + "errCreateIndex": "Criar índice no console", + "errQuota": "Cota do Firestore excedida — tente novamente mais tarde.", + "errClockSkew": "O Google rejeitou o token assinado. Verifique se o relógio deste computador está configurado corretamente.", + "errServiceAccountRejected": "A conta de serviço foi desativada ou excluída. Emita uma nova chave no console do Google Cloud.", + "errNetwork": "Erro de rede — verifique sua conexão.", + "errNotFound": "Banco de dados não encontrado. Verifique o ID do banco de dados.", + "errDocTooLarge": "O documento excede o limite de 1 MB do Firestore.", + "errInvalidDocJson": "O documento não é um JSON válido.", + "errDocNotObject": "Um documento deve ser um objeto JSON no nível superior.", + "toast": { + "docCreated": "Documento criado", + "docUpdated": "Documento salvo", + "docDeleted": "Documento excluído", + "createFailed": "Falha ao criar: {message}", + "saveFailed": "Falha ao salvar: {message}", + "deleteFailed": "Falha ao excluir: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/pt.json b/apps/desktop-ui/messages/pt.json index 3d830da2..1d97bc27 100644 --- a/apps/desktop-ui/messages/pt.json +++ b/apps/desktop-ui/messages/pt.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Introduz uma string de ligação.", "connectionStringScheme": "A string de ligação tem de começar com mongodb:// ou mongodb+srv://.", "redisUrlRequired": "Introduz um URL do Redis.", - "redisUrlScheme": "O URL do Redis tem de começar com redis:// ou rediss://." + "redisUrlScheme": "O URL do Redis tem de começar com redis:// ou rediss://.", + "serviceAccountRequired": "Cola uma chave JSON de conta de serviço.", + "serviceAccountInvalidJson": "Isto não é um JSON válido.", + "serviceAccountNotServiceAccount": "Este JSON não é uma chave de conta de serviço (esperava-se o tipo \"service_account\" com project_id e client_email).", + "serviceAccountBadKey": "O campo private_key está em falta ou não é uma chave PEM PKCS#8.", + "databaseIdInvalid": "O ID da base de dados tem de ter entre 4 e 63 letras minúsculas, dígitos ou hífenes, ou ser (default)." + }, + "firestore": { + "serviceAccount": "Chave de conta de serviço (JSON)", + "serviceAccountPlaceholder": "Cola o ficheiro de chave JSON de uma conta de serviço com acesso ao Firestore…", + "serviceAccountHint": "Cria uma na consola do Google Cloud → IAM → Contas de serviço → Chaves. Precisa da função roles/datastore.user (ou roles/datastore.viewer só para leitura).", + "loadFromFile": "Carregar de ficheiro…", + "parsedProject": "Projeto:", + "databaseId": "ID da base de dados", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Deixa vazio a menos que o projeto use bases de dados Firestore com nome.", + "noCollections": "Sem coleções", + "noMatches": "Sem correspondências", + "docCount": "{count, plural, =0 {Sem documentos} one {# documento} other {# documentos}}", + "newDocument": "Novo documento", + "docIdLabel": "ID do documento", + "docIdAutoHint": "Deixa vazio para gerar um ID automaticamente.", + "newFieldTypesHint": "Os campos novos podem ser strings, números, booleanos, arrays ou mapas. Editar um campo existente do tipo timestamp, referência, bytes ou geopoint mantém o respetivo tipo.", + "create": "Criar", + "edit": "Editar", + "save": "Guardar", + "cancel": "Cancelar", + "deleteDocTitle": "Eliminar documento?", + "deleteDocBody": "Isto elimina {id}. As suas subcoleções NÃO são eliminadas e ficarão órfãs (continuam acessíveis pelo caminho, mas invisíveis nas listagens).", + "subcollections": "Subcoleções", + "noSubcollections": "Sem subcoleções", + "filterField": "Campo", + "filterValue": "Valor", + "orderBy": "Ordenar por", + "orderByHint": "Os documentos sem o campo de ordenação são excluídos pelo Firestore.", + "apply": "Aplicar", + "clear": "Limpar", + "nextPage": "Seguinte", + "prevPage": "Anterior", + "emptyCollection": "Sem documentos nesta coleção.", + "queryLimitNote": "A mostrar os primeiros {count} resultados — aumenta o tamanho da página para ver mais.", + "selectDoc": "Escolhe um documento para o veres.", + "errPermissionDenied": "Permissão negada. A conta de serviço precisa da função roles/datastore.user (ou roles/datastore.viewer para leitura).", + "errServiceDisabled": "A API do Firestore não está ativada para este projeto.", + "errOpenConsole": "Ativar API na consola", + "errDatastoreMode": "Esta base de dados está em modo Datastore, que as ferramentas do Firestore não conseguem explorar.", + "errIndexRequired": "Esta consulta precisa de um índice composto.", + "errCreateIndex": "Criar índice na consola", + "errQuota": "Quota do Firestore excedida — tenta novamente mais tarde.", + "errClockSkew": "A Google rejeitou o token assinado. Verifica se o relógio deste computador está bem configurado.", + "errServiceAccountRejected": "A conta de serviço foi desativada ou eliminada. Emite uma nova chave na consola do Google Cloud.", + "errNetwork": "Erro de rede — verifica a tua ligação.", + "errNotFound": "Base de dados não encontrada. Verifica o ID da base de dados.", + "errDocTooLarge": "O documento excede o limite de 1 MB do Firestore.", + "errInvalidDocJson": "O documento não é JSON válido.", + "errDocNotObject": "Um documento tem de ser um objeto JSON no nível superior.", + "toast": { + "docCreated": "Documento criado", + "docUpdated": "Documento guardado", + "docDeleted": "Documento eliminado", + "createFailed": "Falha ao criar: {message}", + "saveFailed": "Falha ao guardar: {message}", + "deleteFailed": "Falha ao eliminar: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/ru.json b/apps/desktop-ui/messages/ru.json index 4353ed3e..b7d788ac 100644 --- a/apps/desktop-ui/messages/ru.json +++ b/apps/desktop-ui/messages/ru.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Введите строку подключения.", "connectionStringScheme": "Строка подключения должна начинаться с mongodb:// или mongodb+srv://.", "redisUrlRequired": "Введите URL Redis.", - "redisUrlScheme": "URL Redis должен начинаться с redis:// или rediss://." + "redisUrlScheme": "URL Redis должен начинаться с redis:// или rediss://.", + "serviceAccountRequired": "Вставьте ключ сервисного аккаунта в формате JSON.", + "serviceAccountInvalidJson": "Это не является допустимым JSON.", + "serviceAccountNotServiceAccount": "Этот JSON не является ключом сервисного аккаунта (ожидается тип \"service_account\" с project_id и client_email).", + "serviceAccountBadKey": "Поле private_key отсутствует или не является ключом PKCS#8 PEM.", + "databaseIdInvalid": "Database ID должен содержать от 4 до 63 строчных букв, цифр или дефисов, либо быть (default)." + }, + "firestore": { + "serviceAccount": "Ключ сервисного аккаунта (JSON)", + "serviceAccountPlaceholder": "Вставьте файл JSON-ключа сервисного аккаунта с доступом к Firestore…", + "serviceAccountHint": "Создайте его в консоли Google Cloud → IAM → Сервисные аккаунты → Ключи. Нужна роль roles/datastore.user (или roles/datastore.viewer только для чтения).", + "loadFromFile": "Загрузить из файла…", + "parsedProject": "Проект:", + "databaseId": "Database ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Оставьте пустым, если проект не использует именованные базы данных Firestore.", + "noCollections": "Нет коллекций", + "noMatches": "Нет совпадений", + "docCount": "{count, plural, =0 {Нет документов} one {# документ} few {# документа} many {# документов} other {# документа}}", + "newDocument": "Новый документ", + "docIdLabel": "ID документа", + "docIdAutoHint": "Оставьте пустым для автоматически сгенерированного ID.", + "newFieldTypesHint": "Новые поля могут быть строками, числами, булевыми значениями, массивами или картами. При редактировании существующего поля типа timestamp, reference, bytes или geopoint его тип сохраняется.", + "create": "Создать", + "edit": "Редактировать", + "save": "Сохранить", + "cancel": "Отмена", + "deleteDocTitle": "Удалить документ?", + "deleteDocBody": "Это удалит {id}. Его подколлекции НЕ будут удалены и останутся «осиротевшими» (по-прежнему доступны по пути, но не видны в списках).", + "subcollections": "Подколлекции", + "noSubcollections": "Нет подколлекций", + "filterField": "Поле", + "filterValue": "Значение", + "orderBy": "Сортировка", + "orderByHint": "Документы без поля сортировки исключаются Firestore.", + "apply": "Применить", + "clear": "Очистить", + "nextPage": "Далее", + "prevPage": "Назад", + "emptyCollection": "В этой коллекции нет документов.", + "queryLimitNote": "Показаны первые {count} результатов — увеличьте размер страницы, чтобы увидеть больше.", + "selectDoc": "Выберите документ, чтобы просмотреть его.", + "errPermissionDenied": "Доступ запрещён. Сервисному аккаунту нужна роль roles/datastore.user (или roles/datastore.viewer для чтения).", + "errServiceDisabled": "Firestore API не включён для этого проекта.", + "errOpenConsole": "Включить API в консоли", + "errDatastoreMode": "Эта база данных работает в режиме Datastore, который инструменты Firestore не могут просматривать.", + "errIndexRequired": "Этому запросу нужен составной индекс.", + "errCreateIndex": "Создать индекс в консоли", + "errQuota": "Превышена квота Firestore — попробуйте позже.", + "errClockSkew": "Google отклонил подписанный токен. Проверьте, что часы этого компьютера установлены правильно.", + "errServiceAccountRejected": "Сервисный аккаунт был отключён или удалён. Создайте новый ключ в консоли Google Cloud.", + "errNetwork": "Ошибка сети — проверьте подключение.", + "errNotFound": "База данных не найдена. Проверьте Database ID.", + "errDocTooLarge": "Документ превышает лимит Firestore в 1 МБ.", + "errInvalidDocJson": "Документ не является допустимым JSON.", + "errDocNotObject": "Документ должен быть JSON-объектом на верхнем уровне.", + "toast": { + "docCreated": "Документ создан", + "docUpdated": "Документ сохранён", + "docDeleted": "Документ удалён", + "createFailed": "Не удалось создать: {message}", + "saveFailed": "Не удалось сохранить: {message}", + "deleteFailed": "Не удалось удалить: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/sv.json b/apps/desktop-ui/messages/sv.json index 1a2eb423..0f8afc2d 100644 --- a/apps/desktop-ui/messages/sv.json +++ b/apps/desktop-ui/messages/sv.json @@ -1926,7 +1926,70 @@ "connectionStringRequired": "Ange en anslutningssträng.", "connectionStringScheme": "Anslutningssträngen måste börja med mongodb:// eller mongodb+srv://.", "redisUrlRequired": "Ange en Redis-URL.", - "redisUrlScheme": "Redis-URL:en måste börja med redis:// eller rediss://." + "redisUrlScheme": "Redis-URL:en måste börja med redis:// eller rediss://.", + "serviceAccountRequired": "Klistra in en tjänstekontonyckel i JSON-format.", + "serviceAccountInvalidJson": "Detta är inte giltig JSON.", + "serviceAccountNotServiceAccount": "Denna JSON är inte en tjänstekontonyckel (typen \"service_account\" med project_id och client_email förväntas).", + "serviceAccountBadKey": "Fältet private_key saknas eller är inte en PKCS#8 PEM-nyckel.", + "databaseIdInvalid": "Databas-ID måste vara 4–63 gemener, siffror eller bindestreck, eller (default)." + }, + "firestore": { + "serviceAccount": "Tjänstekontonyckel (JSON)", + "serviceAccountPlaceholder": "Klistra in JSON-nyckelfilen för ett tjänstekonto med Firestore-åtkomst…", + "serviceAccountHint": "Skapa ett i Google Cloud Console → IAM → Tjänstekonton → Nycklar. Det behöver rollen roles/datastore.user (eller roles/datastore.viewer för läsbehörighet).", + "loadFromFile": "Läs in från fil…", + "parsedProject": "Projekt:", + "databaseId": "Databas-ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Lämna tomt om inte projektet använder namngivna Firestore-databaser.", + "noCollections": "Inga samlingar", + "noMatches": "Inga träffar", + "docCount": "{count, plural, =0 {Inga dokument} one {# dokument} other {# dokument}}", + "newDocument": "Nytt dokument", + "docIdLabel": "Dokument-ID", + "docIdAutoHint": "Lämna tomt för ett automatiskt genererat ID.", + "newFieldTypesHint": "Nya fält kan vara strängar, tal, booleaner, arrayer eller maps. Redigering av ett befintligt timestamp-, referens-, bytes- eller geopoint-fält behåller dess typ.", + "create": "Skapa", + "edit": "Redigera", + "save": "Spara", + "cancel": "Avbryt", + "deleteDocTitle": "Ta bort dokument?", + "deleteDocBody": "Detta tar bort {id}. Dess underordnade samlingar tas INTE bort och blir föräldralösa (fortfarande nåbara via sökvägen, osynliga i listor).", + "subcollections": "Undersamlingar", + "noSubcollections": "Inga undersamlingar", + "filterField": "Fält", + "filterValue": "Värde", + "orderBy": "Sortera efter", + "orderByHint": "Dokument som saknar sorteringsfältet utesluts av Firestore.", + "apply": "Tillämpa", + "clear": "Rensa", + "nextPage": "Nästa", + "prevPage": "Föregående", + "emptyCollection": "Inga dokument i denna samling.", + "queryLimitNote": "Visar de första {count} resultaten — öka sidstorleken för fler.", + "selectDoc": "Välj ett dokument för att visa det.", + "errPermissionDenied": "Åtkomst nekad. Tjänstekontot behöver rollen roles/datastore.user (eller roles/datastore.viewer för att läsa).", + "errServiceDisabled": "Firestore API är inte aktiverat för det här projektet.", + "errOpenConsole": "Aktivera API i console", + "errDatastoreMode": "Denna databas är i Datastore-läge, vilket Firestore-verktyg inte kan bläddra i.", + "errIndexRequired": "Den här frågan behöver ett sammansatt index.", + "errCreateIndex": "Skapa index i console", + "errQuota": "Firestore-kvoten överskreds — försök igen senare.", + "errClockSkew": "Google avvisade den signerade token. Kontrollera att den här datorns klocka är korrekt inställd.", + "errServiceAccountRejected": "Tjänstekontot inaktiverades eller togs bort. Utfärda en ny nyckel i Google Cloud Console.", + "errNetwork": "Nätverksfel — kontrollera din anslutning.", + "errNotFound": "Databasen hittades inte. Kontrollera databas-ID:t.", + "errDocTooLarge": "Dokumentet överskrider Firestores gräns på 1 MB.", + "errInvalidDocJson": "Dokumentet är inte giltig JSON.", + "errDocNotObject": "Ett dokument måste vara ett JSON-objekt på översta nivån.", + "toast": { + "docCreated": "Dokument skapat", + "docUpdated": "Dokument sparat", + "docDeleted": "Dokument borttaget", + "createFailed": "Det gick inte att skapa: {message}", + "saveFailed": "Det gick inte att spara: {message}", + "deleteFailed": "Det gick inte att ta bort: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/tr.json b/apps/desktop-ui/messages/tr.json index 1a8239ee..fa499134 100644 --- a/apps/desktop-ui/messages/tr.json +++ b/apps/desktop-ui/messages/tr.json @@ -1926,7 +1926,70 @@ "connectionStringRequired": "Bir bağlantı dizesi girin.", "connectionStringScheme": "Bağlantı dizesi mongodb:// veya mongodb+srv:// ile başlamalıdır.", "redisUrlRequired": "Bir Redis URL'si girin.", - "redisUrlScheme": "Redis URL'si redis:// veya rediss:// ile başlamalıdır." + "redisUrlScheme": "Redis URL'si redis:// veya rediss:// ile başlamalıdır.", + "serviceAccountRequired": "Bir hizmet hesabı JSON anahtarı yapıştırın.", + "serviceAccountInvalidJson": "Bu geçerli bir JSON değil.", + "serviceAccountNotServiceAccount": "Bu JSON bir hizmet hesabı anahtarı değil (project_id ve client_email içeren \"service_account\" türü bekleniyor).", + "serviceAccountBadKey": "private_key alanı eksik veya PKCS#8 PEM anahtarı değil.", + "databaseIdInvalid": "Database ID, 4–63 küçük harf, rakam veya tire içermeli ya da (default) olmalıdır." + }, + "firestore": { + "serviceAccount": "Hizmet hesabı anahtarı (JSON)", + "serviceAccountPlaceholder": "Firestore erişimi olan bir hizmet hesabının JSON anahtar dosyasını yapıştırın…", + "serviceAccountHint": "Google Cloud konsolunda IAM → Hizmet Hesapları → Anahtarlar bölümünden oluşturun. roles/datastore.user rolü gerekir (yalnızca okuma için roles/datastore.viewer).", + "loadFromFile": "Dosyadan yükle…", + "parsedProject": "Proje:", + "databaseId": "Database ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Proje adlandırılmış Firestore veritabanları kullanmıyorsa boş bırakın.", + "noCollections": "Koleksiyon yok", + "noMatches": "Eşleşme yok", + "docCount": "{count, plural, =0 {Belge yok} one {# belge} other {# belge}}", + "newDocument": "Yeni belge", + "docIdLabel": "Belge ID'si", + "docIdAutoHint": "Otomatik oluşturulan bir ID için boş bırakın.", + "newFieldTypesHint": "Yeni alanlar dize, sayı, boolean, dizi veya harita olabilir. Mevcut bir timestamp, reference, bytes veya geopoint alanını düzenlemek türünü korur.", + "create": "Oluştur", + "edit": "Düzenle", + "save": "Kaydet", + "cancel": "İptal", + "deleteDocTitle": "Belge silinsin mi?", + "deleteDocBody": "Bu, {id} belgesini siler. Alt koleksiyonları SİLİNMEZ ve öksüz kalır (yol üzerinden hâlâ erişilebilir, ancak listelerde görünmez).", + "subcollections": "Alt koleksiyonlar", + "noSubcollections": "Alt koleksiyon yok", + "filterField": "Alan", + "filterValue": "Değer", + "orderBy": "Sıralama ölçütü", + "orderByHint": "Sıralama alanı eksik olan belgeler Firestore tarafından hariç tutulur.", + "apply": "Uygula", + "clear": "Temizle", + "nextPage": "İleri", + "prevPage": "Geri", + "emptyCollection": "Bu koleksiyonda belge yok.", + "queryLimitNote": "İlk {count} sonuç gösteriliyor — daha fazlası için sayfa boyutunu artırın.", + "selectDoc": "Görüntülemek için bir belge seçin.", + "errPermissionDenied": "İzin reddedildi. Hizmet hesabının roles/datastore.user rolüne ihtiyacı var (okumak için roles/datastore.viewer).", + "errServiceDisabled": "Bu proje için Firestore API etkinleştirilmemiş.", + "errOpenConsole": "Konsolda API'yi etkinleştir", + "errDatastoreMode": "Bu veritabanı, Firestore araçlarının göz atamadığı Datastore modunda.", + "errIndexRequired": "Bu sorgu birleşik bir dizin gerektiriyor.", + "errCreateIndex": "Konsolda dizin oluştur", + "errQuota": "Firestore kotası aşıldı — daha sonra tekrar deneyin.", + "errClockSkew": "Google imzalı token'ı reddetti. Bu bilgisayarın saatinin doğru ayarlandığını kontrol edin.", + "errServiceAccountRejected": "Hizmet hesabı devre dışı bırakıldı veya silindi. Google Cloud konsolunda yeni bir anahtar oluşturun.", + "errNetwork": "Ağ hatası — bağlantınızı kontrol edin.", + "errNotFound": "Veritabanı bulunamadı. Database ID'yi kontrol edin.", + "errDocTooLarge": "Belge, Firestore'un 1 MB sınırını aşıyor.", + "errInvalidDocJson": "Belge geçerli bir JSON değil.", + "errDocNotObject": "Bir belge en üst düzeyde bir JSON nesnesi olmalıdır.", + "toast": { + "docCreated": "Belge oluşturuldu", + "docUpdated": "Belge kaydedildi", + "docDeleted": "Belge silindi", + "createFailed": "Oluşturma başarısız oldu: {message}", + "saveFailed": "Kaydetme başarısız oldu: {message}", + "deleteFailed": "Silme başarısız oldu: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/uk.json b/apps/desktop-ui/messages/uk.json index f7306139..f7a388fe 100644 --- a/apps/desktop-ui/messages/uk.json +++ b/apps/desktop-ui/messages/uk.json @@ -1926,7 +1926,70 @@ "connectionStringRequired": "Введіть рядок підключення.", "connectionStringScheme": "Рядок підключення має починатися з mongodb:// або mongodb+srv://.", "redisUrlRequired": "Введіть URL Redis.", - "redisUrlScheme": "URL Redis має починатися з redis:// або rediss://." + "redisUrlScheme": "URL Redis має починатися з redis:// або rediss://.", + "serviceAccountRequired": "Вставте ключ сервісного облікового запису у форматі JSON.", + "serviceAccountInvalidJson": "Це не є коректним JSON.", + "serviceAccountNotServiceAccount": "Цей JSON не є ключем сервісного облікового запису (очікується тип \"service_account\" з project_id і client_email).", + "serviceAccountBadKey": "Поле private_key відсутнє або не є ключем PKCS#8 PEM.", + "databaseIdInvalid": "Database ID має містити від 4 до 63 малих літер, цифр або дефісів, або бути (default)." + }, + "firestore": { + "serviceAccount": "Ключ сервісного облікового запису (JSON)", + "serviceAccountPlaceholder": "Вставте файл JSON-ключа сервісного облікового запису з доступом до Firestore…", + "serviceAccountHint": "Створіть його в консолі Google Cloud → IAM → Сервісні облікові записи → Ключі. Потрібна роль roles/datastore.user (або roles/datastore.viewer лише для читання).", + "loadFromFile": "Завантажити з файлу…", + "parsedProject": "Проєкт:", + "databaseId": "Database ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Залиште порожнім, якщо проєкт не використовує іменовані бази даних Firestore.", + "noCollections": "Немає колекцій", + "noMatches": "Немає збігів", + "docCount": "{count, plural, =0 {Немає документів} one {# документ} few {# документи} many {# документів} other {# документа}}", + "newDocument": "Новий документ", + "docIdLabel": "ID документа", + "docIdAutoHint": "Залиште порожнім для автоматично згенерованого ID.", + "newFieldTypesHint": "Нові поля можуть бути рядками, числами, булевими значеннями, масивами або мапами. Редагування наявного поля типу timestamp, reference, bytes або geopoint зберігає його тип.", + "create": "Створити", + "edit": "Редагувати", + "save": "Зберегти", + "cancel": "Скасувати", + "deleteDocTitle": "Видалити документ?", + "deleteDocBody": "Це видалить {id}. Його підколекції НЕ видаляються і стануть «осиротілими» (як і раніше доступні за шляхом, але не видимі у списках).", + "subcollections": "Підколекції", + "noSubcollections": "Немає підколекцій", + "filterField": "Поле", + "filterValue": "Значення", + "orderBy": "Сортування", + "orderByHint": "Документи без поля сортування виключаються Firestore.", + "apply": "Застосувати", + "clear": "Очистити", + "nextPage": "Далі", + "prevPage": "Назад", + "emptyCollection": "У цій колекції немає документів.", + "queryLimitNote": "Показано перші {count} результатів — збільшіть розмір сторінки, щоб побачити більше.", + "selectDoc": "Виберіть документ, щоб переглянути його.", + "errPermissionDenied": "Доступ заборонено. Сервісному обліковому запису потрібна роль roles/datastore.user (або roles/datastore.viewer для читання).", + "errServiceDisabled": "Firestore API не увімкнено для цього проєкту.", + "errOpenConsole": "Увімкнути API в консолі", + "errDatastoreMode": "Ця база даних працює в режимі Datastore, який інструменти Firestore не можуть переглядати.", + "errIndexRequired": "Цьому запиту потрібен складений індекс.", + "errCreateIndex": "Створити індекс у консолі", + "errQuota": "Перевищено квоту Firestore — спробуйте пізніше.", + "errClockSkew": "Google відхилив підписаний токен. Перевірте, чи правильно встановлено годинник цього комп'ютера.", + "errServiceAccountRejected": "Сервісний обліковий запис було вимкнено або видалено. Створіть новий ключ у консолі Google Cloud.", + "errNetwork": "Помилка мережі — перевірте з'єднання.", + "errNotFound": "Базу даних не знайдено. Перевірте Database ID.", + "errDocTooLarge": "Документ перевищує ліміт Firestore у 1 МБ.", + "errInvalidDocJson": "Документ не є коректним JSON.", + "errDocNotObject": "Документ має бути JSON-об'єктом на верхньому рівні.", + "toast": { + "docCreated": "Документ створено", + "docUpdated": "Документ збережено", + "docDeleted": "Документ видалено", + "createFailed": "Не вдалося створити: {message}", + "saveFailed": "Не вдалося зберегти: {message}", + "deleteFailed": "Не вдалося видалити: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/vi.json b/apps/desktop-ui/messages/vi.json index c884d443..86cd40df 100644 --- a/apps/desktop-ui/messages/vi.json +++ b/apps/desktop-ui/messages/vi.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "Nhập chuỗi kết nối.", "connectionStringScheme": "Chuỗi kết nối phải bắt đầu bằng mongodb:// hoặc mongodb+srv://.", "redisUrlRequired": "Nhập URL Redis.", - "redisUrlScheme": "URL Redis phải bắt đầu bằng redis:// hoặc rediss://." + "redisUrlScheme": "URL Redis phải bắt đầu bằng redis:// hoặc rediss://.", + "serviceAccountRequired": "Dán khóa JSON của tài khoản dịch vụ.", + "serviceAccountInvalidJson": "Đây không phải là JSON hợp lệ.", + "serviceAccountNotServiceAccount": "JSON này không phải là khóa tài khoản dịch vụ (cần loại \"service_account\" với project_id và client_email).", + "serviceAccountBadKey": "Thiếu trường private_key hoặc trường này không phải khóa PEM định dạng PKCS#8.", + "databaseIdInvalid": "ID cơ sở dữ liệu phải gồm 4–63 chữ thường, chữ số hoặc dấu gạch nối, hoặc là (default)." + }, + "firestore": { + "serviceAccount": "Khóa tài khoản dịch vụ (JSON)", + "serviceAccountPlaceholder": "Dán tệp khóa JSON của tài khoản dịch vụ có quyền truy cập Firestore…", + "serviceAccountHint": "Tạo khóa này trong Google Cloud console → IAM → Service Accounts → Keys. Cần vai trò roles/datastore.user (hoặc roles/datastore.viewer nếu chỉ đọc).", + "loadFromFile": "Tải từ tệp…", + "parsedProject": "Dự án:", + "databaseId": "ID cơ sở dữ liệu", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "Để trống trừ khi dự án sử dụng cơ sở dữ liệu Firestore có tên riêng.", + "noCollections": "Không có bộ sưu tập nào", + "noMatches": "Không có kết quả khớp", + "docCount": "{count, plural, =0 {Không có tài liệu} other {# tài liệu}}", + "newDocument": "Tài liệu mới", + "docIdLabel": "ID tài liệu", + "docIdAutoHint": "Để trống để ID được tạo tự động.", + "newFieldTypesHint": "Trường mới có thể là chuỗi, số, boolean, mảng hoặc map. Việc chỉnh sửa trường timestamp, reference, bytes hoặc geopoint hiện có sẽ giữ nguyên kiểu dữ liệu.", + "create": "Tạo", + "edit": "Sửa", + "save": "Lưu", + "cancel": "Hủy", + "deleteDocTitle": "Xóa tài liệu?", + "deleteDocBody": "Thao tác này sẽ xóa {id}. Các bộ sưu tập con của nó KHÔNG bị xóa và sẽ trở thành mồ côi (vẫn truy cập được qua đường dẫn nhưng không hiển thị trong danh sách).", + "subcollections": "Bộ sưu tập con", + "noSubcollections": "Không có bộ sưu tập con", + "filterField": "Trường", + "filterValue": "Giá trị", + "orderBy": "Sắp xếp theo", + "orderByHint": "Firestore sẽ loại trừ các tài liệu không có trường dùng để sắp xếp.", + "apply": "Áp dụng", + "clear": "Xóa bộ lọc", + "nextPage": "Tiếp", + "prevPage": "Trước", + "emptyCollection": "Không có tài liệu nào trong bộ sưu tập này.", + "queryLimitNote": "Đang hiển thị {count} kết quả đầu tiên — tăng kích thước trang để xem thêm.", + "selectDoc": "Chọn một tài liệu để xem.", + "errPermissionDenied": "Quyền truy cập bị từ chối. Tài khoản dịch vụ cần vai trò roles/datastore.user (hoặc roles/datastore.viewer để chỉ đọc).", + "errServiceDisabled": "Firestore API chưa được bật cho dự án này.", + "errOpenConsole": "Bật API trong console", + "errDatastoreMode": "Cơ sở dữ liệu này đang ở chế độ Datastore, các công cụ Firestore không thể duyệt được.", + "errIndexRequired": "Truy vấn này cần một chỉ mục tổng hợp.", + "errCreateIndex": "Tạo chỉ mục trong console", + "errQuota": "Đã vượt quá hạn mức Firestore — hãy thử lại sau.", + "errClockSkew": "Google đã từ chối mã thông báo đã ký. Hãy kiểm tra xem đồng hồ của máy tính này có được đặt đúng không.", + "errServiceAccountRejected": "Tài khoản dịch vụ đã bị vô hiệu hóa hoặc xóa. Hãy cấp khóa mới trong Google Cloud console.", + "errNetwork": "Lỗi mạng — hãy kiểm tra kết nối của bạn.", + "errNotFound": "Không tìm thấy cơ sở dữ liệu. Hãy kiểm tra ID cơ sở dữ liệu.", + "errDocTooLarge": "Tài liệu vượt quá giới hạn 1 MB của Firestore.", + "errInvalidDocJson": "Tài liệu này không phải là JSON hợp lệ.", + "errDocNotObject": "Tài liệu phải là một đối tượng JSON ở cấp cao nhất.", + "toast": { + "docCreated": "Đã tạo tài liệu", + "docUpdated": "Đã lưu tài liệu", + "docDeleted": "Đã xóa tài liệu", + "createFailed": "Tạo thất bại: {message}", + "saveFailed": "Lưu thất bại: {message}", + "deleteFailed": "Xóa thất bại: {message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/messages/zh.json b/apps/desktop-ui/messages/zh.json index 8ce3e2d7..7ced4825 100644 --- a/apps/desktop-ui/messages/zh.json +++ b/apps/desktop-ui/messages/zh.json @@ -1915,7 +1915,70 @@ "connectionStringRequired": "请输入连接字符串。", "connectionStringScheme": "连接字符串必须以 mongodb:// 或 mongodb+srv:// 开头。", "redisUrlRequired": "请输入 Redis URL。", - "redisUrlScheme": "Redis URL 必须以 redis:// 或 rediss:// 开头。" + "redisUrlScheme": "Redis URL 必须以 redis:// 或 rediss:// 开头。", + "serviceAccountRequired": "请粘贴服务账号 JSON 密钥。", + "serviceAccountInvalidJson": "这不是有效的 JSON。", + "serviceAccountNotServiceAccount": "此 JSON 不是服务账号密钥(应为 \"service_account\" 类型,并包含 project_id 和 client_email)。", + "serviceAccountBadKey": "缺少 private_key 字段,或该字段不是 PKCS#8 格式的 PEM 密钥。", + "databaseIdInvalid": "数据库 ID 必须是 4–63 位小写字母、数字或连字符,或为 (default)。" + }, + "firestore": { + "serviceAccount": "服务账号密钥(JSON)", + "serviceAccountPlaceholder": "粘贴具有 Firestore 访问权限的服务账号 JSON 密钥文件…", + "serviceAccountHint": "在 Google Cloud 控制台 → IAM → 服务账号 → 密钥 中创建。需要 roles/datastore.user 角色(只读则使用 roles/datastore.viewer)。", + "loadFromFile": "从文件加载…", + "parsedProject": "项目:", + "databaseId": "数据库 ID", + "databaseIdPlaceholder": "(default)", + "databaseIdHint": "除非项目使用命名的 Firestore 数据库,否则请留空。", + "noCollections": "没有集合", + "noMatches": "没有匹配项", + "docCount": "{count, plural, =0 {没有文档} other {# 个文档}}", + "newDocument": "新建文档", + "docIdLabel": "文档 ID", + "docIdAutoHint": "留空则自动生成 ID。", + "newFieldTypesHint": "新字段可以是字符串、数字、布尔值、数组或映射。编辑现有的 timestamp、reference、bytes 或 geopoint 字段将保留其类型。", + "create": "创建", + "edit": "编辑", + "save": "保存", + "cancel": "取消", + "deleteDocTitle": "删除文档?", + "deleteDocBody": "这将删除 {id}。其子集合不会被删除,会成为孤立数据(仍可通过路径访问,但不会出现在列表中)。", + "subcollections": "子集合", + "noSubcollections": "没有子集合", + "filterField": "字段", + "filterValue": "值", + "orderBy": "排序方式", + "orderByHint": "缺少排序字段的文档会被 Firestore 排除。", + "apply": "应用", + "clear": "清除", + "nextPage": "下一页", + "prevPage": "上一页", + "emptyCollection": "此集合中没有文档。", + "queryLimitNote": "显示前 {count} 条结果 — 增大页面大小以查看更多。", + "selectDoc": "选择一个文档以查看。", + "errPermissionDenied": "权限被拒绝。服务账号需要 roles/datastore.user 角色(只读则需要 roles/datastore.viewer)。", + "errServiceDisabled": "此项目尚未启用 Firestore API。", + "errOpenConsole": "在控制台中启用 API", + "errDatastoreMode": "此数据库处于 Datastore 模式,Firestore 工具无法浏览。", + "errIndexRequired": "此查询需要复合索引。", + "errCreateIndex": "在控制台中创建索引", + "errQuota": "Firestore 配额已用尽 — 请稍后再试。", + "errClockSkew": "Google 拒绝了签名令牌。请检查此计算机的时钟设置是否正确。", + "errServiceAccountRejected": "该服务账号已被停用或删除。请在 Google Cloud 控制台中签发新密钥。", + "errNetwork": "网络错误 — 请检查您的连接。", + "errNotFound": "未找到数据库。请检查数据库 ID。", + "errDocTooLarge": "文档超过 Firestore 的 1 MB 限制。", + "errInvalidDocJson": "该文档不是有效的 JSON。", + "errDocNotObject": "文档的最外层必须是 JSON 对象。", + "toast": { + "docCreated": "文档已创建", + "docUpdated": "文档已保存", + "docDeleted": "文档已删除", + "createFailed": "创建失败:{message}", + "saveFailed": "保存失败:{message}", + "deleteFailed": "删除失败:{message}" + } }, "redis": { "urlMode": "URL", diff --git a/apps/desktop-ui/src/components/data-explorer/__tests__/firestore-adapter.test.ts b/apps/desktop-ui/src/components/data-explorer/__tests__/firestore-adapter.test.ts new file mode 100644 index 00000000..5e927bbe --- /dev/null +++ b/apps/desktop-ui/src/components/data-explorer/__tests__/firestore-adapter.test.ts @@ -0,0 +1,88 @@ +// firestore.tsx imports next-intl's useTranslations and (via its pane) +// @/components/ui/resizable — same mocks as the other adapter tests. +jest.mock("next-intl", () => ({ useTranslations: () => (k: string) => k })) +jest.mock("react-resizable-panels", () => ({ + Panel: () => null, + PanelGroup: () => null, + PanelResizeHandle: () => null, +})) + +import { firestoreAdapter } from "../adapters/firestore" + +const VALID_SA_JSON = JSON.stringify({ + type: "service_account", + project_id: "my-proj", + client_email: "svc@my-proj.iam.gserviceaccount.com", + private_key: "-----BEGIN PRIVATE KEY-----\nabc\n-----END PRIVATE KEY-----\n", +}) + +describe("firestore adapter", () => { + it("starts blank with the default database", () => { + expect(firestoreAdapter.blankConfig()).toEqual({ + serviceAccountJson: "", + databaseId: "(default)", + }) + }) + + it("rejects bad configs with the right i18n keys", () => { + expect( + firestoreAdapter.validate({ serviceAccountJson: "", databaseId: "(default)" }) + ).toBe("validation.serviceAccountRequired") + expect( + firestoreAdapter.validate({ serviceAccountJson: "{bad", databaseId: "(default)" }) + ).toBe("validation.serviceAccountInvalidJson") + expect( + firestoreAdapter.validate({ + serviceAccountJson: JSON.stringify({ type: "authorized_user" }), + databaseId: "(default)", + }) + ).toBe("validation.serviceAccountNotServiceAccount") + expect( + firestoreAdapter.validate({ + serviceAccountJson: VALID_SA_JSON, + databaseId: "Bad_DB!", + }) + ).toBe("validation.databaseIdInvalid") + }) + + it("accepts a valid config, with default or named database", () => { + expect( + firestoreAdapter.validate({ serviceAccountJson: VALID_SA_JSON, databaseId: "(default)" }) + ).toBeNull() + expect( + firestoreAdapter.validate({ serviceAccountJson: VALID_SA_JSON, databaseId: "" }) + ).toBeNull() + expect( + firestoreAdapter.validate({ serviceAccountJson: VALID_SA_JSON, databaseId: "my-named-db" }) + ).toBeNull() + }) + + // A misspelled key renders as a broken path to the user — assert every + // key the adapter can return resolves in en.json. + it("returns only keys that resolve in messages/en.json", () => { + const messages = require("../../../../messages/en.json") + for (const key of [ + "validation.serviceAccountRequired", + "validation.serviceAccountInvalidJson", + "validation.serviceAccountNotServiceAccount", + "validation.serviceAccountBadKey", + "validation.databaseIdInvalid", + ]) { + const resolved = key + .split(".") + .reduce((node, part) => (node as Record)?.[part], + messages.DataExplorer) + expect(typeof resolved).toBe("string") + expect(resolved).not.toBe("") + } + }) + + it("identifies itself consistently and satisfies the contract", () => { + expect(firestoreAdapter.id).toBe("firestore") + expect(firestoreAdapter.label).toBe("Firestore") + expect(typeof firestoreAdapter.testConnection).toBe("function") + expect(firestoreAdapter.ConnectionForm).toBeTruthy() + expect(firestoreAdapter.SidebarTree).toBeTruthy() + expect(firestoreAdapter.Pane).toBeTruthy() + }) +}) diff --git a/apps/desktop-ui/src/components/data-explorer/adapters/firestore.tsx b/apps/desktop-ui/src/components/data-explorer/adapters/firestore.tsx new file mode 100644 index 00000000..8577f653 --- /dev/null +++ b/apps/desktop-ui/src/components/data-explorer/adapters/firestore.tsx @@ -0,0 +1,393 @@ +"use client"; + +import React, { useCallback, useEffect, useRef, useState, type FormEvent } from "react"; +import { useTranslations } from "next-intl"; +import { IconFlame, IconFolder, IconX } from "@tabler/icons-react"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Switch } from "@/components/ui/switch"; +import { Textarea } from "@/components/ui/textarea"; +import { cn } from "@/lib/utils"; +import { CONNECTION_COLORS } from "@/components/nosql-explorer/connection-form"; +import { FirestoreCollectionPane } from "@/components/data-explorer/firestore/collection-pane"; +import { + databasePath, + firestoreFetch, + listCollectionIds, + parseServiceAccount, + sanitizeFirestoreError, + type FirestoreConfig, +} from "@/lib/data-explorer/firestore-api"; +import type { ConnectionFormProps, PaneProps, SidebarTreeProps, SourceAdapter } from "../types"; + +export type { FirestoreConfig }; + +export interface FirestoreTabState { + /** Full collection path from the documents root, e.g. "users/u1/orders". */ + collectionPath: string; + filterField: string; + filterOp: string; + filterValue: string; + orderByField: string; + orderByDir: "asc" | "desc"; + pageSize: number; + /** Bumped to force a refetch. */ + refreshTick: number; +} + +export function blankTabState(collectionPath: string): FirestoreTabState { + return { + collectionPath, + filterField: "", + filterOp: "==", + filterValue: "", + orderByField: "", + orderByDir: "asc", + pageSize: 25, + refreshTick: 0, + }; +} + +function blankConfig(): FirestoreConfig { + return { serviceAccountJson: "", databaseId: "(default)" }; +} + +const DATABASE_ID_RE = /^[a-z0-9][a-z0-9-]{2,61}[a-z0-9]$/; + +function validate(config: FirestoreConfig): string | null { + if (!config.serviceAccountJson.trim()) return "validation.serviceAccountRequired"; + const parsed = parseServiceAccount(config.serviceAccountJson); + if ("errorKey" in parsed) return parsed.errorKey; + const db = config.databaseId.trim(); + if (db && db !== "(default)" && !DATABASE_ID_RE.test(db)) + return "validation.databaseIdInvalid"; + return null; +} + +/** + * Cheap authed metadata call: surfaces bad keys, SERVICE_DISABLED, + * PERMISSION_DENIED and a wrong database id before anything is saved. + * Also rejects Datastore-mode databases — the Firestore document API + * cannot browse those. + */ +async function testConnection(config: FirestoreConfig): Promise { + try { + const db = await firestoreFetch(config, "GET", databasePath(config)); + if (db?.type === "DATASTORE_MODE") { + // Reuse the runtime error copy; the dialog renders thrown + // messages as-is. Untranslatable server strings elsewhere follow + // the same rule. + throw new Error("This database is in Datastore mode, which Firestore tools cannot browse."); + } + } catch (err) { + throw new Error(sanitizeFirestoreError(err instanceof Error ? err.message : String(err))); + } +} + +/* ------------------------------------------------------------------ form */ + +function FirestoreConnectionForm({ + initial, + saving, + error, + onTest, + testState, + onSubmit, + onCancel, +}: ConnectionFormProps) { + const t = useTranslations("DataExplorer.connectionDialog"); + const tf = useTranslations("DataExplorer.firestore"); + const [name, setName] = useState(initial.name); + const [folder, setFolder] = useState(initial.folder ?? ""); + const [color, setColor] = useState(initial.color ?? null); + const [readOnly, setReadOnly] = useState(initial.readOnly ?? false); + const [serviceAccountJson, setServiceAccountJson] = useState(initial.config.serviceAccountJson); + const [databaseId, setDatabaseId] = useState( + initial.config.databaseId === "(default)" ? "" : initial.config.databaseId, + ); + const fileInputRef = useRef(null); + + function currentConfig(): FirestoreConfig { + return { + serviceAccountJson, + databaseId: databaseId.trim() || "(default)", + }; + } + + // Non-sensitive echo so the user can confirm which project they pasted + // before saving. The private key is never rendered outside the textarea. + const parsed = parseServiceAccount(serviceAccountJson); + const parsedOk = !("errorKey" in parsed) ? parsed : null; + + function handleFile(e: React.ChangeEvent) { + const file = e.target.files?.[0]; + if (!file) return; + const reader = new FileReader(); + reader.onload = () => setServiceAccountJson(String(reader.result ?? "")); + reader.readAsText(file); + e.target.value = ""; + } + + function handleSubmit(e: FormEvent) { + e.preventDefault(); + onSubmit({ name, folder, color, readOnly, config: currentConfig() }); + } + + return ( +
+
+ + setName(e.target.value)} + placeholder={t("namePlaceholder")} + disabled={saving} + /> +
+ +
+ + setFolder(e.target.value)} + placeholder={t("folderPlaceholder")} + disabled={saving} + /> +
+ +
+
+ + + +
+