From 814124b3f6abbb092e09deb99ed98ca9b095bc93 Mon Sep 17 00:00:00 2001 From: doxa-maps-88655c70 <88627970+doxa-maps-88655c70@users.noreply.github.com> Date: Fri, 25 Sep 2026 04:10:49 +0000 Subject: [PATCH] Plugin studio: its own words in every locale Choosing a language in the studio translated the plugins it mounts but left the studio itself in English: the title, the count, the filter box, Collapse all, the section names, Copy embed, the loading and error messages, and the rail's own Collapse button and aria labels. The studio's strings now live in library/i18n/locales//studio.json for all 11 locales, held to key parity by check:i18n-parity like every other catalog. The studio has no vue-i18n instance, so it looks strings up directly (locale, then English, per key). The Explorer tree takes them through a `strings` prop. VerticalTabsLayout gains an optional `labels` prop for its five words; hosts that do not pass it keep the English defaults, so doxa-maps-spa is unchanged until it opts in. Verified by switching the studio through every language its switcher offers (en, es, fr, pt, ar, ru): no English left in the studio chrome. Technical names (CAP n, element tags, tier machine names in tooltips) stay as they are. --- library/i18n/locales/ar/studio.json | 30 +++++++++ library/i18n/locales/de/studio.json | 30 +++++++++ library/i18n/locales/en/studio.json | 30 +++++++++ library/i18n/locales/es/studio.json | 30 +++++++++ library/i18n/locales/fr/studio.json | 30 +++++++++ library/i18n/locales/hi/studio.json | 30 +++++++++ library/i18n/locales/it/studio.json | 30 +++++++++ library/i18n/locales/pt/studio.json | 30 +++++++++ library/i18n/locales/ro/studio.json | 30 +++++++++ library/i18n/locales/ru/studio.json | 30 +++++++++ library/i18n/locales/zh/studio.json | 30 +++++++++ library/layouts/VerticalTabsLayout.vue | 15 +++-- .../plugin-studio/plugin-studio.vue | 62 +++++++++++++------ .../plugin-studio/src/StudioTree.vue | 27 +++++--- 14 files changed, 402 insertions(+), 32 deletions(-) create mode 100644 library/i18n/locales/ar/studio.json create mode 100644 library/i18n/locales/de/studio.json create mode 100644 library/i18n/locales/en/studio.json create mode 100644 library/i18n/locales/es/studio.json create mode 100644 library/i18n/locales/fr/studio.json create mode 100644 library/i18n/locales/hi/studio.json create mode 100644 library/i18n/locales/it/studio.json create mode 100644 library/i18n/locales/pt/studio.json create mode 100644 library/i18n/locales/ro/studio.json create mode 100644 library/i18n/locales/ru/studio.json create mode 100644 library/i18n/locales/zh/studio.json diff --git a/library/i18n/locales/ar/studio.json b/library/i18n/locales/ar/studio.json new file mode 100644 index 000000000..8634ab559 --- /dev/null +++ b/library/i18n/locales/ar/studio.json @@ -0,0 +1,30 @@ +{ + "title": "استوديو الإضافات", + "navLabel": "الإضافات حسب القدرة", + "countLabel": "{bundles} حزمة · {elements} إضافة مدرجة هنا", + "changeLanguage": "تغيير اللغة", + "copyEmbed": "نسخ رمز التضمين", + "copy": "نسخ", + "copied": "تم النسخ", + "scriptEmbed": "تضمين عبر سكربت", + "loading": "جارٍ تحميل {name}…", + "couldNotLoad": "تعذّر تحميل {name}.", + "chooseElement": "اختر إضافة من القائمة.", + "filterPlaceholder": "تصفية الإضافات", + "collapseAll": "طي الكل", + "noMatch": "لا توجد إضافة تطابق «{query}».", + "openSection": "فتح {cap}، {label}", + "part": "جزء", + "noStandalone": "بلا صفحة مستقلة", + "cap5": "هيكل التطبيق", + "cap4": "مركّب", + "cap3": "متعدد العروض", + "cap2": "إعداد مسبق", + "cap1": "مفرد", + "toggleList": "إظهار القائمة أو إخفاؤها", + "openViews": "فتح قائمة العروض", + "expandList": "توسيع القائمة", + "collapseList": "طي القائمة", + "collapse": "طي", + "partOf": "جزء من {name}، غير منشور بمفرده" +} diff --git a/library/i18n/locales/de/studio.json b/library/i18n/locales/de/studio.json new file mode 100644 index 000000000..adf79f7f2 --- /dev/null +++ b/library/i18n/locales/de/studio.json @@ -0,0 +1,30 @@ +{ + "title": "Plugin-Studio", + "navLabel": "Plugins nach Fähigkeit", + "countLabel": "{bundles} Bundles · {elements} Plugins hier aufgeführt", + "changeLanguage": "Sprache ändern", + "copyEmbed": "Einbettung kopieren", + "copy": "Kopieren", + "copied": "Kopiert", + "scriptEmbed": "Skript-Einbettung", + "loading": "{name} wird geladen…", + "couldNotLoad": "{name} konnte nicht geladen werden.", + "chooseElement": "Wählen Sie ein Plugin aus der Liste.", + "filterPlaceholder": "Plugins filtern", + "collapseAll": "Alle einklappen", + "noMatch": "Kein Plugin entspricht „{query}“.", + "openSection": "{cap} öffnen, {label}", + "part": "Teil", + "noStandalone": "keine eigene Seite", + "cap5": "App-Shell", + "cap4": "Komposit", + "cap3": "Mehrfachansicht", + "cap2": "Voreinstellung", + "cap1": "Einzeln", + "toggleList": "Liste ein-/ausblenden", + "openViews": "Ansichtsliste öffnen", + "expandList": "Liste ausklappen", + "collapseList": "Liste einklappen", + "collapse": "Einklappen", + "partOf": "Teil von {name}, nicht eigenständig veröffentlicht" +} diff --git a/library/i18n/locales/en/studio.json b/library/i18n/locales/en/studio.json new file mode 100644 index 000000000..3a122b400 --- /dev/null +++ b/library/i18n/locales/en/studio.json @@ -0,0 +1,30 @@ +{ + "title": "Plugin Studio", + "navLabel": "Plugins by capability", + "countLabel": "{bundles} bundles · {elements} plugins listed here", + "changeLanguage": "Change language", + "copyEmbed": "Copy embed", + "copy": "Copy", + "copied": "Copied", + "scriptEmbed": "Script embed", + "loading": "Loading {name}…", + "couldNotLoad": "Could not load {name}.", + "chooseElement": "Choose a plugin from the list.", + "filterPlaceholder": "Filter plugins", + "collapseAll": "Collapse all", + "noMatch": "No plugin matches “{query}”.", + "openSection": "Open {cap}, {label}", + "part": "part", + "noStandalone": "no standalone page", + "cap5": "App shell", + "cap4": "Composite", + "cap3": "Multi-view", + "cap2": "Preset", + "cap1": "Single", + "toggleList": "Toggle list", + "openViews": "Open the list of views", + "expandList": "Expand list", + "collapseList": "Collapse list", + "collapse": "Collapse", + "partOf": "part of {name}, not published on its own" +} diff --git a/library/i18n/locales/es/studio.json b/library/i18n/locales/es/studio.json new file mode 100644 index 000000000..ba70af3fa --- /dev/null +++ b/library/i18n/locales/es/studio.json @@ -0,0 +1,30 @@ +{ + "title": "Estudio de plugins", + "navLabel": "Plugins por capacidad", + "countLabel": "{bundles} paquetes · {elements} plugins listados aquí", + "changeLanguage": "Cambiar idioma", + "copyEmbed": "Copiar código de inserción", + "copy": "Copiar", + "copied": "Copiado", + "scriptEmbed": "Inserción por script", + "loading": "Cargando {name}…", + "couldNotLoad": "No se pudo cargar {name}.", + "chooseElement": "Elija un plugin de la lista.", + "filterPlaceholder": "Filtrar plugins", + "collapseAll": "Contraer todo", + "noMatch": "Ningún plugin coincide con «{query}».", + "openSection": "Abrir {cap}, {label}", + "part": "parte", + "noStandalone": "sin página propia", + "cap5": "Contenedor de aplicación", + "cap4": "Compuesto", + "cap3": "Multivista", + "cap2": "Preajuste", + "cap1": "Individual", + "toggleList": "Mostrar u ocultar la lista", + "openViews": "Abrir la lista de vistas", + "expandList": "Expandir la lista", + "collapseList": "Contraer la lista", + "collapse": "Contraer", + "partOf": "parte de {name}, no publicada por separado" +} diff --git a/library/i18n/locales/fr/studio.json b/library/i18n/locales/fr/studio.json new file mode 100644 index 000000000..b7db511c7 --- /dev/null +++ b/library/i18n/locales/fr/studio.json @@ -0,0 +1,30 @@ +{ + "title": "Studio de plugins", + "navLabel": "Plugins par capacité", + "countLabel": "{bundles} paquets · {elements} plugins listés ici", + "changeLanguage": "Changer de langue", + "copyEmbed": "Copier le code d’intégration", + "copy": "Copier", + "copied": "Copié", + "scriptEmbed": "Intégration par script", + "loading": "Chargement de {name}…", + "couldNotLoad": "Impossible de charger {name}.", + "chooseElement": "Choisissez un plugin dans la liste.", + "filterPlaceholder": "Filtrer les plugins", + "collapseAll": "Tout replier", + "noMatch": "Aucun plugin ne correspond à « {query} ».", + "openSection": "Ouvrir {cap}, {label}", + "part": "partie", + "noStandalone": "pas de page autonome", + "cap5": "Coquille d’application", + "cap4": "Composite", + "cap3": "Multivue", + "cap2": "Préréglage", + "cap1": "Simple", + "toggleList": "Afficher ou masquer la liste", + "openViews": "Ouvrir la liste des vues", + "expandList": "Déplier la liste", + "collapseList": "Replier la liste", + "collapse": "Replier", + "partOf": "partie de {name}, non publiée seule" +} diff --git a/library/i18n/locales/hi/studio.json b/library/i18n/locales/hi/studio.json new file mode 100644 index 000000000..818c8e238 --- /dev/null +++ b/library/i18n/locales/hi/studio.json @@ -0,0 +1,30 @@ +{ + "title": "प्लगइन स्टूडियो", + "navLabel": "क्षमता के अनुसार प्लगइन", + "countLabel": "{bundles} बंडल · यहाँ {elements} प्लगइन सूचीबद्ध", + "changeLanguage": "भाषा बदलें", + "copyEmbed": "एम्बेड कोड कॉपी करें", + "copy": "कॉपी करें", + "copied": "कॉपी हो गया", + "scriptEmbed": "स्क्रिप्ट एम्बेड", + "loading": "{name} लोड हो रहा है…", + "couldNotLoad": "{name} लोड नहीं हो सका।", + "chooseElement": "सूची से कोई प्लगइन चुनें।", + "filterPlaceholder": "प्लगइन फ़िल्टर करें", + "collapseAll": "सभी संक्षिप्त करें", + "noMatch": "“{query}” से कोई प्लगइन मेल नहीं खाता।", + "openSection": "{cap} खोलें, {label}", + "part": "भाग", + "noStandalone": "कोई अलग पेज नहीं", + "cap5": "ऐप शेल", + "cap4": "संयुक्त", + "cap3": "बहु-दृश्य", + "cap2": "प्रीसेट", + "cap1": "एकल", + "toggleList": "सूची दिखाएँ या छिपाएँ", + "openViews": "दृश्यों की सूची खोलें", + "expandList": "सूची फैलाएँ", + "collapseList": "सूची संक्षिप्त करें", + "collapse": "संक्षिप्त करें", + "partOf": "{name} का भाग, अलग से प्रकाशित नहीं" +} diff --git a/library/i18n/locales/it/studio.json b/library/i18n/locales/it/studio.json new file mode 100644 index 000000000..d84390537 --- /dev/null +++ b/library/i18n/locales/it/studio.json @@ -0,0 +1,30 @@ +{ + "title": "Studio dei plugin", + "navLabel": "Plugin per capacità", + "countLabel": "{bundles} pacchetti · {elements} plugin elencati qui", + "changeLanguage": "Cambia lingua", + "copyEmbed": "Copia codice di incorporamento", + "copy": "Copia", + "copied": "Copiato", + "scriptEmbed": "Incorporamento tramite script", + "loading": "Caricamento di {name}…", + "couldNotLoad": "Impossibile caricare {name}.", + "chooseElement": "Scegli un plugin dall’elenco.", + "filterPlaceholder": "Filtra i plugin", + "collapseAll": "Comprimi tutto", + "noMatch": "Nessun plugin corrisponde a «{query}».", + "openSection": "Apri {cap}, {label}", + "part": "parte", + "noStandalone": "nessuna pagina propria", + "cap5": "Shell dell’app", + "cap4": "Composito", + "cap3": "Multivista", + "cap2": "Preimpostato", + "cap1": "Singolo", + "toggleList": "Mostra o nascondi l’elenco", + "openViews": "Apri l’elenco delle viste", + "expandList": "Espandi l’elenco", + "collapseList": "Comprimi l’elenco", + "collapse": "Comprimi", + "partOf": "parte di {name}, non pubblicata da sola" +} diff --git a/library/i18n/locales/pt/studio.json b/library/i18n/locales/pt/studio.json new file mode 100644 index 000000000..5f2a31352 --- /dev/null +++ b/library/i18n/locales/pt/studio.json @@ -0,0 +1,30 @@ +{ + "title": "Estúdio de plugins", + "navLabel": "Plugins por capacidade", + "countLabel": "{bundles} pacotes · {elements} plugins listados aqui", + "changeLanguage": "Mudar idioma", + "copyEmbed": "Copiar código de incorporação", + "copy": "Copiar", + "copied": "Copiado", + "scriptEmbed": "Incorporação por script", + "loading": "Carregando {name}…", + "couldNotLoad": "Não foi possível carregar {name}.", + "chooseElement": "Escolha um plugin na lista.", + "filterPlaceholder": "Filtrar plugins", + "collapseAll": "Recolher tudo", + "noMatch": "Nenhum plugin corresponde a “{query}”.", + "openSection": "Abrir {cap}, {label}", + "part": "parte", + "noStandalone": "sem página própria", + "cap5": "Shell do aplicativo", + "cap4": "Composto", + "cap3": "Multivisualização", + "cap2": "Predefinição", + "cap1": "Único", + "toggleList": "Mostrar ou ocultar a lista", + "openViews": "Abrir a lista de visualizações", + "expandList": "Expandir a lista", + "collapseList": "Recolher a lista", + "collapse": "Recolher", + "partOf": "parte de {name}, não publicada separadamente" +} diff --git a/library/i18n/locales/ro/studio.json b/library/i18n/locales/ro/studio.json new file mode 100644 index 000000000..1f4c1de38 --- /dev/null +++ b/library/i18n/locales/ro/studio.json @@ -0,0 +1,30 @@ +{ + "title": "Studio de pluginuri", + "navLabel": "Pluginuri după capacitate", + "countLabel": "{bundles} pachete · {elements} pluginuri listate aici", + "changeLanguage": "Schimbă limba", + "copyEmbed": "Copiază codul de încorporare", + "copy": "Copiază", + "copied": "Copiat", + "scriptEmbed": "Încorporare prin script", + "loading": "Se încarcă {name}…", + "couldNotLoad": "{name} nu a putut fi încărcat.", + "chooseElement": "Alegeți un plugin din listă.", + "filterPlaceholder": "Filtrează pluginurile", + "collapseAll": "Restrânge tot", + "noMatch": "Niciun plugin nu corespunde cu „{query}”.", + "openSection": "Deschide {cap}, {label}", + "part": "parte", + "noStandalone": "fără pagină proprie", + "cap5": "Cadru de aplicație", + "cap4": "Compus", + "cap3": "Vizualizări multiple", + "cap2": "Presetat", + "cap1": "Simplu", + "toggleList": "Afișează sau ascunde lista", + "openViews": "Deschide lista de vizualizări", + "expandList": "Extinde lista", + "collapseList": "Restrânge lista", + "collapse": "Restrânge", + "partOf": "parte din {name}, nepublicată separat" +} diff --git a/library/i18n/locales/ru/studio.json b/library/i18n/locales/ru/studio.json new file mode 100644 index 000000000..a65453637 --- /dev/null +++ b/library/i18n/locales/ru/studio.json @@ -0,0 +1,30 @@ +{ + "title": "Студия плагинов", + "navLabel": "Плагины по возможностям", + "countLabel": "Здесь: пакетов {bundles} · плагинов {elements}", + "changeLanguage": "Сменить язык", + "copyEmbed": "Скопировать код встраивания", + "copy": "Копировать", + "copied": "Скопировано", + "scriptEmbed": "Встраивание через скрипт", + "loading": "Загрузка {name}…", + "couldNotLoad": "Не удалось загрузить {name}.", + "chooseElement": "Выберите плагин из списка.", + "filterPlaceholder": "Фильтр плагинов", + "collapseAll": "Свернуть всё", + "noMatch": "Нет плагинов, соответствующих «{query}».", + "openSection": "Открыть {cap}, {label}", + "part": "часть", + "noStandalone": "нет отдельной страницы", + "cap5": "Оболочка приложения", + "cap4": "Составной", + "cap3": "Несколько видов", + "cap2": "Предустановка", + "cap1": "Одиночный", + "toggleList": "Показать или скрыть список", + "openViews": "Открыть список представлений", + "expandList": "Развернуть список", + "collapseList": "Свернуть список", + "collapse": "Свернуть", + "partOf": "часть {name}, не публикуется отдельно" +} diff --git a/library/i18n/locales/zh/studio.json b/library/i18n/locales/zh/studio.json new file mode 100644 index 000000000..ade089a8c --- /dev/null +++ b/library/i18n/locales/zh/studio.json @@ -0,0 +1,30 @@ +{ + "title": "插件工作室", + "navLabel": "按能力分类的插件", + "countLabel": "此处列出 {bundles} 个包 · {elements} 个插件", + "changeLanguage": "切换语言", + "copyEmbed": "复制嵌入代码", + "copy": "复制", + "copied": "已复制", + "scriptEmbed": "脚本嵌入", + "loading": "正在加载 {name}…", + "couldNotLoad": "无法加载 {name}。", + "chooseElement": "请从列表中选择一个插件。", + "filterPlaceholder": "筛选插件", + "collapseAll": "全部折叠", + "noMatch": "没有与“{query}”匹配的插件。", + "openSection": "打开 {cap},{label}", + "part": "部分", + "noStandalone": "无独立页面", + "cap5": "应用外壳", + "cap4": "组合", + "cap3": "多视图", + "cap2": "预设", + "cap1": "单一", + "toggleList": "显示或隐藏列表", + "openViews": "打开视图列表", + "expandList": "展开列表", + "collapseList": "折叠列表", + "collapse": "折叠", + "partOf": "{name} 的一部分,不单独发布" +} diff --git a/library/layouts/VerticalTabsLayout.vue b/library/layouts/VerticalTabsLayout.vue index 7df6bd178..32a36c37f 100644 --- a/library/layouts/VerticalTabsLayout.vue +++ b/library/layouts/VerticalTabsLayout.vue @@ -94,7 +94,7 @@
+ :aria-label="label('toggleList')">☰ {{ title }} @@ -114,7 +114,7 @@ floating button over an open drawer would just cover a row. --> + @click="navOpen = true" :aria-label="label('openViews')">☰
@@ -60,7 +61,8 @@