feat: load plugin frontends at runtime and remove plugin ids from the shell

This commit is contained in:
LukeGus committed 2026-09-22 20:15:52 -05:00
1 parent 49f0286a14
commit e88d5a52e3
721 files changed
+54265 -44416

No files matched your search

+55 -1
View File
@@ -1 +1,55 @@
{}
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Workspaces",
"saveCurrent": "Save Current",
"saveCurrentTitle": "Save Current Workspace",
"saveCurrentDescription": "Save every open tab, split layout, and pane arrangement as a new named workspace.",
"nameLabel": "Name",
"namePlaceholder": "e.g., Prod Debugging",
"nameRequired": "Workspace name is required",
"colorLabel": "Color",
"workspaceCreated": "Workspace saved",
"workspaceUpdated": "Workspace updated",
"workspaceDeleted": "Workspace deleted",
"workspaceDuplicated": "Workspace duplicated",
"saveFailed": "Failed to save workspace",
"updateFailed": "Failed to update workspace",
"deleteFailed": "Failed to delete workspace",
"duplicateFailed": "Failed to duplicate workspace",
"loadFailed": "Failed to load workspaces",
"applyFailed": "Failed to apply workspace",
"deleteWorkspaceTitle": "Delete Workspace",
"deleteWorkspaceDescription": "Are you sure you want to delete \"{{name}}\"? This cannot be undone.",
"noWorkspaces": "No saved workspaces yet. Save your current tab arrangement to get started.",
"tabCount": "{{count}} tab",
"tabCount_other": "{{count}} tabs",
"apply": "Apply",
"applyConfirmTitle": "Apply Workspace",
"applyConfirmDescription": "Applying \"{{name}}\" will close your current tabs and replace them with this workspace's saved arrangement. Unsaved changes to your current layout will be lost.",
"applyConfirmButton": "Apply Workspace",
"updateWithCurrent": "Update with Current",
"updateWithCurrentConfirm": "Overwrite \"{{name}}\" with your current tab arrangement?",
"rename": "Rename",
"duplicate": "Duplicate",
"duplicateNameSuffix": "{{name}} (copy)",
"setDefault": "Set as Default",
"unsetDefault": "Remove as Default",
"defaultBadge": "Default",
"lastSession": "Last Session",
"lastSessionDescription": "Automatically updated with your most recent tab arrangement. Apply it to recover what you had open.",
"lastUsed": "Last used {{time}}",
"neverUsed": "Never applied",
"tabsSkipped": "Workspace applied — {{count}} tab(s) skipped (host no longer exists): {{names}}"
}
}
},
"nav": {
"workspaces": "Workspaces"
},
"onboarding": {
"workflow_workspaces": "Workspaces",
"workflow_workspaces_desc": "Save a set of open tabs and reopen the whole layout later."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Werkruimtes",
"saveCurrent": "Stoor Huidige",
"saveCurrentTitle": "Stoor huidige werkspasie",
"saveCurrentDescription": "Stoor elke oop oortjie, gesplete uitleg en paneelrangskikking as 'n nuwe benoemde werkruimte.",
"nameLabel": "Naam",
"namePlaceholder": "bv. Produkontfouting",
"nameRequired": "Werkruimtenaam word vereis",
"colorLabel": "Kleur",
"workspaceCreated": "Werkruimte gestoor",
"workspaceUpdated": "Werkruimte opgedateer",
"workspaceDeleted": "Werkruimte uitgevee",
"workspaceDuplicated": "Werkruimte gedupliseer",
"saveFailed": "Kon nie werkspasie stoor nie",
"updateFailed": "Kon nie werkspasie opdateer nie",
"deleteFailed": "Kon nie werkspasie uitvee nie",
"duplicateFailed": "Kon nie werkruimte dupliseer nie",
"loadFailed": "Kon nie werkruimtes laai nie",
"applyFailed": "Kon nie werkspasie toepas nie",
"deleteWorkspaceTitle": "Vee Werkspasie uit",
"deleteWorkspaceDescription": "Is jy seker jy wil \"{{name}}\" verwyder? Dit kan nie ongedaan gemaak word nie.",
"noWorkspaces": "Geen gestoorde werkruimtes nog nie. Stoor jou huidige oortjie-rangskikking om te begin.",
"tabCount": "{{count}} oortjie",
"tabCount_other": "{{count}} oortjies",
"apply": "Dien toe",
"applyConfirmTitle": "Pas Werkruimte toe",
"applyConfirmDescription": "Deur \"{{name}}\" toe te pas, sal jou huidige oortjies toegemaak word en vervang word met hierdie werkspasie se gestoorde rangskikking. Ongestoorde veranderinge aan jou huidige uitleg sal verlore gaan.",
"applyConfirmButton": "Pas Werkruimte toe",
"updateWithCurrent": "Opdateer met Huidige",
"updateWithCurrentConfirm": "Oorskryf \"{{name}}\" met jou huidige tabbladrangskikking?",
"rename": "Hernoem",
"duplicate": "Duplikaat",
"duplicateNameSuffix": "{{name}} (kopieer)",
"setDefault": "Stel as verstek",
"unsetDefault": "Verwyder as verstek",
"defaultBadge": "Standaard",
"lastSession": "Laaste Sessie",
"lastSessionDescription": "Outomaties opgedateer met jou mees onlangse oortjie-rangskikking. Pas dit toe om te herstel wat jy oop gehad het.",
"lastUsed": "Laas gebruik {{time}}",
"neverUsed": "Nooit toegepas nie",
"tabsSkipped": "Werkruimte toegepas — {{count}} oortjie(s) oorgeslaan (gasheer bestaan nie meer nie): {{names}}"
}
}
},
"nav": {
"workspaces": "Werkruimtes"
},
"onboarding": {
"workflow_workspaces": "Werkruimtes",
"workflow_workspaces_desc": "Stoor 'n stel oop oortjies en heropen die hele uitleg later."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "مساحات العمل",
"saveCurrent": "حفظ الوضع الحالي",
"saveCurrentTitle": "حفظ مساحة العمل الحالية",
"saveCurrentDescription": "احفظ كل علامة تبويب مفتوحة، وتخطيط مقسم، وترتيب أجزاء كمساحة عمل جديدة مسماة.",
"nameLabel": "اسم",
"namePlaceholder": "مثال: تصحيح أخطاء الإنتاج",
"nameRequired": "اسم مساحة العمل مطلوب",
"colorLabel": "لون",
"workspaceCreated": "تم حفظ مساحة العمل",
"workspaceUpdated": "تم تحديث مساحة العمل",
"workspaceDeleted": "تم حذف مساحة العمل",
"workspaceDuplicated": "تم تكرار مساحة العمل",
"saveFailed": "فشل حفظ مساحة العمل",
"updateFailed": "فشل تحديث مساحة العمل",
"deleteFailed": "فشل حذف مساحة العمل",
"duplicateFailed": "فشل تكرار مساحة العمل",
"loadFailed": "فشل تحميل مساحات العمل",
"applyFailed": "فشل تطبيق مساحة العمل",
"deleteWorkspaceTitle": "حذف مساحة العمل",
"deleteWorkspaceDescription": "هل أنت متأكد من رغبتك في حذف \"{{name}}\"؟ لا يمكن التراجع عن هذا.",
"noWorkspaces": "لم يتم حفظ أي مساحات عمل حتى الآن. احفظ ترتيب علامات التبويب الحالي للبدء.",
"tabCount": "{{count}} علامة تبويب",
"tabCount_other": "علامات تبويب {{count}}",
"apply": "يتقدم",
"applyConfirmTitle": "تطبيق مساحة العمل",
"applyConfirmDescription": "سيؤدي تطبيق \"{{name}}\" إلى إغلاق علامات التبويب الحالية واستبدالها بالترتيب المحفوظ لمساحة العمل هذه. ستفقد التغييرات غير المحفوظة على تخطيطك الحالي.",
"applyConfirmButton": "تطبيق مساحة العمل",
"updateWithCurrent": "تحديث بالبيانات الحالية",
"updateWithCurrentConfirm": "هل تريد استبدال \"{{name}}\" بترتيب علامات التبويب الحالي؟",
"rename": "إعادة تسمية",
"duplicate": "ينسخ",
"duplicateNameSuffix": "{{name}} (نسخة)",
"setDefault": "تعيين كافتراضي",
"unsetDefault": "إزالة كإعداد افتراضي",
"defaultBadge": "تقصير",
"lastSession": "الجلسة الأخيرة",
"lastSessionDescription": "يتم تحديثها تلقائيًا بأحدث ترتيب لعلامات التبويب لديك. قم بتطبيقها لاستعادة ما كنت قد فتحته.",
"lastUsed": "آخر استخدام {{time}}",
"neverUsed": "لم يتم التقديم مطلقا",
"tabsSkipped": "تم تطبيق مساحة العمل — تم تخطي علامة (علامات) التبويب {{count}} (لم يعد المضيف موجودًا): {{names}}"
}
}
},
"nav": {
"workspaces": "مساحات العمل"
},
"onboarding": {
"workflow_workspaces": "مساحات العمل",
"workflow_workspaces_desc": "احفظ مجموعة من علامات التبويب المفتوحة وأعد فتح التخطيط بأكمله لاحقًا."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Работни пространства",
"saveCurrent": "Запазване на текущото",
"saveCurrentTitle": "Запазване на текущото работно пространство",
"saveCurrentDescription": "Запазете всеки отворен раздел, разделено оформление и подредба на панели като ново именувано работно пространство.",
"nameLabel": "Име",
"namePlaceholder": "напр. Отстраняване на грешки в продукта",
"nameRequired": "Името на работното пространство е задължително",
"colorLabel": "Цвят",
"workspaceCreated": "Работното пространство е запазено",
"workspaceUpdated": "Работното пространство е актуализирано",
"workspaceDeleted": "Работното пространство е изтрито",
"workspaceDuplicated": "Работното пространство е дублирано",
"saveFailed": "Запазването на работното пространство не бе успешно",
"updateFailed": "Актуализирането на работното пространство не бе успешно",
"deleteFailed": "Изтриването на работното пространство не бе успешно",
"duplicateFailed": "Дублирането на работното пространство не бе успешно",
"loadFailed": "Зареждането на работните пространства не бе успешно",
"applyFailed": "Прилагането на работното пространство не бе успешно",
"deleteWorkspaceTitle": "Изтриване на работно пространство",
"deleteWorkspaceDescription": "Сигурни ли сте, че искате да изтриете „{{name}}“? Това не може да бъде отменено.",
"noWorkspaces": "Все още няма запазени работни пространства. Запазете текущото си разположение на раздели, за да започнете.",
"tabCount": "раздел {{count}}",
"tabCount_other": "{{count}} раздели",
"apply": "Приложи",
"applyConfirmTitle": "Прилагане на работно пространство",
"applyConfirmDescription": "Прилагането на „{{name}}“ ще затвори текущите ви раздели и ще ги замени със запазената подредба на това работно пространство. Незапазените промени в текущото ви оформление ще бъдат загубени.",
"applyConfirmButton": "Прилагане на работно пространство",
"updateWithCurrent": "Актуализиране с текущото",
"updateWithCurrentConfirm": "Да се презапише ли „{{name}}“ с текущата ви подредба на табулации?",
"rename": "Преименуване",
"duplicate": "Дубликат",
"duplicateNameSuffix": "{{name}} (копие)",
"setDefault": "Задай по подразбиране",
"unsetDefault": "Премахване по подразбиране",
"defaultBadge": "По подразбиране",
"lastSession": "Последна сесия",
"lastSessionDescription": "Автоматично се актуализира с най-скорошната ви подредба на раздели. Приложете я, за да възстановите това, което сте имали отворено.",
"lastUsed": "Последно използвано {{time}}",
"neverUsed": "Никога не е прилагано",
"tabsSkipped": "Приложено е работно пространство — {{count}} пропуснати раздели (хостът вече не съществува): {{names}}"
}
}
},
"nav": {
"workspaces": "Работни пространства"
},
"onboarding": {
"workflow_workspaces": "Работни пространства",
"workflow_workspaces_desc": "Запазете набор от отворени раздели и отворете отново цялото оформление по-късно."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "কর্মক্ষেত্র",
"saveCurrent": "বর্তমান সংরক্ষণ করুন",
"saveCurrentTitle": "বর্তমান ওয়ার্কস্পেস সংরক্ষণ করুন",
"saveCurrentDescription": "প্রতিটি খোলা ট্যাব, স্প্লিট লেআউট এবং পেন বিন্যাসকে একটি নতুন নামযুক্ত ওয়ার্কস্পেস হিসেবে সংরক্ষণ করুন।",
"nameLabel": "নাম",
"namePlaceholder": "যেমন, প্রোডাকশন ডিবাগিং",
"nameRequired": "ওয়ার্কস্পেসের নাম আবশ্যক।",
"colorLabel": "রঙ",
"workspaceCreated": "ওয়ার্কস্পেস সংরক্ষিত",
"workspaceUpdated": "ওয়ার্কস্পেস আপডেট করা হয়েছে",
"workspaceDeleted": "ওয়ার্কস্পেস মুছে ফেলা হয়েছে",
"workspaceDuplicated": "ওয়ার্কস্পেস নকল করা হয়েছে",
"saveFailed": "ওয়ার্কস্পেস সংরক্ষণ করতে ব্যর্থ হয়েছে",
"updateFailed": "ওয়ার্কস্পেস আপডেট করতে ব্যর্থ হয়েছে",
"deleteFailed": "ওয়ার্কস্পেস মুছে ফেলা ব্যর্থ হয়েছে",
"duplicateFailed": "ওয়ার্কস্পেস নকল করতে ব্যর্থ হয়েছে",
"loadFailed": "ওয়ার্কস্পেস লোড করতে ব্যর্থ হয়েছে",
"applyFailed": "ওয়ার্কস্পেস প্রয়োগ করতে ব্যর্থ হয়েছে",
"deleteWorkspaceTitle": "ওয়ার্কস্পেস মুছুন",
"deleteWorkspaceDescription": "আপনি কি \"{{name}}\" মুছে ফেলতে নিশ্চিত? এটি আর পূর্বাবস্থায় ফেরানো যাবে না।",
"noWorkspaces": "এখনো কোনো ওয়ার্কস্পেস সেভ করা হয়নি। কাজ শুরু করার জন্য আপনার বর্তমান ট্যাব বিন্যাসটি সেভ করুন।",
"tabCount": "{{count}} ট্যাব",
"tabCount_other": "{{count}} ট্যাব",
"apply": "আবেদন করুন",
"applyConfirmTitle": "ওয়ার্কস্পেস প্রয়োগ করুন",
"applyConfirmDescription": "\"{{name}}\" প্রয়োগ করলে আপনার বর্তমান ট্যাবগুলি বন্ধ হয়ে যাবে এবং সেগুলির পরিবর্তে এই ওয়ার্কস্পেসের সংরক্ষিত বিন্যাসটি প্রদর্শিত হবে। আপনার বর্তমান লেআউটে করা অসংরক্ষিত পরিবর্তনগুলি হারিয়ে যাবে।",
"applyConfirmButton": "ওয়ার্কস্পেস প্রয়োগ করুন",
"updateWithCurrent": "বর্তমান তথ্য দিয়ে আপডেট করুন",
"updateWithCurrentConfirm": "আপনার বর্তমান ট্যাব বিন্যাস দিয়ে \"{{name}}\" ওভাররাইট করবেন?",
"rename": "পুনঃনামকরণ",
"duplicate": "নকল",
"duplicateNameSuffix": "{{name}} (অনুলিপি)",
"setDefault": "ডিফল্ট হিসাবে সেট করা হয়েছে",
"unsetDefault": "ডিফল্ট হিসেবে অপসারণ করুন",
"defaultBadge": "ডিফল্ট",
"lastSession": "শেষ অধিবেশন",
"lastSessionDescription": "আপনার সর্বশেষ ট্যাব বিন্যাস অনুযায়ী স্বয়ংক্রিয়ভাবে আপডেট হয়। আপনার খোলা ট্যাবগুলো পুনরুদ্ধার করতে এটি প্রয়োগ করুন।",
"lastUsed": "সর্বশেষ ব্যবহৃত {{time}}",
"neverUsed": "কখনো প্রয়োগ করা হয়নি",
"tabsSkipped": "ওয়ার্কস্পেস প্রয়োগ করা হয়েছে — {{count}} টি ট্যাব বাদ দেওয়া হয়েছে (হোস্টটি আর বিদ্যমান নেই): {{names}}"
}
}
},
"nav": {
"workspaces": "কর্মক্ষেত্র"
},
"onboarding": {
"workflow_workspaces": "কর্মক্ষেত্র",
"workflow_workspaces_desc": "খোলা ট্যাবগুলো সংরক্ষণ করুন এবং পরে সম্পূর্ণ লেআউটটি আবার খুলুন।"
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Espais de treball",
"saveCurrent": "Desa l'actual",
"saveCurrentTitle": "Desa l'espai de treball actual",
"saveCurrentDescription": "Desa totes les pestanyes obertes, dissenys dividits i disposicions de panells com un espai de treball amb un nom nou.",
"nameLabel": "Nom",
"namePlaceholder": "p. ex., depuració de productes",
"nameRequired": "El nom de l'espai de treball és obligatori",
"colorLabel": "Color",
"workspaceCreated": "L'espai de treball s'ha desat",
"workspaceUpdated": "Espai de treball actualitzat",
"workspaceDeleted": "L'espai de treball s'ha suprimit",
"workspaceDuplicated": "Espai de treball duplicat",
"saveFailed": "No s'ha pogut desar l'espai de treball",
"updateFailed": "No s'ha pogut actualitzar l'espai de treball",
"deleteFailed": "No s'ha pogut suprimir l'espai de treball",
"duplicateFailed": "No s'ha pogut duplicar l'espai de treball",
"loadFailed": "No s'han pogut carregar els espais de treball",
"applyFailed": "No s'ha pogut aplicar l'espai de treball",
"deleteWorkspaceTitle": "Suprimeix l'espai de treball",
"deleteWorkspaceDescription": "Esteu segur que voleu suprimir \"{{name}}\"? Això no es pot desfer.",
"noWorkspaces": "Encara no hi ha espais de treball desats. Deseu la disposició actual de les pestanyes per començar.",
"tabCount": "Pestanya {{count}}",
"tabCount_other": "pestanyes {{count}}",
"apply": "Aplica",
"applyConfirmTitle": "Aplica l'espai de treball",
"applyConfirmDescription": "Si apliqueu \"{{name}}\", es tancaran les pestanyes actuals i les substituiran per la disposició desada d'aquest espai de treball. Els canvis no desats al disseny actual es perdran.",
"applyConfirmButton": "Aplica l'espai de treball",
"updateWithCurrent": "Actualitza amb l'actual",
"updateWithCurrentConfirm": "Voleu sobreescriure \"{{name}}\" amb la disposició actual de les pestanyes?",
"rename": "Canvia el nom",
"duplicate": "Duplicat",
"duplicateNameSuffix": "{{name}} (còpia)",
"setDefault": "Estableix com a predeterminat",
"unsetDefault": "Elimina com a predeterminat",
"defaultBadge": "Per defecte",
"lastSession": "Última sessió",
"lastSessionDescription": "Actualitzat automàticament amb la disposició de pestanyes més recent. Aplica-ho per recuperar el que tenies obert.",
"lastUsed": "Últim ús {{time}}",
"neverUsed": "Mai aplicat",
"tabsSkipped": "Espai de treball aplicat — {{count}} pestanyes omeses (l'amfitrió ja no existeix): {{names}}"
}
}
},
"nav": {
"workspaces": "Espais de treball"
},
"onboarding": {
"workflow_workspaces": "Espais de treball",
"workflow_workspaces_desc": "Desa un conjunt de pestanyes obertes i torna a obrir tot el disseny més tard."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Pracovní prostory",
"saveCurrent": "Uložit aktuální",
"saveCurrentTitle": "Uložit aktuální pracovní prostor",
"saveCurrentDescription": "Uložte každou otevřenou kartu, rozdělené rozvržení a uspořádání panelů jako nový pojmenovaný pracovní prostor.",
"nameLabel": "Jméno",
"namePlaceholder": "např. ladění produktu",
"nameRequired": "Název pracovního prostoru je povinný",
"colorLabel": "Barva",
"workspaceCreated": "Pracovní prostor uložen",
"workspaceUpdated": "Pracovní prostor aktualizován",
"workspaceDeleted": "Pracovní prostor smazán",
"workspaceDuplicated": "Pracovní prostor byl duplikován",
"saveFailed": "Uložení pracovního prostoru se nezdařilo",
"updateFailed": "Aktualizace pracovního prostoru se nezdařilo",
"deleteFailed": "Nepodařilo se smazat pracovní prostor",
"duplicateFailed": "Nepodařilo se duplikovat pracovní prostor",
"loadFailed": "Nepodařilo se načíst pracovní prostory",
"applyFailed": "Použití pracovního prostoru se nezdařilo",
"deleteWorkspaceTitle": "Smazat pracovní prostor",
"deleteWorkspaceDescription": "Opravdu chcete smazat „{{name}}“? Tuto akci nelze vrátit zpět.",
"noWorkspaces": "Zatím nejsou uložené žádné pracovní prostory. Chcete-li začít, uložte si aktuální uspořádání karet.",
"tabCount": "{{count}} záložka",
"tabCount_other": "{{count}} záložek",
"apply": "Použít",
"applyConfirmTitle": "Použít pracovní prostor",
"applyConfirmDescription": "Použitím „{{name}}“ zavřete aktuální karty a nahradí je uloženým uspořádáním tohoto pracovního prostoru. Neuložené změny aktuálního rozvržení budou ztraceny.",
"applyConfirmButton": "Použít pracovní prostor",
"updateWithCurrent": "Aktualizovat s aktuálním",
"updateWithCurrentConfirm": "Přepsat „{{name}}“ aktuálním uspořádáním tabulací?",
"rename": "Přejmenovat",
"duplicate": "Duplikát",
"duplicateNameSuffix": "{{name}} (kopie)",
"setDefault": "Nastavit jako výchozí",
"unsetDefault": "Odebrat jako výchozí",
"defaultBadge": "Výchozí",
"lastSession": "Poslední sezení",
"lastSessionDescription": "Automaticky aktualizováno s vaším posledním uspořádáním karet. Použijte tuto funkci k obnovení toho, co jste měli otevřené.",
"lastUsed": "Naposledy použité {{time}}",
"neverUsed": "Nikdy nepoužíváno",
"tabsSkipped": "Použitý pracovní prostor — {{count}} přeskočeno (hostitel již neexistuje): {{names}}"
}
}
},
"nav": {
"workspaces": "Pracovní prostory"
},
"onboarding": {
"workflow_workspaces": "Pracovní prostory",
"workflow_workspaces_desc": "Uložte si sadu otevřených karet a celé rozvržení si znovu otevřete později."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Arbejdsområder",
"saveCurrent": "Gem nuværende",
"saveCurrentTitle": "Gem nuværende arbejdsområde",
"saveCurrentDescription": "Gem alle åbne faner, opdelte layouts og rudearrangementer som et nyt navngivet arbejdsområde.",
"nameLabel": "Navn",
"namePlaceholder": "f.eks. produktfejlfinding",
"nameRequired": "Arbejdsområdenavn er påkrævet",
"colorLabel": "Farve",
"workspaceCreated": "Arbejdsområdet er gemt",
"workspaceUpdated": "Arbejdsområdet er opdateret",
"workspaceDeleted": "Arbejdsområdet er slettet",
"workspaceDuplicated": "Arbejdsområdet er duplikeret",
"saveFailed": "Kunne ikke gemme arbejdsområdet",
"updateFailed": "Kunne ikke opdatere arbejdsområdet",
"deleteFailed": "Kunne ikke slette arbejdsområdet",
"duplicateFailed": "Kunne ikke duplikere arbejdsområdet",
"loadFailed": "Kunne ikke indlæse arbejdsområder",
"applyFailed": "Kunne ikke anvende arbejdsområdet",
"deleteWorkspaceTitle": "Slet arbejdsområde",
"deleteWorkspaceDescription": "Er du sikker på, at du vil slette \"{{name}}\"? Dette kan ikke fortrydes.",
"noWorkspaces": "Ingen gemte arbejdsområder endnu. Gem din nuværende faneopstilling for at komme i gang.",
"tabCount": "{{count}} faneblad",
"tabCount_other": "{{count}} faner",
"apply": "Anvende",
"applyConfirmTitle": "Anvend arbejdsområde",
"applyConfirmDescription": "Hvis du anvender \"{{name}}\", lukkes dine nuværende faner og erstattes med dette arbejdsområdes gemte arrangement. Ændringer af dit nuværende layout, der ikke er gemt, vil gå tabt.",
"applyConfirmButton": "Anvend arbejdsområde",
"updateWithCurrent": "Opdater med aktuel",
"updateWithCurrentConfirm": "Vil du overskrive \"{{name}}\" med din nuværende tabulatoropstilling?",
"rename": "Omdøb",
"duplicate": "Duplikere",
"duplicateNameSuffix": "{{name}} (kopi)",
"setDefault": "Angiv som standard",
"unsetDefault": "Fjern som standard",
"defaultBadge": "Misligholdelse",
"lastSession": "Sidste session",
"lastSessionDescription": "Opdateres automatisk med din seneste faneopsætning. Anvend den til at gendanne det, du havde åbent.",
"lastUsed": "Sidst brugt {{time}}",
"neverUsed": "Aldrig anvendt",
"tabsSkipped": "Arbejdsområde anvendt — {{count}} faneblad(er) sprunget over (værten findes ikke længere): {{names}}"
}
}
},
"nav": {
"workspaces": "Arbejdsområder"
},
"onboarding": {
"workflow_workspaces": "Arbejdsområder",
"workflow_workspaces_desc": "Gem et sæt åbne faner, og åbn hele layoutet igen senere."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Arbeitsbereiche",
"saveCurrent": "Aktuellen Stand speichern",
"saveCurrentTitle": "Aktuellen Arbeitsbereich speichern",
"saveCurrentDescription": "Alle geöffneten Tabs, geteilten Layouts und Fensteranordnungen werden als neuer, benannter Arbeitsbereich gespeichert.",
"nameLabel": "Name",
"namePlaceholder": "z. B. Produktions-Debugging",
"nameRequired": "Die Angabe eines Arbeitsbereichsnamens ist erforderlich.",
"colorLabel": "Farbe",
"workspaceCreated": "Arbeitsbereich gespeichert",
"workspaceUpdated": "Arbeitsbereich aktualisiert",
"workspaceDeleted": "Arbeitsbereich gelöscht",
"workspaceDuplicated": "Arbeitsbereich dupliziert",
"saveFailed": "Arbeitsbereich konnte nicht gespeichert werden",
"updateFailed": "Aktualisierung des Arbeitsbereichs fehlgeschlagen",
"deleteFailed": "Arbeitsbereich konnte nicht gelöscht werden",
"duplicateFailed": "Arbeitsbereich konnte nicht dupliziert werden",
"loadFailed": "Arbeitsbereiche konnten nicht geladen werden",
"applyFailed": "Arbeitsbereich konnte nicht angewendet werden",
"deleteWorkspaceTitle": "Arbeitsbereich löschen",
"deleteWorkspaceDescription": "Möchten Sie \"{{name}}\" wirklich löschen? Dies kann nicht rückgängig gemacht werden.",
"noWorkspaces": "Es sind noch keine Arbeitsbereiche gespeichert. Speichern Sie Ihre aktuelle Tab-Anordnung, um loszulegen.",
"tabCount": "{{count}} Tab",
"tabCount_other": "{{count}} Tabs",
"apply": "Anwenden",
"applyConfirmTitle": "Arbeitsbereich anwenden",
"applyConfirmDescription": "Durch Anwenden von \"{{name}}\" werden Ihre aktuellen Tabs geschlossen und durch die gespeicherte Anordnung dieses Arbeitsbereichs ersetzt. Nicht gespeicherte Änderungen an Ihrem aktuellen Layout gehen dabei verloren.",
"applyConfirmButton": "Arbeitsbereich anwenden",
"updateWithCurrent": "Aktualisierung mit aktuellem Stand",
"updateWithCurrentConfirm": "Soll \"{{name}}\" mit Ihrer aktuellen Tab-Anordnung überschrieben werden?",
"rename": "Umbenennen",
"duplicate": "Duplikat",
"duplicateNameSuffix": "{{name}} (Kopie)",
"setDefault": "Als Standard festlegen",
"unsetDefault": "Als Standard entfernen",
"defaultBadge": "Standard",
"lastSession": "Letzte Sitzung",
"lastSessionDescription": "Die Tab-Anordnung wird automatisch aktualisiert. Wenden Sie sie an, um Ihre geöffneten Tabs wiederherzustellen.",
"lastUsed": "Zuletzt verwendet {{time}}",
"neverUsed": "Nie angewendet",
"tabsSkipped": "Arbeitsbereich angewendet — {{count}} Registerkarte(n) übersprungen (Host existiert nicht mehr): {{names}}"
}
}
},
"nav": {
"workspaces": "Arbeitsbereiche"
},
"onboarding": {
"workflow_workspaces": "Arbeitsbereiche",
"workflow_workspaces_desc": "Speichern Sie einen Satz geöffneter Tabs und öffnen Sie das gesamte Layout später wieder."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Χώροι εργασίας",
"saveCurrent": "Αποθήκευση τρέχοντος",
"saveCurrentTitle": "Αποθήκευση τρέχοντος χώρου εργασίας",
"saveCurrentDescription": "Αποθηκεύστε κάθε ανοιχτή καρτέλα, διαιρεμένη διάταξη και διάταξη παραθύρου ως νέο ονομασμένο χώρο εργασίας.",
"nameLabel": "Ονομα",
"namePlaceholder": "π.χ., εντοπισμός σφαλμάτων προϊόντος",
"nameRequired": "Απαιτείται όνομα χώρου εργασίας",
"colorLabel": "Χρώμα",
"workspaceCreated": "Ο χώρος εργασίας αποθηκεύτηκε",
"workspaceUpdated": "Ο χώρος εργασίας ενημερώθηκε",
"workspaceDeleted": "Ο χώρος εργασίας διαγράφηκε",
"workspaceDuplicated": "Ο χώρος εργασίας αντιγράφηκε",
"saveFailed": "Αποτυχία αποθήκευσης χώρου εργασίας",
"updateFailed": "Η ενημέρωση του χώρου εργασίας απέτυχε",
"deleteFailed": "Η διαγραφή του χώρου εργασίας απέτυχε",
"duplicateFailed": "Αποτυχία αντιγραφής χώρου εργασίας",
"loadFailed": "Αποτυχία φόρτωσης χώρων εργασίας",
"applyFailed": "Αποτυχία εφαρμογής χώρου εργασίας",
"deleteWorkspaceTitle": "Διαγραφή χώρου εργασίας",
"deleteWorkspaceDescription": "Είστε σίγουροι ότι θέλετε να διαγράψετε το \"{{name}}\"; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
"noWorkspaces": "Δεν υπάρχουν ακόμη αποθηκευμένοι χώροι εργασίας. Αποθηκεύστε την τρέχουσα διάταξη καρτελών για να ξεκινήσετε.",
"tabCount": "{{count}} καρτέλα",
"tabCount_other": "{{count}} καρτέλες",
"apply": "Εφαρμόζω",
"applyConfirmTitle": "Εφαρμογή χώρου εργασίας",
"applyConfirmDescription": "Η εφαρμογή της συνάρτησης \"{{name}}\" θα κλείσει τις τρέχουσες καρτέλες σας και θα τις αντικαταστήσει με την αποθηκευμένη διάταξη αυτού του χώρου εργασίας. Οι μη αποθηκευμένες αλλαγές στην τρέχουσα διάταξή σας θα χαθούν.",
"applyConfirmButton": "Εφαρμογή χώρου εργασίας",
"updateWithCurrent": "Ενημέρωση με το Τρέχον",
"updateWithCurrentConfirm": "Αντικατάσταση του \"{{name}}\" με την τρέχουσα διάταξη στηλοθετών;",
"rename": "Μετονομάζω",
"duplicate": "Αντίγραφο",
"duplicateNameSuffix": "{{name}} (αντίγραφο)",
"setDefault": "Ορισμός ως προεπιλογή",
"unsetDefault": "Κατάργηση ως προεπιλογή",
"defaultBadge": "Αθέτηση",
"lastSession": "Τελευταία συνεδρία",
"lastSessionDescription": "Ενημερώνεται αυτόματα με την πιο πρόσφατη διάταξη καρτελών. Εφαρμόστε την για να ανακτήσετε ό,τι είχατε ανοιχτό.",
"lastUsed": "Τελευταία χρήση {{time}}",
"neverUsed": "Δεν εφαρμόστηκε ποτέ",
"tabsSkipped": "Εφαρμόστηκε χώρος εργασίας — {{count}} καρτέλα(ες) παραλείφθηκε(οι υποδοχείς δεν υπάρχουν πλέον): {{names}}"
}
}
},
"nav": {
"workspaces": "Χώροι εργασίας"
},
"onboarding": {
"workflow_workspaces": "Χώροι εργασίας",
"workflow_workspaces_desc": "Αποθηκεύστε ένα σύνολο ανοιχτών καρτελών και ανοίξτε ξανά ολόκληρη τη διάταξη αργότερα."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Espacios de trabajo",
"saveCurrent": "Guardar actual",
"saveCurrentTitle": "Guardar espacio de trabajo actual",
"saveCurrentDescription": "Guarda cada pestaña abierta, diseño dividido y disposición de paneles como un nuevo espacio de trabajo con nombre.",
"nameLabel": "Nombre",
"namePlaceholder": "p. ej., depuración de producción",
"nameRequired": "Se requiere el nombre del espacio de trabajo.",
"colorLabel": "Color",
"workspaceCreated": "Espacio de trabajo guardado",
"workspaceUpdated": "Espacio de trabajo actualizado",
"workspaceDeleted": "Espacio de trabajo eliminado",
"workspaceDuplicated": "Espacio de trabajo duplicado",
"saveFailed": "No se pudo guardar el espacio de trabajo",
"updateFailed": "No se pudo actualizar el espacio de trabajo",
"deleteFailed": "No se pudo eliminar el espacio de trabajo",
"duplicateFailed": "Error al duplicar el espacio de trabajo",
"loadFailed": "No se pudieron cargar los espacios de trabajo.",
"applyFailed": "No se pudo aplicar el espacio de trabajo",
"deleteWorkspaceTitle": "Eliminar espacio de trabajo",
"deleteWorkspaceDescription": "¿Estás seguro de que quieres eliminar \"{{name}}\"? Esto no se puede deshacer.",
"noWorkspaces": "Aún no hay espacios de trabajo guardados. Guarda la disposición actual de tus pestañas para empezar.",
"tabCount": "{{count}} pestaña",
"tabCount_other": "{{count}} pestañas",
"apply": "Aplicar",
"applyConfirmTitle": "Aplicar espacio de trabajo",
"applyConfirmDescription": "Al aplicar \"{{name}}\" se cerrarán las pestañas actuales y se reemplazarán con la disposición guardada de este espacio de trabajo. Los cambios no guardados en la disposición actual se perderán.",
"applyConfirmButton": "Aplicar espacio de trabajo",
"updateWithCurrent": "Actualizar con la versión actual",
"updateWithCurrentConfirm": "¿Sobrescribir \"{{name}}\" con tu disposición de tabulación actual?",
"rename": "Rebautizar",
"duplicate": "Duplicado",
"duplicateNameSuffix": "{{name}} (copiar)",
"setDefault": "Establecer como predeterminado",
"unsetDefault": "Eliminar como predeterminado",
"defaultBadge": "Por defecto",
"lastSession": "Última sesión",
"lastSessionDescription": "Se actualiza automáticamente con la última configuración de pestañas. Aplícala para recuperar lo que tenías abierto.",
"lastUsed": "Último uso {{time}}",
"neverUsed": "Nunca se ha aplicado",
"tabsSkipped": "Espacio de trabajo aplicado: {{count}} pestaña(s) omitida(s) (el host ya no existe): {{names}}"
}
}
},
"nav": {
"workspaces": "Espacios de trabajo"
},
"onboarding": {
"workflow_workspaces": "Espacios de trabajo",
"workflow_workspaces_desc": "Guarda un conjunto de pestañas abiertas y vuelve a abrir toda la interfaz más tarde."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Työtilat",
"saveCurrent": "Tallenna nykyinen",
"saveCurrentTitle": "Tallenna nykyinen työtila",
"saveCurrentDescription": "Tallenna jokainen avoin välilehti, jaettu asettelu ja ruutujärjestely uutena nimettynä työtilana.",
"nameLabel": "Nimi",
"namePlaceholder": "esim. Tuotantovirheenkorjaus",
"nameRequired": "Työtilan nimi on pakollinen",
"colorLabel": "Väri",
"workspaceCreated": "Työtila tallennettu",
"workspaceUpdated": "Työtila päivitetty",
"workspaceDeleted": "Työtila poistettu",
"workspaceDuplicated": "Työtila kopioitu",
"saveFailed": "Työtilan tallentaminen epäonnistui",
"updateFailed": "Työtilan päivittäminen epäonnistui",
"deleteFailed": "Työtilan poistaminen epäonnistui",
"duplicateFailed": "Työtilan kopiointi epäonnistui",
"loadFailed": "Työtilojen lataaminen epäonnistui",
"applyFailed": "Työtilan käyttöönotto epäonnistui",
"deleteWorkspaceTitle": "Poista työtila",
"deleteWorkspaceDescription": "Oletko varma, että haluat poistaa \"{{name}}\"? Tätä ei voi perua.",
"noWorkspaces": "Ei vielä tallennettuja työtiloja. Tallenna nykyinen välilehtijärjestys aloittaaksesi.",
"tabCount": "{{count}} -välilehti",
"tabCount_other": "{{count}} välilehdet",
"apply": "Käytä",
"applyConfirmTitle": "Käytä työtilaa",
"applyConfirmDescription": "Komentosarjan \"{{name}}\" käyttäminen sulkee nykyiset välilehdet ja korvaa ne tämän työtilan tallennetulla asettelulla. Nykyiseen asetteluun tehdyt tallentamattomat muutokset menetetään.",
"applyConfirmButton": "Käytä työtilaa",
"updateWithCurrent": "Päivitä nykyisellä",
"updateWithCurrentConfirm": "Korvataanko \"{{name}}\" nykyisellä sarkainjärjestykselläsi?",
"rename": "Nimeä uudelleen",
"duplicate": "Kopio",
"duplicateNameSuffix": "{{name}} (kopio)",
"setDefault": "Aseta oletukseksi",
"unsetDefault": "Poista oletusarvoksi",
"defaultBadge": "Oletus",
"lastSession": "Viimeisin istunto",
"lastSessionDescription": "Päivittyy automaattisesti viimeisimmän välilehtijärjestyksen mukaan. Käytä sitä palauttaaksesi avoimena olleen sisällön.",
"lastUsed": "Viimeksi käytetty {{time}}",
"neverUsed": "Ei koskaan sovellettu",
"tabsSkipped": "Työtilaa käytetty — {{count}} välilehteä ohitettu (isäntä ei enää ole olemassa): {{names}}"
}
}
},
"nav": {
"workspaces": "Työtilat"
},
"onboarding": {
"workflow_workspaces": "Työtilat",
"workflow_workspaces_desc": "Tallenna joukko avoimia välilehtiä ja avaa koko asettelu uudelleen myöhemmin."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Espaces de travail",
"saveCurrent": "Économisez le courant",
"saveCurrentTitle": "Enregistrer l'espace de travail actuel",
"saveCurrentDescription": "Enregistrez chaque onglet ouvert, chaque disposition fractionnée et chaque agencement de volets comme un nouvel espace de travail nommé.",
"nameLabel": "Nom",
"namePlaceholder": "par exemple, le débogage en production",
"nameRequired": "Le nom de l'espace de travail est requis.",
"colorLabel": "Couleur",
"workspaceCreated": "Espace de travail enregistré",
"workspaceUpdated": "Espace de travail mis à jour",
"workspaceDeleted": "Espace de travail supprimé",
"workspaceDuplicated": "Espace de travail dupliqué",
"saveFailed": "Impossible d'enregistrer l'espace de travail",
"updateFailed": "Échec de la mise à jour de l'espace de travail",
"deleteFailed": "Échec de la suppression de l'espace de travail",
"duplicateFailed": "Échec de la duplication de l'espace de travail",
"loadFailed": "Échec du chargement des espaces de travail",
"applyFailed": "Échec de l'application de l'espace de travail",
"deleteWorkspaceTitle": "Supprimer l'espace de travail",
"deleteWorkspaceDescription": "Êtes-vous sûr de vouloir supprimer «{{name}}» ? Cette action est irréversible.",
"noWorkspaces": "Aucun espace de travail enregistré pour le moment. Enregistrez votre disposition d'onglets actuelle pour commencer.",
"tabCount": "{{count}} onglet",
"tabCount_other": "Onglets {{count}}",
"apply": "Appliquer",
"applyConfirmTitle": "Espace de travail à appliquer",
"applyConfirmDescription": "Appliquer «{{name}}» fermera vos onglets actuels et les remplacera par la disposition enregistrée de cet espace de travail. Les modifications non enregistrées de votre disposition actuelle seront perdues.",
"applyConfirmButton": "Espace de travail à appliquer",
"updateWithCurrent": "Mise à jour avec les données actuelles",
"updateWithCurrentConfirm": "Remplacer «{{name}}» par votre disposition de tabulation actuelle ?",
"rename": "Rebaptiser",
"duplicate": "Double",
"duplicateNameSuffix": "{{name}} (copie)",
"setDefault": "Définir comme valeur par défaut",
"unsetDefault": "Supprimer par défaut",
"defaultBadge": "Défaut",
"lastSession": "Dernière session",
"lastSessionDescription": "Mise à jour automatique avec votre dernière configuration d'onglets. Appliquez-la pour retrouver ce que vous aviez ouvert.",
"lastUsed": "Dernière utilisation {{time}}",
"neverUsed": "Jamais postulé",
"tabsSkipped": "Espace de travail appliqué — {{count}} onglet(s) ignoré(s) (l'hôte n'existe plus) : {{names}}"
}
}
},
"nav": {
"workspaces": "Espaces de travail"
},
"onboarding": {
"workflow_workspaces": "Espaces de travail",
"workflow_workspaces_desc": "Enregistrez une série d'onglets ouverts et rouvrez l'ensemble de la mise en page plus tard."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "סביבות עבודה",
"saveCurrent": "שמור את הנוכחי",
"saveCurrentTitle": "שמור סביבת עבודה נוכחית",
"saveCurrentDescription": "שמור כל כרטיסייה פתוחה, פריסה מפוצלת וסידור חלונות כסביבת עבודה חדשה בעלת שם.",
"nameLabel": "שֵׁם",
"namePlaceholder": "לדוגמה, ניפוי באגים בפרודוקציה",
"nameRequired": "נדרש שם סביבת עבודה",
"colorLabel": "צֶבַע",
"workspaceCreated": "סביבת העבודה נשמרה",
"workspaceUpdated": "סביבת העבודה עודכנה",
"workspaceDeleted": "סביבת העבודה נמחקה",
"workspaceDuplicated": "סביבת עבודה משוכפלת",
"saveFailed": "שמירת סביבת העבודה נכשלה",
"updateFailed": "נכשל עדכון סביבת העבודה",
"deleteFailed": "מחיקת סביבת העבודה נכשלה",
"duplicateFailed": "שכפול סביבת העבודה נכשל",
"loadFailed": "טעינת סביבות עבודה נכשלה",
"applyFailed": "נכשל בהחלת סביבת העבודה",
"deleteWorkspaceTitle": "מחיקת סביבת עבודה",
"deleteWorkspaceDescription": "האם אתה בטוח שברצונך למחוק את \"{{name}}\"? לא ניתן לבטל פעולה זו.",
"noWorkspaces": "עדיין לא נשמרו סביבות עבודה. שמור את סידור הכרטיסיות הנוכחי שלך כדי להתחיל.",
"tabCount": "טאב {{count}}",
"tabCount_other": "טאבים {{count}}",
"apply": "לִפְנוֹת",
"applyConfirmTitle": "החלת סביבת עבודה",
"applyConfirmDescription": "החלת \"{{name}}\" תסגור את הכרטיסיות הנוכחיות שלך ותחליף אותן בסידור השמור של סביבת עבודה זו. שינויים שלא נשמרו בפריסה הנוכחית שלך יאבדו.",
"applyConfirmButton": "החלת סביבת עבודה",
"updateWithCurrent": "עדכון עם הנוכחי",
"updateWithCurrentConfirm": "להחליף את \"{{name}}\" עם סידור הטאבים הנוכחי שלך?",
"rename": "שינוי שם",
"duplicate": "לְשַׁכְפֵּל",
"duplicateNameSuffix": "{{name}} (העתק)",
"setDefault": "הגדר כברירת מחדל",
"unsetDefault": "הסר כברירת מחדל",
"defaultBadge": "בְּרִירַת מֶחדָל",
"lastSession": "מושב אחרון",
"lastSessionDescription": "מתעדכן אוטומטית עם סידור הכרטיסיות האחרון שלך. השתמש בו כדי לשחזר את מה שהיה פתוח.",
"lastUsed": "בשימוש אחרון {{time}}",
"neverUsed": "מעולם לא יושם",
"tabsSkipped": "סביבת עבודה הוחלת — דילגו על כרטיסיות {{count}} (המארח כבר לא קיים): {{names}}"
}
}
},
"nav": {
"workspaces": "סביבות עבודה"
},
"onboarding": {
"workflow_workspaces": "סביבות עבודה",
"workflow_workspaces_desc": "שמור קבוצת כרטיסיות פתוחות ופתח מחדש את כל הפריסה מאוחר יותר."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "कार्यस्थानों",
"saveCurrent": "वर्तमान सहेजें",
"saveCurrentTitle": "वर्तमान कार्यक्षेत्र सहेजें",
"saveCurrentDescription": "प्रत्येक खुले टैब, स्प्लिट लेआउट और पेन व्यवस्था को एक नए नाम वाले वर्कस्पेस के रूप में सहेजें।",
"nameLabel": "नाम",
"namePlaceholder": "उदाहरण के लिए, प्रोडक्शन डिबगिंग",
"nameRequired": "कार्यक्षेत्र का नाम आवश्यक है",
"colorLabel": "रंग",
"workspaceCreated": "कार्यक्षेत्र सहेजा गया",
"workspaceUpdated": "कार्यक्षेत्र अपडेट किया गया",
"workspaceDeleted": "कार्यक्षेत्र हटा दिया गया",
"workspaceDuplicated": "कार्यक्षेत्र की प्रतिकृति बनाई गई",
"saveFailed": "कार्यक्षेत्र को सहेजने में विफल",
"updateFailed": "वर्कस्पेस को अपडेट करने में विफल",
"deleteFailed": "वर्कस्पेस को हटाने में विफल",
"duplicateFailed": "वर्कस्पेस को डुप्लिकेट करने में विफल",
"loadFailed": "वर्कस्पेस लोड करने में विफल",
"applyFailed": "कार्यक्षेत्र लागू करने में विफल",
"deleteWorkspaceTitle": "वर्कस्पेस हटाएं",
"deleteWorkspaceDescription": "क्या आप वाकई \"{{name}}\" को हटाना चाहते हैं? इसे पूर्ववत नहीं किया जा सकता।",
"noWorkspaces": "अभी तक कोई वर्कस्पेस सेव नहीं किया गया है। शुरू करने के लिए अपनी वर्तमान टैब व्यवस्था को सेव करें।",
"tabCount": "{{count}} टैब",
"tabCount_other": "{{count}} टैब",
"apply": "आवेदन करना",
"applyConfirmTitle": "वर्कस्पेस लागू करें",
"applyConfirmDescription": "\"{{name}}\" लागू करने से आपके वर्तमान टैब बंद हो जाएंगे और उनकी जगह इस वर्कस्पेस की सहेजी गई व्यवस्था लागू हो जाएगी। आपके वर्तमान लेआउट में किए गए असहयोगी परिवर्तन नष्ट हो जाएंगे।",
"applyConfirmButton": "वर्कस्पेस लागू करें",
"updateWithCurrent": "वर्तमान जानकारी से अपडेट करें",
"updateWithCurrentConfirm": "क्या आप \"{{name}}\" को अपनी वर्तमान टैब व्यवस्था से बदलना चाहेंगे?",
"rename": "नाम बदलें",
"duplicate": "डुप्लिकेट",
"duplicateNameSuffix": "{{name}} (कॉपी)",
"setDefault": "डिफाल्ट के रूप में सेट",
"unsetDefault": "डिफ़ॉल्ट के रूप में हटाएँ",
"defaultBadge": "गलती करना",
"lastSession": "पिछला सत्र",
"lastSessionDescription": "आपके टैब की नवीनतम व्यवस्था के साथ स्वचालित रूप से अपडेट हो जाता है। इसे लागू करके आप अपने खुले हुए टैब को पुनः प्राप्त कर सकते हैं।",
"lastUsed": "अंतिम बार उपयोग किया गया {{time}}",
"neverUsed": "कभी आवेदन नहीं किया",
"tabsSkipped": "कार्यक्षेत्र लागू किया गया — {{count}} टैब छोड़े गए (होस्ट अब मौजूद नहीं है): {{names}}"
}
}
},
"nav": {
"workspaces": "कार्यस्थानों"
},
"onboarding": {
"workflow_workspaces": "कार्यस्थानों",
"workflow_workspaces_desc": "खुले हुए टैबों के एक सेट को सेव करें और बाद में पूरे लेआउट को दोबारा खोलें।"
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Munkaterületek",
"saveCurrent": "Aktuális mentése",
"saveCurrentTitle": "Aktuális munkaterület mentése",
"saveCurrentDescription": "Minden megnyitott lapot, osztott elrendezést és panelelrendezést mentsen el új, elnevezett munkaterületként.",
"nameLabel": "Név",
"namePlaceholder": "pl., Prod Debugging",
"nameRequired": "Munkaterület neve kötelező",
"colorLabel": "Szín",
"workspaceCreated": "Munkaterület mentve",
"workspaceUpdated": "Munkaterület frissítve",
"workspaceDeleted": "Munkaterület törölve",
"workspaceDuplicated": "Munkaterület duplikálva",
"saveFailed": "Nem sikerült menteni a munkaterületet",
"updateFailed": "Nem sikerült frissíteni a munkaterületet",
"deleteFailed": "Nem sikerült törölni a munkaterületet",
"duplicateFailed": "Nem sikerült a munkaterületet másolni",
"loadFailed": "Nem sikerült betölteni a munkaterületeket",
"applyFailed": "Nem sikerült alkalmazni a munkaterületet",
"deleteWorkspaceTitle": "Munkaterület törlése",
"deleteWorkspaceDescription": "Biztosan törölni szeretnéd a(z) \"{{name}}\" fájlt? Ez a művelet nem vonható vissza.",
"noWorkspaces": "Még nincsenek mentett munkaterületek. A kezdéshez mentse el az aktuális tabulátorelrendezést.",
"tabCount": "{{count}} fül",
"tabCount_other": "{{count}} fülek",
"apply": "Jelentkezés",
"applyConfirmTitle": "Munkaterület alkalmazása",
"applyConfirmDescription": "A(z) „{{name}}” parancs alkalmazása bezárja az aktuális lapokat, és lecseréli azokat a munkaterület mentett elrendezésére. Az aktuális elrendezés nem mentett módosításai elvesznek.",
"applyConfirmButton": "Munkaterület alkalmazása",
"updateWithCurrent": "Frissítés az aktuális programmal",
"updateWithCurrentConfirm": "Felülírja a(z) \"{{name}}\" szöveget a jelenlegi tabulátorelrendezéssel?",
"rename": "Átnevezés",
"duplicate": "Másolat",
"duplicateNameSuffix": "{{name}} (másolat)",
"setDefault": "Beállítás alapértelmezettként",
"unsetDefault": "Eltávolítás alapértelmezettként",
"defaultBadge": "Alapértelmezett",
"lastSession": "Utolsó munkamenet",
"lastSessionDescription": "Automatikusan frissül a legutóbbi tabulátorelrendezéssel. Alkalmazd, hogy visszaállítsd a megnyitott tabulátorokat.",
"lastUsed": "Utolsó használat {{time}}",
"neverUsed": "Soha nem alkalmazták",
"tabsSkipped": "Munkaterület alkalmazva — {{count}} tabulátor(ok) kihagyva (a gazdagép már nem létezik): {{names}}"
}
}
},
"nav": {
"workspaces": "Munkaterületek"
},
"onboarding": {
"workflow_workspaces": "Munkaterületek",
"workflow_workspaces_desc": "Mentse el a megnyitott lapok egy készletét, és később nyissa meg újra a teljes elrendezést."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Ruang kerja",
"saveCurrent": "Simpan Saat Ini",
"saveCurrentTitle": "Simpan Ruang Kerja Saat Ini",
"saveCurrentDescription": "Simpan setiap tab yang terbuka, tata letak terpisah, dan susunan panel sebagai ruang kerja baru yang diberi nama.",
"nameLabel": "Nama",
"namePlaceholder": "misalnya, Debugging Produksi",
"nameRequired": "Nama ruang kerja wajib diisi.",
"colorLabel": "Warna",
"workspaceCreated": "Ruang kerja tersimpan",
"workspaceUpdated": "Ruang kerja diperbarui",
"workspaceDeleted": "Ruang kerja dihapus",
"workspaceDuplicated": "Ruang kerja diduplikasi",
"saveFailed": "Gagal menyimpan ruang kerja",
"updateFailed": "Gagal memperbarui ruang kerja",
"deleteFailed": "Gagal menghapus ruang kerja.",
"duplicateFailed": "Gagal menduplikasi ruang kerja.",
"loadFailed": "Gagal memuat ruang kerja",
"applyFailed": "Gagal menerapkan ruang kerja",
"deleteWorkspaceTitle": "Hapus Ruang Kerja",
"deleteWorkspaceDescription": "Apakah Anda yakin ingin menghapus \"{{name}}\"? Tindakan ini tidak dapat dibatalkan.",
"noWorkspaces": "Belum ada ruang kerja yang tersimpan. Simpan susunan tab Anda saat ini untuk memulai.",
"tabCount": "{{count}} tab",
"tabCount_other": "{{count}} tab",
"apply": "Menerapkan",
"applyConfirmTitle": "Terapkan Ruang Kerja",
"applyConfirmDescription": "Menerapkan \"{{name}}\" akan menutup tab Anda saat ini dan menggantinya dengan susunan yang tersimpan di ruang kerja ini. Perubahan yang belum disimpan pada tata letak Anda saat ini akan hilang.",
"applyConfirmButton": "Terapkan Ruang Kerja",
"updateWithCurrent": "Perbarui dengan yang Terbaru",
"updateWithCurrentConfirm": "Timpa \"{{name}}\" dengan susunan tab Anda saat ini?",
"rename": "Ganti nama",
"duplicate": "Duplikat",
"duplicateNameSuffix": "{{name}} (salinan)",
"setDefault": "Tetapkan sebagai Default",
"unsetDefault": "Hapus sebagai Default",
"defaultBadge": "Bawaan",
"lastSession": "Sesi Terakhir",
"lastSessionDescription": "Diperbarui secara otomatis dengan susunan tab terbaru Anda. Terapkan untuk memulihkan tab yang sebelumnya Anda buka.",
"lastUsed": "Terakhir digunakan {{time}}",
"neverUsed": "Tidak pernah melamar",
"tabsSkipped": "Ruang kerja diterapkan — {{count}} tab dilewati (host tidak lagi ada): {{names}}"
}
}
},
"nav": {
"workspaces": "Ruang kerja"
},
"onboarding": {
"workflow_workspaces": "Ruang kerja",
"workflow_workspaces_desc": "Simpan sekumpulan tab yang terbuka dan buka kembali seluruh tata letak nanti."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Spazi di lavoro",
"saveCurrent": "Salva corrente",
"saveCurrentTitle": "Salva l'area di lavoro corrente",
"saveCurrentDescription": "Salva ogni scheda aperta, layout diviso e disposizione dei riquadri come nuova area di lavoro denominata.",
"nameLabel": "Nome",
"namePlaceholder": "ad esempio, Debugging di produzione",
"nameRequired": "Il nome dell'area di lavoro è obbligatorio",
"colorLabel": "Colore",
"workspaceCreated": "Area di lavoro salvata",
"workspaceUpdated": "Area di lavoro aggiornata",
"workspaceDeleted": "Area di lavoro eliminata",
"workspaceDuplicated": "Area di lavoro duplicata",
"saveFailed": "Impossibile salvare l'area di lavoro",
"updateFailed": "Impossibile aggiornare l'area di lavoro",
"deleteFailed": "Impossibile eliminare l'area di lavoro",
"duplicateFailed": "Impossibile duplicare l'area di lavoro",
"loadFailed": "Impossibile caricare gli spazi di lavoro",
"applyFailed": "Impossibile applicare l'area di lavoro",
"deleteWorkspaceTitle": "Elimina l'area di lavoro",
"deleteWorkspaceDescription": "Sei sicuro di voler eliminare \"{{name}}\"? Questa operazione non può essere annullata.",
"noWorkspaces": "Nessun spazio di lavoro salvato al momento. Salva la disposizione attuale delle schede per iniziare.",
"tabCount": "{{count}} tab",
"tabCount_other": "{{count}} schede",
"apply": "Fare domanda a",
"applyConfirmTitle": "Applica l'area di lavoro",
"applyConfirmDescription": "Applicando \"{{name}}\" chiuderai le schede correnti e le sostituirai con la disposizione salvata di quest'area di lavoro. Le modifiche non salvate al layout corrente andranno perse.",
"applyConfirmButton": "Applica l'area di lavoro",
"updateWithCurrent": "Aggiorna con la versione attuale",
"updateWithCurrentConfirm": "Sovrascrivi \"{{name}}\" con la tua attuale disposizione delle schede?",
"rename": "Rinominare",
"duplicate": "Duplicato",
"duplicateNameSuffix": "{{name}} (copia)",
"setDefault": "Imposta come predefinito",
"unsetDefault": "Rimuovi come predefinito",
"defaultBadge": "Predefinito",
"lastSession": "Ultima sessione",
"lastSessionDescription": "Si aggiorna automaticamente con la disposizione delle schede più recente. Applicala per ripristinare quelle che avevi aperte.",
"lastUsed": "Ultimo utilizzo {{time}}",
"neverUsed": "mai applicato",
"tabsSkipped": "Area di lavoro applicata — {{count}} scheda(e) saltata(e) (l'host non esiste più): {{names}}"
}
}
},
"nav": {
"workspaces": "Spazi di lavoro"
},
"onboarding": {
"workflow_workspaces": "Spazi di lavoro",
"workflow_workspaces_desc": "Salva le schede aperte e riapri l'intero layout in seguito."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "ワークスペース",
"saveCurrent": "現在の状態を保存",
"saveCurrentTitle": "現在のワークスペースを保存",
"saveCurrentDescription": "開いているすべてのタブ、分割レイアウト、ペイン配置を、新しい名前付きワークスペースとして保存します。",
"nameLabel": "名前",
"namePlaceholder": "例:本番環境のデバッグ",
"nameRequired": "ワークスペース名は必須です。",
"colorLabel": "色",
"workspaceCreated": "ワークスペースが保存されました",
"workspaceUpdated": "ワークスペースが更新されました",
"workspaceDeleted": "ワークスペースが削除されました",
"workspaceDuplicated": "ワークスペースが複製されました",
"saveFailed": "ワークスペースの保存に失敗しました",
"updateFailed": "ワークスペースの更新に失敗しました",
"deleteFailed": "ワークスペースの削除に失敗しました",
"duplicateFailed": "ワークスペースの複製に失敗しました",
"loadFailed": "ワークスペースの読み込みに失敗しました",
"applyFailed": "ワークスペースの適用に失敗しました",
"deleteWorkspaceTitle": "ワークスペースを削除",
"deleteWorkspaceDescription": "「{{name}}」を削除してもよろしいですか?この操作は元に戻せません。",
"noWorkspaces": "まだワークスペースが保存されていません。まずは現在のタブの配置を保存してください。",
"tabCount": "{{count}} タブ",
"tabCount_other": "{{count}} タブ",
"apply": "適用する",
"applyConfirmTitle": "ワークスペースを適用する",
"applyConfirmDescription": "\"{{name}}\" を適用すると、現在のタブが閉じられ、このワークスペースに保存されているレイアウトに置き換えられます。現在のレイアウトに対する未保存の変更は失われます。",
"applyConfirmButton": "ワークスペースを適用する",
"updateWithCurrent": "最新情報に更新",
"updateWithCurrentConfirm": "「{{name}}」を現在のタブ配列で上書きしますか?",
"rename": "名前を変更する",
"duplicate": "重複",
"duplicateNameSuffix": "{{name}} (コピー)",
"setDefault": "デフォルトとして設定",
"unsetDefault": "デフォルトから削除",
"defaultBadge": "デフォルト",
"lastSession": "最終セッション",
"lastSessionDescription": "最新のタブ配置に合わせて自動的に更新されます。適用すると、以前開いていたウィンドウが復元されます。",
"lastUsed": "最後に使用されたのは {{time}} です。",
"neverUsed": "一度も応募したことがない",
"tabsSkipped": "ワークスペースが適用されました — {{count}} タブがスキップされました (ホストが存在しなくなりました): {{names}}"
}
}
},
"nav": {
"workspaces": "ワークスペース"
},
"onboarding": {
"workflow_workspaces": "ワークスペース",
"workflow_workspaces_desc": "開いているタブのセットを保存し、後でレイアウト全体を再度開くことができます。"
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "작업 공간",
"saveCurrent": "현재 저장",
"saveCurrentTitle": "현재 작업 공간 저장",
"saveCurrentDescription": "열려 있는 모든 탭, 분할 레이아웃 및 창 배열을 새 이름의 작업 공간으로 저장합니다.",
"nameLabel": "이름",
"namePlaceholder": "예: 프로덕션 디버깅",
"nameRequired": "워크스페이스 이름은 필수 입력 사항입니다.",
"colorLabel": "색상",
"workspaceCreated": "작업 공간이 저장되었습니다",
"workspaceUpdated": "작업 공간이 업데이트되었습니다.",
"workspaceDeleted": "작업 공간이 삭제되었습니다",
"workspaceDuplicated": "작업 공간이 복제되었습니다",
"saveFailed": "작업 공간 저장에 실패했습니다",
"updateFailed": "워크스페이스 업데이트에 실패했습니다.",
"deleteFailed": "워크스페이스 삭제에 실패했습니다.",
"duplicateFailed": "워크스페이스 복제에 실패했습니다.",
"loadFailed": "워크스페이스를 불러오는 데 실패했습니다.",
"applyFailed": "워크스페이스 적용에 실패했습니다",
"deleteWorkspaceTitle": "작업 공간 삭제",
"deleteWorkspaceDescription": "\"{{name}}\"을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"noWorkspaces": "아직 저장된 작업 공간이 없습니다. 시작하려면 현재 탭 구성을 저장하세요.",
"tabCount": "{{count}} 탭",
"tabCount_other": "{{count}} 탭",
"apply": "적용하다",
"applyConfirmTitle": "작업 공간 적용",
"applyConfirmDescription": "\"{{name}}\"를 입력하면 현재 탭이 닫히고 이 작업 공간에 저장된 레이아웃으로 바뀝니다. 현재 레이아웃에 대한 저장되지 않은 변경 사항은 손실됩니다.",
"applyConfirmButton": "작업 공간 적용",
"updateWithCurrent": "현재 정보로 업데이트",
"updateWithCurrentConfirm": "현재 탭 배열로 \"{{name}}\"를 덮어쓰시겠습니까?",
"rename": "이름 변경",
"duplicate": "복제하다",
"duplicateNameSuffix": "{{name}} (복사)",
"setDefault": "기본값으로 설정",
"unsetDefault": "기본값에서 제거",
"defaultBadge": "기본",
"lastSession": "지난 세션",
"lastSessionDescription": "최근 탭 배열로 자동 업데이트됩니다. 적용하면 이전에 열려 있던 탭을 복구할 수 있습니다.",
"lastUsed": "마지막으로 사용된 값 {{time}}",
"neverUsed": "지원한 적 없음",
"tabsSkipped": "워크스페이스 적용됨 — {{count}} 탭 건너뛰기(호스트가 더 이상 존재하지 않음): {{names}}"
}
}
},
"nav": {
"workspaces": "작업 공간"
},
"onboarding": {
"workflow_workspaces": "작업 공간",
"workflow_workspaces_desc": "열려 있는 탭들을 저장해두었다가 나중에 전체 레이아웃을 다시 열어보세요."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Werkruimtes",
"saveCurrent": "Huidige opslaan",
"saveCurrentTitle": "Huidige werkruimte opslaan",
"saveCurrentDescription": "Sla elk geopend tabblad, elke gesplitste lay-out en elke vensterindeling op als een nieuwe, benoemde werkruimte.",
"nameLabel": "Naam",
"namePlaceholder": "bijvoorbeeld, productiedebugging",
"nameRequired": "De naam van de werkruimte is verplicht.",
"colorLabel": "Kleur",
"workspaceCreated": "Werkruimte opgeslagen",
"workspaceUpdated": "Werkruimte bijgewerkt",
"workspaceDeleted": "Werkruimte verwijderd",
"workspaceDuplicated": "Werkruimte gedupliceerd",
"saveFailed": "Het opslaan van de werkruimte is mislukt.",
"updateFailed": "Het bijwerken van de werkruimte is mislukt.",
"deleteFailed": "Het verwijderen van de werkruimte is mislukt.",
"duplicateFailed": "Het dupliceren van de werkruimte is mislukt.",
"loadFailed": "Het laden van de werkruimtes is mislukt.",
"applyFailed": "Het toepassen van de werkruimte is mislukt.",
"deleteWorkspaceTitle": "Werkruimte verwijderen",
"deleteWorkspaceDescription": "Weet je zeker dat je \"{{name}}\" wilt verwijderen? Dit kan niet ongedaan gemaakt worden.",
"noWorkspaces": "Er zijn nog geen werkruimtes opgeslagen. Sla je huidige tabbladindeling op om te beginnen.",
"tabCount": "{{count}} tab",
"tabCount_other": "{{count}} tabs",
"apply": "Toepassen",
"applyConfirmTitle": "Werkruimte toepassen",
"applyConfirmDescription": "Door \"{{name}}\" toe te passen, worden uw huidige tabbladen gesloten en vervangen door de opgeslagen indeling van deze werkruimte. Niet-opgeslagen wijzigingen in uw huidige lay-out gaan verloren.",
"applyConfirmButton": "Werkruimte toepassen",
"updateWithCurrent": "Update met de huidige",
"updateWithCurrentConfirm": "Wil je \"{{name}}\" overschrijven met je huidige tabindeling?",
"rename": "Naam wijzigen",
"duplicate": "Duplicaat",
"duplicateNameSuffix": "{{name}} (kopiëren)",
"setDefault": "Instellen als standaard",
"unsetDefault": "Verwijderen als standaard",
"defaultBadge": "Standaard",
"lastSession": "Laatste sessie",
"lastSessionDescription": "Wordt automatisch bijgewerkt met uw meest recente tabbladindeling. Gebruik deze instelling om uw geopende tabbladen te herstellen.",
"lastUsed": "Laatst gebruikt {{time}}",
"neverUsed": "Nooit gesolliciteerd",
"tabsSkipped": "Werkruimte toegepast — {{count}} tabblad(en) overgeslagen (host bestaat niet meer): {{names}}"
}
}
},
"nav": {
"workspaces": "Werkruimtes"
},
"onboarding": {
"workflow_workspaces": "Werkruimtes",
"workflow_workspaces_desc": "Sla een set geopende tabbladen op en open de volledige lay-out later opnieuw."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Arbeidsområder",
"saveCurrent": "Lagre gjeldende",
"saveCurrentTitle": "Lagre gjeldende arbeidsområde",
"saveCurrentDescription": "Lagre alle åpne faner, delte oppsett og ruteoppsett som et nytt navngitt arbeidsområde.",
"nameLabel": "Navn",
"namePlaceholder": "f.eks. produktfeilsøking",
"nameRequired": "Arbeidsområdenavn er obligatorisk",
"colorLabel": "Farge",
"workspaceCreated": "Arbeidsområdet er lagret",
"workspaceUpdated": "Arbeidsområdet er oppdatert",
"workspaceDeleted": "Arbeidsområdet er slettet",
"workspaceDuplicated": "Arbeidsområdet er duplisert",
"saveFailed": "Kunne ikke lagre arbeidsområdet",
"updateFailed": "Kunne ikke oppdatere arbeidsområdet",
"deleteFailed": "Kunne ikke slette arbeidsområdet",
"duplicateFailed": "Kunne ikke duplisere arbeidsområdet",
"loadFailed": "Kunne ikke laste inn arbeidsområder",
"applyFailed": "Kunne ikke bruke arbeidsområdet",
"deleteWorkspaceTitle": "Slett arbeidsområde",
"deleteWorkspaceDescription": "Er du sikker på at du vil slette «{{name}}»? Dette kan ikke angres.",
"noWorkspaces": "Ingen lagrede arbeidsområder ennå. Lagre den nåværende faneoppsettet for å komme i gang.",
"tabCount": "{{count}} fane",
"tabCount_other": "{{count}} faner",
"apply": "Søke",
"applyConfirmTitle": "Bruk arbeidsområde",
"applyConfirmDescription": "Hvis du bruker «{{name}}», lukkes de nåværende fanene dine og erstattes med den lagrede plasseringen i dette arbeidsområdet. Ulagrede endringer i den nåværende layouten vil gå tapt.",
"applyConfirmButton": "Bruk arbeidsområde",
"updateWithCurrent": "Oppdater med gjeldende",
"updateWithCurrentConfirm": "Vil du overskrive «{{name}}» med din nåværende tabulatorordning?",
"rename": "Gi nytt navn",
"duplicate": "Kopiere",
"duplicateNameSuffix": "{{name}} (kopi)",
"setDefault": "Angi som standard",
"unsetDefault": "Fjern som standard",
"defaultBadge": "Misligholde",
"lastSession": "Siste økt",
"lastSessionDescription": "Oppdateres automatisk med den nyeste faneoppsettet ditt. Bruk det for å gjenopprette det du hadde åpent.",
"lastUsed": "Sist brukt {{time}}",
"neverUsed": "Aldri brukt",
"tabsSkipped": "Arbeidsområde brukt — {{count}} fane(r) hoppet over (verten finnes ikke lenger): {{names}}"
}
}
},
"nav": {
"workspaces": "Arbeidsområder"
},
"onboarding": {
"workflow_workspaces": "Arbeidsområder",
"workflow_workspaces_desc": "Lagre et sett med åpne faner og åpne hele layouten på nytt senere."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Obszary robocze",
"saveCurrent": "Zapisz bieżące",
"saveCurrentTitle": "Zapisz bieżący obszar roboczy",
"saveCurrentDescription": "Zapisz każdą otwartą kartę, podzielony układ i rozmieszczenie paneli jako nowy nazwany obszar roboczy.",
"nameLabel": "Nazwa",
"namePlaceholder": "np. Debugowanie produkcji",
"nameRequired": "Nazwa obszaru roboczego jest wymagana",
"colorLabel": "Kolor",
"workspaceCreated": "Zapisano obszar roboczy",
"workspaceUpdated": "Zaktualizowano obszar roboczy",
"workspaceDeleted": "Usunięto obszar roboczy",
"workspaceDuplicated": "Zduplikowano obszar roboczy",
"saveFailed": "Nie udało się zapisać obszaru roboczego",
"updateFailed": "Nie udało się zaktualizować obszaru roboczego",
"deleteFailed": "Nie udało się usunąć obszaru roboczego",
"duplicateFailed": "Nie udało się zduplikować obszaru roboczego",
"loadFailed": "Nie udało się załadować obszarów roboczych",
"applyFailed": "Nie udało się zastosować obszaru roboczego",
"deleteWorkspaceTitle": "Usuń obszar roboczy",
"deleteWorkspaceDescription": "Czy na pewno chcesz usunąć „{{name}}”? Tego nie można cofnąć.",
"noWorkspaces": "Brak zapisanych obszarów roboczych. Zapisz aktualny układ kart, aby rozpocząć.",
"tabCount": "{{count}} karta",
"tabCount_other": "{{count}} karty",
"apply": "Zastosuj",
"applyConfirmTitle": "Zastosuj obszar roboczy",
"applyConfirmDescription": "Zastosowanie „{{name}}” zamknie bieżące karty i zastąpi je układem zapisanym w tym obszarze roboczym. Niezapisane zmiany bieżącego układu zostaną utracone.",
"applyConfirmButton": "Zastosuj obszar roboczy",
"updateWithCurrent": "Zaktualizuj bieżącym",
"updateWithCurrentConfirm": "Nadpisać „{{name}}” obecnym układem kart?",
"rename": "Zmień nazwę",
"duplicate": "Duplikuj",
"duplicateNameSuffix": "{{name}} (kopia)",
"setDefault": "Ustaw jako domyślne",
"unsetDefault": "Usuń jako domyślne",
"defaultBadge": "Domyślny",
"lastSession": "Ostatnia sesja",
"lastSessionDescription": "Automatycznie aktualizowany o najnowszy układ kart. Zastosuj go, aby przywrócić to, co było otwarte.",
"lastUsed": "Ostatnio użyte {{time}}",
"neverUsed": "Nigdy nie zastosowano",
"tabsSkipped": "Zastosowano obszar roboczy, pominięto {{count}} kart (host już nie istnieje): {{names}}"
}
}
},
"nav": {
"workspaces": "Obszary robocze"
},
"onboarding": {
"workflow_workspaces": "Obszary robocze",
"workflow_workspaces_desc": "Zapisz zestaw otwartych kart i otwórz cały układ później."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Espaços de trabalho",
"saveCurrent": "Salvar atual",
"saveCurrentTitle": "Salvar espaço de trabalho atual",
"saveCurrentDescription": "Salve cada aba aberta, layout dividido e disposição de painéis como um novo espaço de trabalho nomeado.",
"nameLabel": "Nome",
"namePlaceholder": "Exemplo: Depuração de Produção",
"nameRequired": "É obrigatório dar um nome ao espaço de trabalho.",
"colorLabel": "Cor",
"workspaceCreated": "Espaço de trabalho salvo",
"workspaceUpdated": "Espaço de trabalho atualizado",
"workspaceDeleted": "Espaço de trabalho excluído",
"workspaceDuplicated": "Espaço de trabalho duplicado",
"saveFailed": "Falha ao salvar o espaço de trabalho",
"updateFailed": "Falha ao atualizar o espaço de trabalho",
"deleteFailed": "Falha ao excluir o espaço de trabalho",
"duplicateFailed": "Falha ao duplicar o espaço de trabalho",
"loadFailed": "Falha ao carregar os espaços de trabalho.",
"applyFailed": "Falha ao aplicar o espaço de trabalho",
"deleteWorkspaceTitle": "Excluir espaço de trabalho",
"deleteWorkspaceDescription": "Tem certeza de que deseja excluir \"{{name}}\"? Esta ação não pode ser desfeita.",
"noWorkspaces": "Ainda não há espaços de trabalho salvos. Salve sua configuração atual de abas para começar.",
"tabCount": "{{count}} aba",
"tabCount_other": "{{count}} abas",
"apply": "Aplicar",
"applyConfirmTitle": "Aplicar Espaço de Trabalho",
"applyConfirmDescription": "Aplicar \"{{name}}\" fechará suas abas atuais e as substituirá pela configuração salva deste espaço de trabalho. Alterações não salvas no seu layout atual serão perdidas.",
"applyConfirmButton": "Aplicar Espaço de Trabalho",
"updateWithCurrent": "Atualizar com as informações atuais",
"updateWithCurrentConfirm": "Substituir \"{{name}}\" pela sua configuração de tabulação atual?",
"rename": "Renomear",
"duplicate": "Duplicado",
"duplicateNameSuffix": "{{name}} (copiar)",
"setDefault": "Definir como padrão",
"unsetDefault": "Remover como padrão",
"defaultBadge": "Padrão",
"lastSession": "Última sessão",
"lastSessionDescription": "Atualizado automaticamente com a sua última configuração de abas. Aplique para recuperar o que estava aberto.",
"lastUsed": "Última utilização {{time}}",
"neverUsed": "Nunca aplicado",
"tabsSkipped": "Espaço de trabalho aplicado — {{count}} guia(s) ignorada(s) (o host não existe mais): {{names}}"
}
}
},
"nav": {
"workspaces": "Espaços de trabalho"
},
"onboarding": {
"workflow_workspaces": "Espaços de trabalho",
"workflow_workspaces_desc": "Salve um conjunto de abas abertas e reabra todo o layout mais tarde."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Espaços de trabalho",
"saveCurrent": "Guardar atual",
"saveCurrentTitle": "Guardar espaço de trabalho atual",
"saveCurrentDescription": "Guarde cada separador aberto, layout dividido e disposição de painéis como um novo espaço de trabalho nomeado.",
"nameLabel": "Nome",
"namePlaceholder": "Exemplo: Depuração de Produção",
"nameRequired": "É obrigatório dar um nome ao espaço de trabalho.",
"colorLabel": "Cor",
"workspaceCreated": "Espaço de trabalho guardado",
"workspaceUpdated": "Espaço de trabalho atualizado",
"workspaceDeleted": "Espaço de trabalho excluído",
"workspaceDuplicated": "Espaço de trabalho duplicado",
"saveFailed": "Falha ao guardar o espaço de trabalho",
"updateFailed": "Falha ao atualizar o espaço de trabalho",
"deleteFailed": "Falha ao eliminar o espaço de trabalho",
"duplicateFailed": "Falha ao duplicar o espaço de trabalho",
"loadFailed": "Falha ao carregar os espaços de trabalho.",
"applyFailed": "Falha ao aplicar o espaço de trabalho",
"deleteWorkspaceTitle": "Apagar espaço de trabalho",
"deleteWorkspaceDescription": "Tem a certeza que pretende eliminar \"{{name}}\"? Esta ação não pode ser anulada.",
"noWorkspaces": "Ainda não há espaços de trabalho guardados. Guarde a sua configuração atual de separadores para começar.",
"tabCount": "{{count}} separador",
"tabCount_other": "{{count}} separadores",
"apply": "Candidatar-se",
"applyConfirmTitle": "Aplicar Espaço de Trabalho",
"applyConfirmDescription": "Aplicar \"{{name}}\" fechará os seus separadores atuais e substituí-los-á pela configuração guardada deste espaço de trabalho. As alterações não guardadas no seu layout atual serão perdidas.",
"applyConfirmButton": "Aplicar Espaço de Trabalho",
"updateWithCurrent": "Atualizar com as informações atuais",
"updateWithCurrentConfirm": "Substituir \"{{name}}\" pela sua configuração de tabulação atual?",
"rename": "Renomear",
"duplicate": "Duplicado",
"duplicateNameSuffix": "{{name}} (copiar)",
"setDefault": "Definir como padrão",
"unsetDefault": "Remover como padrão",
"defaultBadge": "Predefinição",
"lastSession": "Última sessão",
"lastSessionDescription": "Atualizado automaticamente com a sua última configuração de separadores. Aplique para recuperar o que estava aberto.",
"lastUsed": "Última utilização {{time}}",
"neverUsed": "Nunca aplicado",
"tabsSkipped": "Espaço de trabalho aplicado — {{count}} separador(es) ignorado(s) (o host já não existe): {{names}}"
}
}
},
"nav": {
"workspaces": "Espaços de trabalho"
},
"onboarding": {
"workflow_workspaces": "Espaços de trabalho",
"workflow_workspaces_desc": "Guarde um conjunto de separadores abertos e reabra todo o layout mais tarde."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Spații de lucru",
"saveCurrent": "Salvați curentul",
"saveCurrentTitle": "Salvați spațiul de lucru curent",
"saveCurrentDescription": "Salvați fiecare filă deschisă, aspect divizat și aranjament de panouri ca un spațiu de lucru nou denumit.",
"nameLabel": "Nume",
"namePlaceholder": "de exemplu, Depanare produs",
"nameRequired": "Numele spațiului de lucru este obligatoriu",
"colorLabel": "Culoare",
"workspaceCreated": "Spațiul de lucru a fost salvat",
"workspaceUpdated": "Spațiul de lucru a fost actualizat",
"workspaceDeleted": "Spațiul de lucru a fost șters",
"workspaceDuplicated": "Spațiul de lucru a fost duplicat",
"saveFailed": "Spațiul de lucru nu a putut fi salvat",
"updateFailed": "Spațiul de lucru nu a putut fi actualizat",
"deleteFailed": "Nu s-a putut șterge spațiul de lucru",
"duplicateFailed": "Spațiul de lucru nu a putut fi duplicat",
"loadFailed": "Nu s-au putut încărca spațiile de lucru",
"applyFailed": "Nu s-a putut aplica spațiul de lucru",
"deleteWorkspaceTitle": "Ștergeți spațiul de lucru",
"deleteWorkspaceDescription": "Sigur vrei să ștergi „{{name}}”? Această acțiune nu poate fi anulată.",
"noWorkspaces": "Încă nu există spații de lucru salvate. Salvați aranjamentul actual al filelor pentru a începe.",
"tabCount": "fila {{count}}",
"tabCount_other": "{{count}} tab-uri",
"apply": "Aplică",
"applyConfirmTitle": "Aplicați spațiul de lucru",
"applyConfirmDescription": "Aplicarea comenzii „{{name}}” va închide filele curente și le va înlocui cu aranjamentul salvat al acestui spațiu de lucru. Modificările nesalvate ale aspectului curent se vor pierde.",
"applyConfirmButton": "Aplicați spațiul de lucru",
"updateWithCurrent": "Actualizare cu curent",
"updateWithCurrentConfirm": "Suprascrieți „{{name}}” cu aranjamentul actual al tabulatorilor?",
"rename": "Redenumire",
"duplicate": "Duplicat",
"duplicateNameSuffix": "{{name}} (copie)",
"setDefault": "Setare ca implicită",
"unsetDefault": "Eliminare ca implicită",
"defaultBadge": "Implicit",
"lastSession": "Ultima sesiune",
"lastSessionDescription": "Actualizat automat cu cea mai recentă aranjare a filelor. Aplică-l pentru a recupera ce aveai deschis.",
"lastUsed": "Ultima utilizare {{time}}",
"neverUsed": "Niciodată aplicat",
"tabsSkipped": "Spațiu de lucru aplicat — {{count}} filă(e) omisă (gazda nu mai există): {{names}}"
}
}
},
"nav": {
"workspaces": "Spații de lucru"
},
"onboarding": {
"workflow_workspaces": "Spații de lucru",
"workflow_workspaces_desc": "Salvați un set de file deschise și redeschideți întregul aspect mai târziu."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Рабочие места",
"saveCurrent": "Сохранить текущий",
"saveCurrentTitle": "Сохранить текущее рабочее пространство",
"saveCurrentDescription": "Сохраните все открытые вкладки, разделенные окна и расположение панелей в виде новых именованных рабочих областей.",
"nameLabel": "Имя",
"namePlaceholder": "например, отладка в рабочей среде.",
"nameRequired": "Название рабочей области обязательно для ввода.",
"colorLabel": "Цвет",
"workspaceCreated": "Рабочее пространство сохранено",
"workspaceUpdated": "Рабочее пространство обновлено",
"workspaceDeleted": "Рабочее пространство удалено",
"workspaceDuplicated": "Рабочее пространство дублировано",
"saveFailed": "Не удалось сохранить рабочее пространство.",
"updateFailed": "Не удалось обновить рабочее пространство.",
"deleteFailed": "Не удалось удалить рабочее пространство.",
"duplicateFailed": "Не удалось создать дубликат рабочего пространства.",
"loadFailed": "Не удалось загрузить рабочие пространства.",
"applyFailed": "Не удалось применить рабочее пространство",
"deleteWorkspaceTitle": "Удалить рабочее пространство",
"deleteWorkspaceDescription": "Вы уверены, что хотите удалить \"{{name}}\"? Это действие необратимо.",
"noWorkspaces": "Пока нет сохраненных рабочих пространств. Сохраните текущее расположение вкладок, чтобы начать работу.",
"tabCount": "{{count}} вкладка",
"tabCount_other": "{{count}} вкладки",
"apply": "Применять",
"applyConfirmTitle": "Применить рабочее пространство",
"applyConfirmDescription": "Применение \"{{name}}\" закроет текущие вкладки и заменит их сохраненным расположением элементов в этом рабочем пространстве. Несохраненные изменения текущего расположения будут потеряны.",
"applyConfirmButton": "Применить рабочее пространство",
"updateWithCurrent": "Обновить с учетом текущих изменений",
"updateWithCurrentConfirm": "Заменить \"{{name}}\" на текущую компоновку вкладок?",
"rename": "Переименовать",
"duplicate": "Дубликат",
"duplicateNameSuffix": "{{name}} (копия)",
"setDefault": "Установить как значение по умолчанию",
"unsetDefault": "Удалить как значение по умолчанию",
"defaultBadge": "По умолчанию",
"lastSession": "Последняя сессия",
"lastSessionDescription": "Автоматическое обновление с учетом вашего последнего расположения вкладок. Примените изменения, чтобы восстановить открытые ранее вкладки.",
"lastUsed": "Последнее использование {{time}}",
"neverUsed": "Никогда не подавал заявку",
"tabsSkipped": "Рабочая область применена — {{count}} вкладки пропущены (хост больше не существует): {{names}}"
}
}
},
"nav": {
"workspaces": "Рабочие места"
},
"onboarding": {
"workflow_workspaces": "Рабочие места",
"workflow_workspaces_desc": "Сохраните набор открытых вкладок и откройте весь интерфейс позже."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Радни простори",
"saveCurrent": "Сачувај тренутно",
"saveCurrentTitle": "Сачувај тренутни радни простор",
"saveCurrentDescription": "Сачувајте сваку отворену картицу, подељени распоред и распоред окна као нови именовани радни простор.",
"nameLabel": "Име",
"namePlaceholder": "нпр. Отклањање грешака у производном систему",
"nameRequired": "Назив радног простора је обавезан",
"colorLabel": "Боја",
"workspaceCreated": "Радни простор сачуван",
"workspaceUpdated": "Радни простор је ажуриран",
"workspaceDeleted": "Радни простор је обрисан",
"workspaceDuplicated": "Радни простор је дуплиран",
"saveFailed": "Чување радног простора није успело",
"updateFailed": "Ажурирање радног простора није успело",
"deleteFailed": "Брисање радног простора није успело",
"duplicateFailed": "Дуплирање радног простора није успело",
"loadFailed": "Учитавање радних простора није успело",
"applyFailed": "Примена радног простора није успела",
"deleteWorkspaceTitle": "Обриши радни простор",
"deleteWorkspaceDescription": "Да ли сте сигурни да желите да обришете „{{name}}“? Ова радња се не може поништити.",
"noWorkspaces": "Још увек нема сачуваних радних простора. Сачувајте тренутни распоред картица да бисте започели.",
"tabCount": "{{count}} картица",
"tabCount_other": "{{count}} картице",
"apply": "Примени",
"applyConfirmTitle": "Примени радни простор",
"applyConfirmDescription": "Применом „{{name}}“ затворићете тренутне картице и заменити их сачуваним распоредом овог радног простора. Несачуване измене тренутног распореда биће изгубљене.",
"applyConfirmButton": "Примени радни простор",
"updateWithCurrent": "Ажурирај са Тренутним",
"updateWithCurrentConfirm": "Преписати „{{name}}“ тренутним распоредом табулатора?",
"rename": "Преименуј",
"duplicate": "Дупликат",
"duplicateNameSuffix": "{{name}} (копија)",
"setDefault": "Постави као подразумевано",
"unsetDefault": "Уклони као подразумевано",
"defaultBadge": "Подразумевано",
"lastSession": "Последња сесија",
"lastSessionDescription": "Аутоматски се ажурира са вашим најновијим распоредом картица. Примените га да бисте вратили оно што сте имали отворено.",
"lastUsed": "Последња употреба {{time}}",
"neverUsed": "Никада примењено",
"tabsSkipped": "Примењен радни простор — {{count}} прескочених картица (хост више не постоји): {{names}}"
}
}
},
"nav": {
"workspaces": "Радни простори"
},
"onboarding": {
"workflow_workspaces": "Радни простори",
"workflow_workspaces_desc": "Сачувајте скуп отворених картица и поново отворите цео распоред касније."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Arbetsytor",
"saveCurrent": "Spara aktuell",
"saveCurrentTitle": "Spara aktuell arbetsyta",
"saveCurrentDescription": "Spara alla öppna flikar, delade layouter och rutorrangemang som en ny namngiven arbetsyta.",
"nameLabel": "Namn",
"namePlaceholder": "t.ex. produktfelsökning",
"nameRequired": "Arbetsytans namn krävs",
"colorLabel": "Färg",
"workspaceCreated": "Arbetsytan sparad",
"workspaceUpdated": "Arbetsytan uppdaterad",
"workspaceDeleted": "Arbetsytan raderad",
"workspaceDuplicated": "Arbetsyta duplicerad",
"saveFailed": "Kunde inte spara arbetsytan",
"updateFailed": "Misslyckades med att uppdatera arbetsytan",
"deleteFailed": "Misslyckades med att ta bort arbetsytan",
"duplicateFailed": "Misslyckades med att duplicera arbetsytan",
"loadFailed": "Misslyckades med att läsa in arbetsytor",
"applyFailed": "Kunde inte tillämpa arbetsytan",
"deleteWorkspaceTitle": "Ta bort arbetsyta",
"deleteWorkspaceDescription": "Är du säker på att du vill ta bort \"{{name}}\"? Detta kan inte ångras.",
"noWorkspaces": "Inga sparade arbetsytor ännu. Spara din nuvarande flikstruktur för att komma igång.",
"tabCount": "{{count}} flik",
"tabCount_other": "{{count}} flikar",
"apply": "Tillämpas",
"applyConfirmTitle": "Använd arbetsyta",
"applyConfirmDescription": "Om du använder \"{{name}}\" stängs dina nuvarande flikar och ersätts med den här arbetsytans sparade layout. Osparade ändringar i din nuvarande layout kommer att gå förlorade.",
"applyConfirmButton": "Använd arbetsyta",
"updateWithCurrent": "Uppdatera med aktuellt",
"updateWithCurrentConfirm": "Skriv över \"{{name}}\" med din nuvarande tabulering?",
"rename": "Döpa om",
"duplicate": "Duplicera",
"duplicateNameSuffix": "{{name}} (kopiera)",
"setDefault": "Ange som standard",
"unsetDefault": "Ta bort som standard",
"defaultBadge": "Standard",
"lastSession": "Senaste sessionen",
"lastSessionDescription": "Uppdateras automatiskt med din senaste flikstruktur. Använd den för att återställa det du hade öppet.",
"lastUsed": "Senast använd {{time}}",
"neverUsed": "Aldrig tillämpad",
"tabsSkipped": "Arbetsyta tillämpad — {{count}} flik(kar) hoppade över (värden finns inte längre): {{names}}"
}
}
},
"nav": {
"workspaces": "Arbetsytor"
},
"onboarding": {
"workflow_workspaces": "Arbetsytor",
"workflow_workspaces_desc": "Spara en uppsättning öppna flikar och öppna hela layouten igen senare."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "พื้นที่ทำงาน",
"saveCurrent": "บันทึกปัจจุบัน",
"saveCurrentTitle": "บันทึกพื้นที่ทำงานปัจจุบัน",
"saveCurrentDescription": "บันทึกแท็บที่เปิดอยู่ทั้งหมด รูปแบบการแบ่งหน้าจอ และการจัดเรียงบานหน้าต่างทั้งหมดเป็นพื้นที่ทำงานใหม่ที่มีชื่อ",
"nameLabel": "ชื่อ",
"namePlaceholder": "เช่น การดีบักผลิตภัณฑ์",
"nameRequired": "จำเป็นต้องระบุชื่อพื้นที่ทำงาน",
"colorLabel": "สี",
"workspaceCreated": "พื้นที่ทำงานได้รับการบันทึกแล้ว",
"workspaceUpdated": "พื้นที่ทำงานได้รับการอัปเดตแล้ว",
"workspaceDeleted": "พื้นที่ทำงานถูกลบแล้ว",
"workspaceDuplicated": "พื้นที่ทำงานถูกทำซ้ำ",
"saveFailed": "ไม่สามารถบันทึกพื้นที่ทำงานได้",
"updateFailed": "ไม่สามารถอัปเดตพื้นที่ทำงานได้",
"deleteFailed": "ไม่สามารถลบพื้นที่ทำงานได้",
"duplicateFailed": "ไม่สามารถคัดลอกพื้นที่ทำงานได้",
"loadFailed": "ไม่สามารถโหลดพื้นที่ทำงานได้",
"applyFailed": "ไม่สามารถใช้งานพื้นที่ทำงานได้",
"deleteWorkspaceTitle": "ลบพื้นที่ทำงาน",
"deleteWorkspaceDescription": "คุณแน่ใจหรือไม่ว่าต้องการลบ \"{{name}}\"? การดำเนินการนี้ไม่สามารถย้อนกลับได้",
"noWorkspaces": "ยังไม่ได้บันทึกพื้นที่ทำงานใดๆ บันทึกการจัดเรียงแท็บปัจจุบันของคุณเพื่อเริ่มต้นใช้งาน",
"tabCount": "{{count}} แท็บ",
"tabCount_other": "{{count}} แท็บ",
"apply": "นำมาใช้",
"applyConfirmTitle": "ใช้พื้นที่ทำงาน",
"applyConfirmDescription": "การใช้ \"{{name}}\" จะปิดแท็บปัจจุบันของคุณและแทนที่ด้วยการจัดเรียงที่บันทึกไว้ของพื้นที่ทำงานนี้ การเปลี่ยนแปลงที่ยังไม่ได้บันทึกในเค้าโครงปัจจุบันของคุณจะหายไป",
"applyConfirmButton": "ใช้พื้นที่ทำงาน",
"updateWithCurrent": "อัปเดตด้วยข้อมูลปัจจุบัน",
"updateWithCurrentConfirm": "เขียนทับ \"{{name}}\" ด้วยการจัดเรียงแท็บปัจจุบันของคุณหรือไม่?",
"rename": "เปลี่ยนชื่อ",
"duplicate": "ทำซ้ำ",
"duplicateNameSuffix": "{{name}} (คัดลอก)",
"setDefault": "ตั้งเป็นค่าเริ่มต้น",
"unsetDefault": "ลบออกเป็นค่าเริ่มต้น",
"defaultBadge": "ค่าเริ่มต้น",
"lastSession": "เซสชั่นสุดท้าย",
"lastSessionDescription": "ระบบจะอัปเดตการจัดเรียงแท็บล่าสุดของคุณโดยอัตโนมัติ ใช้เพื่อกู้คืนแท็บที่คุณเปิดไว้ก่อนหน้านี้",
"lastUsed": "ใช้งานครั้งล่าสุด {{time}}",
"neverUsed": "ไม่เคยสมัคร",
"tabsSkipped": "พื้นที่ทำงานถูกใช้งานแล้ว — ข้ามแท็บ {{count}} แท็บ (โฮสต์ไม่มีอยู่แล้ว): {{names}}"
}
}
},
"nav": {
"workspaces": "พื้นที่ทำงาน"
},
"onboarding": {
"workflow_workspaces": "พื้นที่ทำงาน",
"workflow_workspaces_desc": "บันทึกชุดแท็บที่เปิดอยู่ แล้วเปิดเค้าโครงทั้งหมดอีกครั้งในภายหลัง"
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Çalışma Alanları",
"saveCurrent": "Mevcut Olanı Kaydet",
"saveCurrentTitle": "Geçerli Çalışma Alanını Kaydet",
"saveCurrentDescription": "Açık olan her sekmeyi, bölünmüş düzeni ve bölme düzenini yeni bir adlandırılmış çalışma alanı olarak kaydedin.",
"nameLabel": "İsim",
"namePlaceholder": "Örneğin, Üretim Hata Ayıklaması",
"nameRequired": "Çalışma alanı adı zorunludur.",
"colorLabel": "Renk",
"workspaceCreated": "Çalışma alanı kaydedildi.",
"workspaceUpdated": "Çalışma alanı güncellendi.",
"workspaceDeleted": "Çalışma alanı silindi",
"workspaceDuplicated": "Çalışma alanı kopyalandı",
"saveFailed": "Çalışma alanını kaydetme başarısız oldu.",
"updateFailed": "Çalışma alanını güncelleme başarısız oldu.",
"deleteFailed": "Çalışma alanını silme işlemi başarısız oldu.",
"duplicateFailed": "Çalışma alanını çoğaltma başarısız oldu.",
"loadFailed": "Çalışma alanları yüklenemedi.",
"applyFailed": "Çalışma alanı uygulanamadı.",
"deleteWorkspaceTitle": "Çalışma Alanını Sil",
"deleteWorkspaceDescription": "\"{{name}}\" öğesini silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.",
"noWorkspaces": "Henüz kaydedilmiş çalışma alanı yok. Başlamak için mevcut sekme düzeninizi kaydedin.",
"tabCount": "{{count}} sekmesi",
"tabCount_other": "{{count}} sekmeler",
"apply": "Uygula",
"applyConfirmTitle": "Çalışma Alanına Başvur",
"applyConfirmDescription": "\"{{name}}\" komutunu uygulamak, mevcut sekmelerinizi kapatacak ve bunların yerine bu çalışma alanının kaydedilmiş düzenini getirecektir. Mevcut düzeninizde yapılan kaydedilmemiş değişiklikler kaybolacaktır.",
"applyConfirmButton": "Çalışma Alanına Başvur",
"updateWithCurrent": "Güncel bilgilerle güncelleyin",
"updateWithCurrentConfirm": "\"{{name}}\" ifadesini mevcut sekme düzeninizle değiştirin mi?",
"rename": "Yeniden isimlendirmek",
"duplicate": "Kopyalamak",
"duplicateNameSuffix": "{{name}} (kopyala)",
"setDefault": "Varsayılan olarak ayarla",
"unsetDefault": "Varsayılan ayarı kaldır",
"defaultBadge": "Varsayılan",
"lastSession": "Son Oturum",
"lastSessionDescription": "En son sekme düzeninize göre otomatik olarak güncellenir. Açık olan uygulamalarınızı geri yüklemek için uygulayın.",
"lastUsed": "Son kullanım {{time}}",
"neverUsed": "Hiç başvurmadım",
"tabsSkipped": "Çalışma alanı uygulandı — {{count}} sekme atlandı (ana bilgisayar artık mevcut değil): {{names}}"
}
}
},
"nav": {
"workspaces": "Çalışma Alanları"
},
"onboarding": {
"workflow_workspaces": "Çalışma Alanları",
"workflow_workspaces_desc": "Açık sekmeleri kaydedin ve daha sonra tüm düzeni yeniden açın."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Робочі простори",
"saveCurrent": "Зберегти поточний",
"saveCurrentTitle": "Зберегти поточну робочу область",
"saveCurrentDescription": "Збережіть кожну відкриту вкладку, розділений макет та розташування панелей як нове іменоване робоче середовище.",
"nameLabel": "Ім'я",
"namePlaceholder": "наприклад, налагодження продукту",
"nameRequired": "Потрібно вказати назву робочої області",
"colorLabel": "Колір",
"workspaceCreated": "Робочу область збережено",
"workspaceUpdated": "Робочу область оновлено",
"workspaceDeleted": "Робочу область видалено",
"workspaceDuplicated": "Робочу область продубльовано",
"saveFailed": "Не вдалося зберегти робочу область",
"updateFailed": "Не вдалося оновити робочу область",
"deleteFailed": "Не вдалося видалити робочу область",
"duplicateFailed": "Не вдалося дублювати робочу область",
"loadFailed": "Не вдалося завантажити робочі області",
"applyFailed": "Не вдалося застосувати робочу область",
"deleteWorkspaceTitle": "Видалити робочу область",
"deleteWorkspaceDescription": "Ви впевнені, що хочете видалити \"{{name}}\"? Цю дію неможливо скасувати.",
"noWorkspaces": "Поки що немає збережених робочих областей. Збережіть поточне розташування вкладок, щоб розпочати.",
"tabCount": "вкладка {{count}}",
"tabCount_other": "{{count}} вкладок",
"apply": "Застосувати",
"applyConfirmTitle": "Застосувати робочу область",
"applyConfirmDescription": "Застосування \"{{name}}\" закриє ваші поточні вкладки та замінить їх збереженим розташуванням цього робочого простору. Незбережені зміни до вашого поточного макета будуть втрачені.",
"applyConfirmButton": "Застосувати робочу область",
"updateWithCurrent": "Оновити за допомогою поточного",
"updateWithCurrentConfirm": "Перезаписати \"{{name}}\" поточним розташуванням табуляцій?",
"rename": "Перейменувати",
"duplicate": "Дублікат",
"duplicateNameSuffix": "{{name}} (копія)",
"setDefault": "Встановити за замовчуванням",
"unsetDefault": "Видалити як за замовчуванням",
"defaultBadge": "За замовчуванням",
"lastSession": "Остання сесія",
"lastSessionDescription": "Автоматично оновлюється з урахуванням останнього розташування вкладок. Застосуйте це, щоб відновити те, що було відкрито.",
"lastUsed": "Востаннє використовувалося {{time}}",
"neverUsed": "Ніколи не застосовувався",
"tabsSkipped": "Робочий простір застосовано — пропущено {{count}} вкладок (хост більше не існує): {{names}}"
}
}
},
"nav": {
"workspaces": "Робочі простори"
},
"onboarding": {
"workflow_workspaces": "Робочі простори",
"workflow_workspaces_desc": "Збережіть набір відкритих вкладок і знову відкрийте весь макет пізніше."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "Không gian làm việc",
"saveCurrent": "Lưu hiện tại",
"saveCurrentTitle": "Lưu không gian làm việc hiện tại",
"saveCurrentDescription": "Lưu tất cả các tab đang mở, bố cục chia màn hình và cách sắp xếp khung cửa sổ dưới dạng một không gian làm việc mới có tên.",
"nameLabel": "Tên",
"namePlaceholder": "Ví dụ: Gỡ lỗi sản phẩm",
"nameRequired": "Tên không gian làm việc là bắt buộc",
"colorLabel": "Màu sắc",
"workspaceCreated": "Không gian làm việc đã được lưu",
"workspaceUpdated": "Không gian làm việc đã được cập nhật",
"workspaceDeleted": "Không gian làm việc đã bị xóa",
"workspaceDuplicated": "Không gian làm việc được sao chép",
"saveFailed": "Không thể lưu không gian làm việc",
"updateFailed": "Không thể cập nhật không gian làm việc",
"deleteFailed": "Không thể xóa không gian làm việc",
"duplicateFailed": "Không thể sao chép không gian làm việc",
"loadFailed": "Không thể tải không gian làm việc",
"applyFailed": "Không thể áp dụng không gian làm việc",
"deleteWorkspaceTitle": "Xóa không gian làm việc",
"deleteWorkspaceDescription": "Bạn có chắc chắn muốn xóa \"{{name}}\" không? Thao tác này không thể hoàn tác.",
"noWorkspaces": "Chưa có không gian làm việc nào được lưu. Hãy lưu cách bố trí tab hiện tại của bạn để bắt đầu.",
"tabCount": "{{count}} tab",
"tabCount_other": "{{count}} tab",
"apply": "Áp dụng",
"applyConfirmTitle": "Áp dụng Không gian làm việc",
"applyConfirmDescription": "Áp dụng \"{{name}}\" sẽ đóng các tab hiện tại của bạn và thay thế chúng bằng bố cục đã lưu của không gian làm việc này. Các thay đổi chưa được lưu đối với bố cục hiện tại của bạn sẽ bị mất.",
"applyConfirmButton": "Áp dụng Không gian làm việc",
"updateWithCurrent": "Cập nhật với thông tin hiện tại",
"updateWithCurrentConfirm": "Bạn có muốn ghi đè \"{{name}}\" bằng cách sắp xếp tab hiện tại của mình không?",
"rename": "Đổi tên",
"duplicate": "Nhân bản",
"duplicateNameSuffix": "{{name}} (copy)",
"setDefault": "Đặt làm mặc định",
"unsetDefault": "Xóa khỏi danh sách mặc định",
"defaultBadge": "Mặc định",
"lastSession": "Phiên cuối cùng",
"lastSessionDescription": "Tự động cập nhật với cách sắp xếp tab gần đây nhất của bạn. Áp dụng để khôi phục các tab bạn đã mở trước đó.",
"lastUsed": "Lần sử dụng cuối cùng {{time}}",
"neverUsed": "Chưa từng ứng tuyển",
"tabsSkipped": "Không gian làm việc đã được áp dụng — {{count}} tab đã bị bỏ qua (máy chủ không còn tồn tại): {{names}}"
}
}
},
"nav": {
"workspaces": "Không gian làm việc"
},
"onboarding": {
"workflow_workspaces": "Không gian làm việc",
"workflow_workspaces_desc": "Lưu lại một nhóm các tab đang mở và mở lại toàn bộ bố cục sau."
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "工作区",
"saveCurrent": "保存当前",
"saveCurrentTitle": "保存当前工作区",
"saveCurrentDescription": "将所有打开的标签页、拆分布局和窗格排列保存为一个新的命名工作区。",
"nameLabel": "名称",
"namePlaceholder": "例如,生产环境调试",
"nameRequired": "工作区名称为必填项",
"colorLabel": "颜色",
"workspaceCreated": "工作区已保存",
"workspaceUpdated": "工作区已更新",
"workspaceDeleted": "工作区已删除",
"workspaceDuplicated": "工作区已复制",
"saveFailed": "保存工作区失败",
"updateFailed": "工作区更新失败",
"deleteFailed": "删除工作区失败",
"duplicateFailed": "复制工作区失败",
"loadFailed": "加载工作区失败",
"applyFailed": "应用工作区失败",
"deleteWorkspaceTitle": "删除工作区",
"deleteWorkspaceDescription": "您确定要删除“{{name}}”吗?此操作无法撤销。",
"noWorkspaces": "尚未保存任何工作区。请保存您当前的标签页排列方式以开始使用。",
"tabCount": "{{count}} 个标签页",
"tabCount_other": "{{count}} 个标签页",
"apply": "应用",
"applyConfirmTitle": "应用工作区",
"applyConfirmDescription": "应用“{{name}}”将关闭您当前的标签页,并将其替换为此工作区已保存的布局。您对当前布局的未保存更改将会丢失。",
"applyConfirmButton": "应用工作区",
"updateWithCurrent": "更新至当前版本",
"updateWithCurrentConfirm": "用您当前的标签页排列覆盖“{{name}}”?",
"rename": "重命名",
"duplicate": "复制",
"duplicateNameSuffix": "{{name}}(副本)",
"setDefault": "设置为默认值",
"unsetDefault": "移除默认设置",
"defaultBadge": "默认",
"lastSession": "上次会话",
"lastSessionDescription": "自动更新至您最近的标签页排列方式。应用此操作即可恢复您之前打开的标签页。",
"lastUsed": "上次使用 {{time}}",
"neverUsed": "从未应用过",
"tabsSkipped": "已应用工作区 — 跳过 {{count}} 个标签页(主机已不存在): {{names}}"
}
}
},
"nav": {
"workspaces": "工作区"
},
"onboarding": {
"workflow_workspaces": "工作区",
"workflow_workspaces_desc": "保存当前打开的标签页组合,方便之后一键恢复整个布局。"
}
}
@@ -0,0 +1,55 @@
{
"newUi": {
"sidebar": {
"workspaces": {
"title": "工作區",
"saveCurrent": "儲存目前",
"saveCurrentTitle": "儲存目前工作區",
"saveCurrentDescription": "將所有開啟的標籤頁、分割版面配置和窗格排列儲存為一個新的命名工作區。",
"nameLabel": "姓名",
"namePlaceholder": "例如,生產環境調試",
"nameRequired": "工作區名稱為必填項",
"colorLabel": "顏色",
"workspaceCreated": "工作區已儲存",
"workspaceUpdated": "工作區已更新",
"workspaceDeleted": "工作區已刪除",
"workspaceDuplicated": "工作區已複製",
"saveFailed": "保存工作區失敗",
"updateFailed": "工作區更新失敗",
"deleteFailed": "刪除工作區失敗",
"duplicateFailed": "複製工作區失敗",
"loadFailed": "載入工作區失敗",
"applyFailed": "應用工作區失敗",
"deleteWorkspaceTitle": "刪除工作區",
"deleteWorkspaceDescription": "您確定要刪除「{{name}}」嗎?此操作無法撤銷。",
"noWorkspaces": "尚未保存任何工作區。請儲存您目前的標籤頁排列方式以開始使用。",
"tabCount": "{{count}} 選項卡",
"tabCount_other": "{{count}} 標籤",
"apply": "申請",
"applyConfirmTitle": "應用工作區",
"applyConfirmDescription": "應用「{{name}}」將關閉您目前的標籤頁,並將其替換為此工作區已儲存的佈局。您對目前佈局的未儲存變更將會遺失。",
"applyConfirmButton": "應用工作區",
"updateWithCurrent": "更新至目前版本",
"updateWithCurrentConfirm": "用您目前的製表符排列覆蓋“{{name}}”?",
"rename": "重新命名",
"duplicate": "複製",
"duplicateNameSuffix": "{{name}} (複製)",
"setDefault": "設定為預設值",
"unsetDefault": "移除預設設定",
"defaultBadge": "預設",
"lastSession": "上次會議",
"lastSessionDescription": "自動更新至您最近的標籤頁排列方式。應用此操作即可恢復您先前開啟的標籤頁。",
"lastUsed": "上次使用 {{time}}",
"neverUsed": "從未申請過",
"tabsSkipped": "已應用工作區 — 跳過 {{count}} 個標籤頁(主機已不存在): {{names}}"
}
}
},
"nav": {
"workspaces": "工作區"
},
"onboarding": {
"workflow_workspaces": "工作區",
"workflow_workspaces_desc": "儲存一組開啟的標籤頁,稍後重新開啟整個佈局。"
}
}
+10 -1
View File
@@ -16,5 +16,14 @@
},
"capabilities": ["db:own", "network:serve", "ui:surface"],
"locales": "locales",
"platforms": ["linux", "win32", "darwin"]
"platforms": ["linux", "win32", "darwin"],
"contributes": {
"panels": [
{
"id": "workspaces",
"titleKey": "nav.workspaces",
"icon": "LayoutTemplate"
}
]
}
}
@@ -1,6 +1,6 @@
import { getErrorMessage } from "@/lib/error-message.js";
import { useState, useEffect, useCallback, useRef } from "react";
import { useTranslation } from "react-i18next";
import { useTranslation } from "@termix/plugin-sdk/frontend";
import { toast } from "sonner";
import {
LayoutTemplate,
-34
View File
@@ -1,34 +0,0 @@
/**
* Frontend half of the workspaces plugin.
*
* WorkspacesPanel is a left-sidebar railView panel (opened from the rail,
* not a Tab), the same shape as FleetsPanel/HostsPanel/CredentialsPanel.
* None of those go through registerRailItem/registerTabComponent either --
* per src/ui/shell/pluginLoader.ts's own comment, a rail-view panel like
* this is rendered directly by AppShell.tsx rather than registered at
* runtime. WorkspacesPanel is reached today through a direct relative
* import in AppShell.tsx (../../plugins/workspaces/frontend/WorkspacesPanel),
* not through register() below.
*
* register()/unregister() still follow the same shape every other plugin's
* frontend entry does, so this is ready the moment a real frontend plugin
* loader exists -- see plugins/ssh-terminal/frontend/index.mjs and
* src/ui/tests/sidebar/plugin-extension-seam.test.tsx, which says outright
* "there is no plugin loader yet".
*/
export const id = "workspaces";
export const railViewId = "workspaces";
export async function register({ registerRailItem, icons }) {
registerRailItem?.({
id: railViewId,
icon: icons.LayoutTemplate,
labelKey: "nav.workspaces",
separatorAfter: true,
});
}
export async function unregister({ unregisterRailItem }) {
unregisterRailItem?.(railViewId);
}
+95
View File
@@ -0,0 +1,95 @@
import { LayoutTemplate } from "lucide-react";
import i18next from "i18next";
import { toast } from "sonner";
import type { PanelProps, TermixApp } from "@termix/plugin-sdk/frontend";
import type { Workspace, WorkspacePayload } from "@/types/ui-types";
import { WorkspacesPanel } from "./WorkspacesPanel";
import {
applyWorkspaceServer,
listWorkspaces,
saveLastSessionWorkspace,
} from "./workspaces-api";
const LAST_SESSION_DELAY_MS = 2000;
export function activate(app: TermixApp): void {
const applyWorkspace = async (workspace: Workspace) => {
const { skipped } = await app.tabs.applyLayout(
workspace.payload as unknown as Parameters<
typeof app.tabs.applyLayout
>[0],
{ name: workspace.name },
);
if (skipped.length > 0) {
toast.warning(
i18next.t("workspaces:newUi.sidebar.workspaces.tabsSkipped", {
count: skipped.length,
names: skipped.join(", "),
}),
);
}
applyWorkspaceServer(workspace.id).catch(() => {});
};
function Panel({ active }: PanelProps) {
return (
<div className="flex-1 min-h-0 overflow-y-auto">
<WorkspacesPanel
active={active}
currentPayload={() =>
app.tabs.getLayout() as unknown as WorkspacePayload
}
onApplyWorkspace={(workspace) => void applyWorkspace(workspace)}
/>
</div>
);
}
app.registerRailItem({
id: "workspaces",
icon: LayoutTemplate,
titleKey: "nav.workspaces",
after: "split-screen",
});
app.registerPanel("workspaces", Panel);
// After login, a default workspace applies unless the session already
// brought tabs back, which is the more precise restore.
app.tabs.onReady(() => {
const layout = app.tabs.getLayout() as unknown as WorkspacePayload | null;
if (layout && layout.tabs.length > 0) return;
listWorkspaces()
.then((workspaces) => {
const preferred = workspaces.find(
(workspace) => workspace.kind === "manual" && workspace.isDefault,
);
if (preferred) void applyWorkspace(preferred);
})
.catch(() => {});
});
// Keeps an implicit "last session" snapshot current, so an arrangement can
// always be recovered even if it was never saved.
let timer: ReturnType<typeof setTimeout> | null = null;
app.tabs.onChange(() => {
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
const layout = app.tabs.getLayout();
if (layout) {
saveLastSessionWorkspace(layout as unknown as WorkspacePayload).catch(
() => {},
);
}
}, LAST_SESSION_DELAY_MS);
});
app.onDispose(() => {
if (timer) clearTimeout(timer);
});
app.registerSlotContribution("onboarding.workflow", {
actionId: "workspaces.tip",
titleKey: "onboarding.workflow_workspaces",
descriptionKey: "onboarding.workflow_workspaces_desc",
icon: LayoutTemplate,
});
}
@@ -1,163 +0,0 @@
import type {
Host,
Tab,
TabType,
WorkspacePayload,
WorkspaceTabSnapshot,
} from "@/types/ui-types";
// "dashboard" is deliberately excluded: AppShell always keeps a dashboard
// tab alive as the fallback when every other tab closes, so it isn't a
// meaningful part of a saved arrangement and shouldn't count toward
// tabCount or be reopened on apply.
export const WORKSPACE_CAPTURABLE_TYPES: TabType[] = [
"terminal",
"rdp",
"vnc",
"telnet",
"host-metrics",
"proxmox-stats",
"files",
"docker",
"tunnel",
"network_graph",
"tmux_monitor",
"serial",
"homepage",
"fleet-inventory",
"termix-id",
"session-logs",
"snippets",
"macros",
"history",
"ssh-tools",
"automations",
"ai",
];
export const HOSTLESS_WORKSPACE_TAB_TYPES: TabType[] = [
"tunnel",
"network_graph",
"tmux_monitor",
"homepage",
"fleet-inventory",
"docker",
"termix-id",
"session-logs",
"snippets",
"macros",
"history",
"ssh-tools",
"automations",
"ai",
];
function createWorkspaceSlotId(): string {
if (typeof globalThis.crypto?.randomUUID === "function") {
return globalThis.crypto.randomUUID();
}
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}-${Math.random().toString(36).slice(2)}`;
}
/**
* Maps live tabs to WorkspaceTabSnapshots, generating a fresh slotId per tab.
* slotId is a stable key within the saved payload, distinct from Tab.id
* (which is regenerated every time a tab is opened).
*/
export function buildWorkspaceTabSnapshots(
tabs: Tab[],
genSlotId: () => string = createWorkspaceSlotId,
): { snapshots: WorkspaceTabSnapshot[]; slotIdByTabId: Map<string, string> } {
const capturable = tabs.filter((t) =>
WORKSPACE_CAPTURABLE_TYPES.includes(t.type),
);
const slotIdByTabId = new Map(capturable.map((t) => [t.id, genSlotId()]));
const snapshots: WorkspaceTabSnapshot[] = capturable.map((t) => ({
slotId: slotIdByTabId.get(t.id)!,
type: t.type,
hostSyncId: t.type === "serial" ? null : (t.host?.syncId ?? null),
hostNameSnapshot: t.host?.name ?? null,
label: t.label,
customLabel: t.customLabel,
initialFilePath: t.initialFilePath,
initialPath: t.initialPath,
fleetId: t.fleetId,
serialConfig: t.type === "serial" ? t.serialConfig : undefined,
}));
return { snapshots, slotIdByTabId };
}
/** Remaps a slotId-keyed array (paneTabIds shape) to live tab ids via a slotId->tabId map. */
export function remapSlotIds(
slotIds: (string | null)[],
slotIdToTabId: Map<string, string>,
): (string | null)[] {
return slotIds.map((slotId) =>
slotId != null ? (slotIdToTabId.get(slotId) ?? null) : null,
);
}
/**
* Resolves how to (re)open a single workspace-payload tab on apply.
*
* "singleton" covers every rail-singleton tab type (dashboard/tunnel/docker/
* etc.) whether or not a host was resolved for it - these always go through
* openSingletonTab, which accepts an optional preselected host. "host" is
* for genuinely per-host tab types (terminal/rdp/files/...), which always
* need a resolved host to open at all.
*/
export function resolveWorkspaceTabTarget(
snapshot: WorkspaceTabSnapshot,
allHosts: Host[],
):
| { kind: "serial" }
| { kind: "singleton"; host?: Host }
| { kind: "host"; host: Host }
| { kind: "skip" } {
if (snapshot.type === "serial") {
return snapshot.serialConfig ? { kind: "serial" } : { kind: "skip" };
}
let host: Host | undefined;
if (snapshot.hostSyncId) {
host = allHosts.find((h) => h.syncId === snapshot.hostSyncId);
if (!host) return { kind: "skip" };
}
if (HOSTLESS_WORKSPACE_TAB_TYPES.includes(snapshot.type)) {
return { kind: "singleton", host };
}
return host ? { kind: "host", host } : { kind: "skip" };
}
export function buildWorkspacePayload(input: {
tabs: Tab[];
activeTabId: string;
splitMode: WorkspacePayload["splitMode"];
paneTabIds: (string | null)[];
rowSizes: number[];
rowColSizes: number[][];
genSlotId?: () => string;
sidebar?: WorkspacePayload["sidebar"];
}): WorkspacePayload {
const { snapshots, slotIdByTabId } = buildWorkspaceTabSnapshots(
input.tabs,
input.genSlotId,
);
return {
version: 1,
tabs: snapshots,
activeSlotId: slotIdByTabId.get(input.activeTabId) ?? null,
splitMode: input.splitMode,
paneTabIds: input.paneTabIds.map((tabId) =>
tabId != null ? (slotIdByTabId.get(tabId) ?? null) : null,
),
rowSizes: input.rowSizes,
rowColSizes: input.rowColSizes,
...(input.sidebar ? { sidebar: input.sidebar } : {}),
};
}
@@ -0,0 +1,53 @@
import { afterEach, describe, expect, it } from "vitest";
import {
renderWithApp,
type RenderedPluginApp,
} from "@termix/plugin-sdk/testing";
import type { PluginManifest } from "@termix/plugin-sdk/manifest";
import * as plugin from "../../src/frontend/index";
import manifestJson from "../../manifest.json";
import locales from "../../locales/en.json";
const manifest = manifestJson as unknown as PluginManifest;
const declared = (views?: Array<{ id: string }>) =>
(views ?? []).map((view) => view.id).sort();
let rendered: RenderedPluginApp | null = null;
afterEach(async () => {
await rendered?.deactivate();
rendered = null;
});
describe(`${manifest.id} activate`, () => {
it("activates and registers only views its manifest declares", async () => {
rendered = await renderWithApp(plugin, { manifest, locales });
const contributes = manifest.contributes as unknown as Record<
string,
Array<{ id: string }> | undefined
>;
const tabs = declared(contributes.tabs);
// A rail panel may reuse one of the plugin's tab ids.
const panels = [...declared(contributes.panels), ...tabs];
const cards = declared(contributes.dashboardCards);
for (const id of rendered.registered.tabs()) expect(tabs).toContain(id);
for (const id of rendered.registered.panels()) expect(panels).toContain(id);
for (const id of rendered.registered.dashboardCards()) {
expect(cards).toContain(id);
}
});
it("removes everything it registered on deactivate", async () => {
const app = await renderWithApp(plugin, { manifest, locales });
await app.deactivate();
expect(app.registered.tabs()).toEqual([]);
expect(app.registered.panels()).toEqual([]);
expect(app.registered.railItems()).toEqual([]);
expect(app.registered.hostActions()).toEqual([]);
expect(app.registered.hostEditorSections()).toEqual([]);
expect(app.registered.dashboardCards()).toEqual([]);
expect(app.registered.settingsComponents()).toEqual([]);
expect(app.registered.actions()).toEqual([]);
});
});
@@ -1,328 +0,0 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import {
buildWorkspacePayload,
buildWorkspaceTabSnapshots,
remapSlotIds,
resolveWorkspaceTabTarget,
} from "../../src/frontend/workspaceUtils";
import type { Host, Tab, WorkspaceTabSnapshot } from "@/types/ui-types";
afterEach(() => vi.unstubAllGlobals());
function makeHost(overrides: Partial<Host> = {}): Host {
return {
id: "1",
name: "web-01",
username: "root",
ip: "10.0.0.1",
port: 22,
folder: "",
online: true,
cpu: null,
ram: null,
lastAccess: "2026-01-01T00:00:00.000Z",
authType: "password",
enableTerminal: true,
enableCommandHistory: true,
syncId: "sync-web-01",
...overrides,
} as Host;
}
function makeTab(overrides: Partial<Tab> = {}): Tab {
return {
id: "tab-1",
instanceId: "instance-1",
type: "terminal",
label: "web-01",
openedAt: 0,
...overrides,
} as Tab;
}
describe("buildWorkspaceTabSnapshots", () => {
it("falls back when randomUUID is unavailable", () => {
vi.stubGlobal("crypto", {});
const tabs = [makeTab({ id: "t1" }), makeTab({ id: "t2" })];
const { snapshots } = buildWorkspaceTabSnapshots(tabs);
expect(snapshots).toHaveLength(2);
expect(snapshots[0].slotId).toBeTruthy();
expect(snapshots[1].slotId).not.toBe(snapshots[0].slotId);
});
it("captures host-bound and singleton tabs with generated slot ids", () => {
let counter = 0;
const genSlotId = () => `slot-${counter++}`;
const host = makeHost();
const tabs: Tab[] = [
makeTab({ id: "t1", type: "terminal", host, label: "web-01" }),
makeTab({ id: "t2", type: "tunnel", label: "Tunnels" }),
];
const { snapshots, slotIdByTabId } = buildWorkspaceTabSnapshots(
tabs,
genSlotId,
);
expect(snapshots).toHaveLength(2);
expect(snapshots[0]).toMatchObject({
slotId: "slot-0",
type: "terminal",
hostSyncId: "sync-web-01",
hostNameSnapshot: "web-01",
});
expect(snapshots[1]).toMatchObject({
slotId: "slot-1",
type: "tunnel",
hostSyncId: null,
});
expect(slotIdByTabId.get("t1")).toBe("slot-0");
expect(slotIdByTabId.get("t2")).toBe("slot-1");
});
it("excludes rail-view pseudo tabs (host-manager, user-profile, admin-settings)", () => {
const tabs: Tab[] = [
makeTab({ id: "t1", type: "host-manager" }),
makeTab({ id: "t2", type: "user-profile" }),
makeTab({ id: "t3", type: "admin-settings" }),
makeTab({ id: "t4", type: "tunnel" }),
];
const { snapshots } = buildWorkspaceTabSnapshots(tabs);
expect(snapshots).toHaveLength(1);
expect(snapshots[0].type).toBe("tunnel");
});
it("excludes the dashboard tab - it's a permanent fallback, not a meaningful part of a saved arrangement", () => {
const tabs: Tab[] = [
makeTab({ id: "t1", type: "dashboard" }),
makeTab({ id: "t2", type: "terminal", host: makeHost() }),
];
const { snapshots } = buildWorkspaceTabSnapshots(tabs);
expect(snapshots).toHaveLength(1);
expect(snapshots[0].type).toBe("terminal");
});
it("captures serialConfig only for serial tabs", () => {
const tabs: Tab[] = [
makeTab({
id: "t1",
type: "serial",
serialConfig: {
path: "/dev/ttyUSB0",
baudRate: 9600,
dataBits: 8,
stopBits: 1,
parity: "none",
},
}),
makeTab({ id: "t2", type: "terminal", host: makeHost() }),
];
const { snapshots } = buildWorkspaceTabSnapshots(tabs);
expect(snapshots[0].serialConfig).toEqual({
path: "/dev/ttyUSB0",
baudRate: 9600,
dataBits: 8,
stopBits: 1,
parity: "none",
});
expect(snapshots[0].hostSyncId).toBeNull();
expect(snapshots[1].serialConfig).toBeUndefined();
});
});
describe("remapSlotIds", () => {
it("maps slot ids to live tab ids, preserving nulls and unresolved slots", () => {
const map = new Map([
["slot-a", "new-tab-1"],
["slot-b", "new-tab-2"],
]);
const result = remapSlotIds(
["slot-a", null, "slot-b", "slot-missing"],
map,
);
expect(result).toEqual(["new-tab-1", null, "new-tab-2", null]);
});
});
describe("resolveWorkspaceTabTarget", () => {
const hosts: Host[] = [makeHost({ id: "1", syncId: "sync-web-01" })];
it("resolves a serial snapshot with a config as 'serial'", () => {
const snapshot: WorkspaceTabSnapshot = {
slotId: "s1",
type: "serial",
label: "Serial",
serialConfig: {
path: "/dev/ttyUSB0",
baudRate: 9600,
dataBits: 8,
stopBits: 1,
parity: "none",
},
};
expect(resolveWorkspaceTabTarget(snapshot, hosts)).toEqual({
kind: "serial",
});
});
it("skips a serial snapshot missing its config", () => {
const snapshot: WorkspaceTabSnapshot = {
slotId: "s1",
type: "serial",
label: "Serial",
};
expect(resolveWorkspaceTabTarget(snapshot, hosts)).toEqual({
kind: "skip",
});
});
it("resolves a host-bound snapshot by matching syncId", () => {
const snapshot: WorkspaceTabSnapshot = {
slotId: "s1",
type: "terminal",
label: "web-01",
hostSyncId: "sync-web-01",
};
const result = resolveWorkspaceTabTarget(snapshot, hosts);
expect(result.kind).toBe("host");
expect((result as { host: Host }).host.syncId).toBe("sync-web-01");
});
it("skips a host-bound snapshot whose host no longer exists", () => {
const snapshot: WorkspaceTabSnapshot = {
slotId: "s1",
type: "terminal",
label: "deleted-host",
hostSyncId: "sync-gone",
hostNameSnapshot: "deleted-host",
};
expect(resolveWorkspaceTabTarget(snapshot, hosts)).toEqual({
kind: "skip",
});
});
it("resolves a hostless singleton type without a hostSyncId", () => {
const snapshot: WorkspaceTabSnapshot = {
slotId: "s1",
type: "tunnel",
label: "Tunnels",
};
expect(resolveWorkspaceTabTarget(snapshot, hosts)).toEqual({
kind: "singleton",
host: undefined,
});
});
it("resolves a singleton type WITH a resolved host as singleton+host (e.g. fleet-inventory)", () => {
const snapshot: WorkspaceTabSnapshot = {
slotId: "s1",
type: "fleet-inventory",
label: "Fleet",
hostSyncId: "sync-web-01",
};
const result = resolveWorkspaceTabTarget(snapshot, hosts);
expect(result.kind).toBe("singleton");
expect((result as { host?: Host }).host?.syncId).toBe("sync-web-01");
});
it("skips a non-singleton, non-serial type with no resolvable host", () => {
const snapshot: WorkspaceTabSnapshot = {
slotId: "s1",
type: "files",
label: "files",
};
expect(resolveWorkspaceTabTarget(snapshot, hosts)).toEqual({
kind: "skip",
});
});
});
describe("buildWorkspacePayload", () => {
it("builds a full payload including pane assignment remapped to slot ids", () => {
let counter = 0;
const genSlotId = () => `slot-${counter++}`;
const host = makeHost();
const tabs: Tab[] = [
makeTab({ id: "t1", type: "terminal", host }),
makeTab({ id: "t2", type: "files", host }),
];
const payload = buildWorkspacePayload({
tabs,
activeTabId: "t1",
splitMode: "2-way",
paneTabIds: ["t1", "t2", null, null, null, null],
rowSizes: [100],
rowColSizes: [[50, 50]],
genSlotId,
});
expect(payload.version).toBe(1);
expect(payload.activeSlotId).toBe("slot-0");
expect(payload.paneTabIds).toEqual([
"slot-0",
"slot-1",
null,
null,
null,
null,
]);
expect(payload.splitMode).toBe("2-way");
expect(payload.rowSizes).toEqual([100]);
expect(payload.rowColSizes).toEqual([[50, 50]]);
});
it("sets activeSlotId to null when the active tab is not capturable", () => {
const payload = buildWorkspacePayload({
tabs: [makeTab({ id: "t1", type: "host-manager" })],
activeTabId: "t1",
splitMode: "none",
paneTabIds: [null, null, null, null, null, null],
rowSizes: [100],
rowColSizes: [[100]],
});
expect(payload.activeSlotId).toBeNull();
expect(payload.tabs).toHaveLength(0);
});
it("round-trips the sidebar arrangement", () => {
const payload = buildWorkspacePayload({
tabs: [],
activeTabId: "dashboard",
splitMode: "none",
paneTabIds: [null, null, null, null, null, null],
rowSizes: [100],
rowColSizes: [[100]],
sidebar: {
left: { view: "hosts", open: true, width: 320 },
right: { view: "history", open: true, width: 240 },
},
});
expect(payload.sidebar).toEqual({
left: { view: "hosts", open: true, width: 320 },
right: { view: "history", open: true, width: 240 },
});
});
it("omits sidebar when not supplied so older payloads stay unchanged", () => {
const payload = buildWorkspacePayload({
tabs: [],
activeTabId: "dashboard",
splitMode: "none",
paneTabIds: [null, null, null, null, null, null],
rowSizes: [100],
rowColSizes: [[100]],
});
expect(payload.sidebar).toBeUndefined();
expect(payload.version).toBe(1);
});
});