Selaa lähdekoodia

fix(i18n): bring the Ukrainian locale up to parity and drop two English strings

The Ukrainian locale was authored before #2622 landed and merged dev in
without picking up the five slice.designSettings* keys that came with it, so
check:i18n failed at 5675 leaves against en's 5680. This is invisible on the
PR because ci.yml only triggers for pull requests targeting main, and this one
targets dev - the only checks that ran were the security workflow's.

Adds the five missing keys, following the file's own convention of rendering
"designer" as "автора" as it already does in slice.useEmbeddedHint.

Two values were still English and the parity gate could not see them, because
check 4 only fires on leaves byte-identical to en: profiles.localProfiles.
pressureAdvance and inventory.paProfileTab both read "Pressure Advance (PA)"
where en has "Pressure Advance" and "PA Profile". The added "(PA)" was enough
to walk past the equality test. Both are now translated, the second as a tab
label matching the Russian. Inline mentions of the term in profiles.subtitle
and kProfilesDescription stay in English, which is what ru does too.

failureDetection.mlUrl is translated rather than allow-listed, and the dead
'{{weight}} г' entry is dropped from UK_COGNATES - that list matches against
the English value, so an entry spelled in Ukrainian could never fire, and
since the unit is now localized no entry is needed at all.

Four straight apostrophes normalized to the typographic form used by the
other 186 in the file. Locale count in the README and the two wiki pages
corrected from 11 to 13; it had already been wrong, omitting Russian.
maziggy 1 kuukausi sitten
vanhempi
sitoutus
c3cee54c0c

+ 1 - 1
README.md

@@ -183,7 +183,7 @@ Optional but recommended — drop the [`slicer-api/` Compose stack](slicer-api/R
 - Configurable drying presets per filament type (temperature & duration for AMS 2 Pro and AMS-HT)
 - **Per-filament humidity threshold** — Set a different humidity trigger per filament type (e.g. Nylon at 20%, PLA at 60%, ASA at 30%) instead of one global value. Mixed-material AMS units use the most-restrictive threshold across the loaded spools so a single PLA + Nylon unit triggers at Nylon's level. Drives both the auto-drying scheduler and the hourly humidity alarm so the two can never disagree on whether a unit is "too humid"
 - Dual external spool support for H2D (Ext-L / Ext-R)
-- **HMS error monitoring with one-click actions** — Live HMS error log with history and the same Resume / Stop / Continue / Retry / Check Assistant / Don't Remind Me action buttons BambuStudio shows. Click and the matching MQTT command goes back to the printer — no more walking to the device just to dismiss a paused-print dialog. Catalog covers every Bambu model (X1 / P1 / A1 / H2 series); buttons are translated in all 11 supported locales
+- **HMS error monitoring with one-click actions** — Live HMS error log with history and the same Resume / Stop / Continue / Retry / Check Assistant / Don't Remind Me action buttons BambuStudio shows. Click and the matching MQTT command goes back to the printer — no more walking to the device just to dismiss a paused-print dialog. Catalog covers every Bambu model (X1 / P1 / A1 / H2 series); buttons are translated in all 13 supported locales
 - **Heater history charts** — Bambuddy logs nozzle, bed, and chamber readings every minute and surfaces them via a tiny chart icon on each heater tile in the printer card. Click for a per-heater modal with current / average / min / max stats, target overlay, and a 6h / 24h / 48h / 7d time range — works on read-only chamber sensors (X1C / P2S) too. AMS humidity and temperature get the same treatment (already shipped).
 - Print success rates & trends
 - Filament usage tracking

+ 7 - 9
frontend/scripts/check-i18n-parity.mjs

@@ -397,20 +397,18 @@ const RU_COGNATES = [
   '(25%, 50%, 75%)',
 ];
 
+// Ukrainian keeps only Latin brand names and placeholder/punctuation-only
+// formats verbatim; every prose string in uk.ts is translated.
 const UK_COGNATES = [
-  '{{weight}} г',
-  'MakerWorld: {{designer}}',
-  '{{printer}}: {{error}}',
-  'Bambu Cloud',
-  'Orca Cloud',
-  'Sport (124%)',
-  'Ludicrous (166%)',
-  'email',
+  'MakerWorld: {{designer}}',                         // brand + placeholder
+  '{{printer}}: {{error}}',                           // pure placeholders
+  'Bambu Cloud', 'Orca Cloud',                        // brand names — same in every locale
+  'Sport (124%)', 'Ludicrous (166%)',                 // official Bambu speed-mode names
+  'email',                                            // OIDC claim name placeholder
   '{{name}} — {{stage}} ({{percent}}%) — {{elapsed}}',
   'EC984C,#6CD4BC,A66EB9,D87694',
   '({{count}}/8)',
   '(25%, 50%, 75%)',
-  'Obico ML API URL',
 ];
 
 const IDENTICAL_TO_EN_ALLOWED = {

+ 12 - 7
frontend/src/i18n/locales/uk.ts

@@ -79,7 +79,7 @@ export default {
     noPrinters: "Принтери не налаштовані",
     noData: "Немає даних",
     linkNotFound: "Посилання не знайдено",
-    required: "Обов'язковий",
+    required: "Обовязковий",
     optional: "Необов’язково",
     dismiss: "Закрити",
     apply: "Застосувати",
@@ -1208,7 +1208,7 @@ export default {
       groupAsBatch: "Згрупувати в партію…",
       groupAsBatchDescription: "Об’єднати вибрані елементи ({{count}}) в одну згортану партію.",
       nameLabel: "Назва партії",
-      namePlaceholder: "напр. П'ятничні подарунки",
+      namePlaceholder: "напр. Пятничні подарунки",
       create: "Створити партію",
       ungroup: "Розгрупувати",
       ungroupConfirmTitle: "Розгрупувати партію?",
@@ -1744,7 +1744,7 @@ export default {
       security: "Безпека",
       securityHint: "StartTLS оновлює звичайне підключення до TLS. LDAPS використовує TLS із самого початку.",
       bindDn: "DN прив’язки (службовий обліковий запис)",
-      bindPassword: "Пароль прив'язки",
+      bindPassword: "Пароль привязки",
       searchBase: "Базовий DN пошуку",
       userFilter: "Фільтр пошуку користувача",
       userFilterHint: "{username} буде замінено на ім’я користувача, введене під час входу. Для OpenLDAP використовуйте (uid={username}).",
@@ -3376,7 +3376,7 @@ export default {
       nozzleTemp: "Температура сопла",
       cost: "Вартість",
       density: "Щільність",
-      pressureAdvance: "Pressure Advance (PA)",
+      pressureAdvance: "Випередження тиску",
       filament: "Філамент",
       process: "Процес",
       printer: "Принтер",
@@ -4106,6 +4106,11 @@ export default {
     allPresetsRequired: "Потрібно вибрати всі профілі",
     useEmbedded: "Використати вбудовані налаштування файлу",
     useEmbeddedHint: "Нарізати модель із налаштуваннями автора файлу — стінками, заповненням і філаментом — замість профілів вище. Ця можливість доступна, оскільки модель принтера відповідає файлу.",
+    designSettings: "Зберегти налаштування автора",
+    designSettingsHint: "Цей файл змінює {{count}} налаштувань друку порівняно зі стандартним профілем.",
+    designSettingsSelected: "Вибрано {{selected}} із {{total}}",
+    designSettingsPrinterCoupled: "залежить від принтера",
+    designSettingsPrinterCoupledHint: "Значення підібрано для принтера, під який створено файл, — на вашому воно може бути неправильним або поза допустимим діапазоном.",
     enqueuing: "Надсилання завдання нарізання…",
     queued: "У черзі…",
     failed: "Не вдалося виконати нарізання. Перевірте журнали слайсера.",
@@ -4458,7 +4463,7 @@ export default {
     advancedSettings: "Розширені налаштування",
     // Tabs
     filamentInfoTab: "Інформація про філамент",
-    paProfileTab: "Pressure Advance (PA)",
+    paProfileTab: "Профіль PA",
     filamentInfo: "Філамент",
     additional: "Додатково",
     // Cloud
@@ -6554,7 +6559,7 @@ export default {
   failureDetection: {
     title: "Виявлення помилок за допомогою ШІ",
     description: "Відстежуйте друк за допомогою самостійно розгорнутого Obico ML API та автоматично реагуйте на виявлені помилки.",
-    mlUrl: "Obico ML API URL",
+    mlUrl: "URL Obico ML API",
     mlUrlHint: "База URL вашого контейнера ml_api, розміщеного на власному хості Obico (наприклад, http://192.168.1.10:3333).",
     test: "Тест",
     testSuccess: "ML API доступний і працює належним чином.",
@@ -6589,7 +6594,7 @@ export default {
     description: "Вставте модель MakerWorld URL, щоб імпортувати та роздрукувати її безпосередньо з Bambuddy — не виходячи з програми Bambu Handy.",
     pasteUrlHeader: "Імпортувати з MakerWorld",
     pasteUrlPlaceholder: "https://makerworld.com/en/models/… або вставте будь-яке посилання MakerWorld.",
-    resolveButton: "Розв'язати",
+    resolveButton: "Розвязати",
     signInRequiredTitle: "Для завантаження потрібно увійти в Bambu Cloud",
     signInRequiredBody: "Ви можете переглядати деталі моделі анонімно, але для MakerWorld потрібен обліковий запис Bambu Cloud для завантаження файлів 3MF.",
     signInExpiredTitle: "Термін входу в Bambu Cloud минув",

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
static/assets/index-B4oB3n1m.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
static/assets/index-iZ6BPzxV.js


+ 1 - 1
static/index.html

@@ -26,7 +26,7 @@
 
     <!-- Splash screens for iOS -->
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
-    <script type="module" crossorigin src="/assets/index-D5mCVall.js"></script>
+    <script type="module" crossorigin src="/assets/index-B4oB3n1m.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-D4bpNaiw.css">
   </head>
   <body>

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä