Skip to content

feat(l10n): add Polish localization - #617

Open
Dragonk wants to merge 3 commits into
cogwheel0:mainfrom
Dragonk:feat/polish-localization
Open

feat(l10n): add Polish localization#617
Dragonk wants to merge 3 commits into
cogwheel0:mainfrom
Dragonk:feat/polish-localization

Conversation

@Dragonk

@Dragonk Dragonk commented Aug 5, 2026

Copy link
Copy Markdown

Summary

  • add a complete Polish Flutter localization (lib/l10n/app_pl.arb, 1381 keys incl. the new polish language-name key, mirroring app_en.arb)
  • add Polish to language selection and system locale resolution (l10n.yaml, app_customization_page.dart, native_sheet_utils.dart; device locales pl/pl_PL resolve through the generated AppLocalizations.supportedLocales)
  • add Polish native platform resources where required (iOS pl.lproj InfoPlist.strings + Localizable.strings, Info.plist CFBundleLocalizations, Xcode knownRegions + variant group registration)
  • add locale-dependent assets, tests, and documentation (assets/release_notes/pl.json, focused test suite, release-notes layout test, README language count)
  • add the polish language-name entry to all 13 existing ARB files, localized per catalog (e.g. Polnisch in de, Polonais in fr, Poľština in sk, Polski in pl) — the selector shows the active catalog's name

Review feedback (all addressed)

  • P2 language name per catalogpolish now translated in every locale: Polish / Polnisch / Polaco / Polonais / Polacco / Pools / Польский / ポーランド語 / 폴란드어 / 波兰语 / 波蘭語 / Polština / Poľština / Polski

  • P2 credentials label — the Email/password auth-mode segment is now E-mail i hasło (was just Hasło)

  • P2 active-schedule pluralhermesSchedulesSummary now pluralizes active too: 1 aktywny · 1 harmonogram, 2 aktywne · 3 harmonogramy, 5 aktywnych · 22 harmonogramy

  • P2 previous version labelpreviousLabel is now Poprzednia (feminine, the action is previous_version)

  • P2 quick pillsszybkie pigułkiszybkie akcje (subtitle and quick-actions description)

  • P2 downgrade wordingserverIncompatibleResolution now says obniż wersję serwera instead of zaktualizuj ... do starszej

  • P2 gendered messageshareChatExisting is now neutral: Ten czat ma już link do udostępniania.

  • P2 pronoun without antecedentdirectConnectionDeleteMessage now reads usunięcie połączenia „{name}” i zapisanych dla niego danych logowania

  • P3 product name — user-facing OpenWebUIOpen WebUI (10 values; key names untouched)

  • Follow-up (commit 881814e) — CodeRabbit round 2: credentialsDane logowania (username-inclusive), workspacePromptHistoryDeleteConfirmMessageTa wersja zostanie usunięta…; the channelMembers suggestion was intentionally rejected (2 członków is the correct form with digits, not 2 członkowie).

Translation quality

  • reviewed ambiguous strings against their actual UI call sites (back navigation → Wstecz; archive verb → Archiwizuj vs noun → Archiwum; done button → Gotowe; clear input → Wyczyść; memory feature vs items → Pamięć / wspomnienia, matching the official Open WebUI Polish locale)
  • consistent Polish terminology (czat, wiadomość, model, narzędzie, umiejętność, baza wiedzy, obszar roboczy, połączenie bezpośrednie, czat tymczasowy, wątek, kanał, prompt)
  • Polish ICU plural categories one/few/many/other implemented (e.g. 1 akcję / 2 akcje / 5 akcji / 12 akcji / 22 akcje)
  • all @key metadata including placeholder types preserved from the English template

Verification (Flutter/Dart toolchain, all executed)

flutter pub get                          -> Got dependencies!
dart run build_runner build              -> Built in 82s; wrote 1840 outputs
flutter gen-l10n ...                     -> exit 0
dart run tool/verify_arb_descriptions.dart -> ARB descriptions check passed
dart run tool/validate_arb_locales.dart  -> exit 0; 0 warnings for app_pl.arb
flutter analyze --no-fatal-warnings --no-fatal-infos -> No issues found!
flutter test test/core/utils/polish_localization_test.dart -> 13/13 passed
flutter test test/features/release_notes/release_notes_localized_layout_test.dart -> 14/14 passed (incl. pl)
flutter test (full suite)                -> 4600+ passed; only environment-sensitive tests fail (see below)
git diff --check                         -> clean

Full-suite failures are pre-existing/environmental

The full flutter test run on this branch fails 6–8 tests that are performance-budget, timing-race, or golden-pixel tests. Re-running the exact same set on a clean upstream/main worktree (13f6f1d, no changes) reproduces the golden failures (release_notes_banner_test.dart, release_notes_sheet_test.dart — pixel diffs from headless font rasterization) and shows the perf/timing tests flapping between runs. None of these files are touched by this PR; localization tests and release-notes layout tests are green.

Platforms

  • Android
  • iOS

Closes #616

Note

Add Polish localization across iOS and Flutter app

Macroscope summarized 881814e.

Greptile Summary

Adds complete Polish localization support across Flutter locale selection, native iOS resources, release notes, and language labels.

The executed localization harness confirmed English/Polish ARB key parity, placeholder parity, ICU plural-message structure, Polish plural-category behavior, pl and pl_PL locale resolution evidence, and iOS localization registration. No defects were found.

T-Rex validation blocked

  • Missing tool: flutter and dart are not available on PATH. The focused Polish localization and release-notes widget tests could not run because the environment returned flutter: not found and dart: not found. Provision Flutter/Dart 3.9.2+ to run the focused tests.

Confidence Score: 5/5

Safe to merge; no blocking failure remains.

No defects were found. Executed checks validated Polish catalog completeness, placeholder consistency, plural-message structure and behavior, locale registration, and iOS localized-resource registration. Flutter runtime tests remain unavailable because the required Flutter/Dart tools are not installed.

T-Rex T-Rex Logs

What T-Rex did

  • Verified that the Polish ARB resource did not exist in the base commit.
  • Ran the Polish localization validation harness and confirmed key checks passed, including parity, ICU structure, plural probes, and locale registrations for pl and pl_PL and iOS resource registration.
  • Tried to run the focused Flutter tests, but they could not start because Flutter and Dart were not on PATH.
  • Documented the environment/toolchain blocker and outlined next steps to provision Flutter/Dart (3.9.2+), then run the two focused Flutter tests and, on macOS, perform the iOS build step after provisioning.

View all artifacts

T-Rex Ran code and verified through T-Rex

Reviews (3): Last reviewed commit: "fix(l10n): address remaining Polish revi..." | Re-trigger Greptile

- add complete Polish Flutter localization (app_pl.arb) mirroring app_en.arb
- add pl to preferred-supported-locales, language selector, and native language sheets
- add Polish iOS native resources (pl.lproj) and Xcode project registration
- add Polish release notes and language count documentation
- add focused tests for locale resolution, resource completeness, and Polish plurals
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The change adds Polish as the 14th supported locale. It includes Flutter and iOS translations, locale selection, Polish release notes, updated documentation, and tests for locale resolution, ARB consistency, pluralization, and release-note layout.

Changes

Polish localization

Layer / File(s) Summary
Flutter localization and locale validation
l10n.yaml, lib/l10n/*.arb, lib/core/utils/native_sheet_utils.dart, lib/features/profile/views/app_customization_page.dart, test/core/utils/polish_localization_test.dart
Polish is added to Flutter localization catalogs, language selectors, native language options, and locale resolution. Tests validate catalog keys, placeholders, locale delegates, and Polish plural forms.
iOS Polish localization wiring
ios/Runner.xcodeproj/project.pbxproj, ios/Runner/Info.plist, ios/Runner/pl.lproj/*
The iOS project registers the pl region and Polish localized resources. Polish app name and native interface strings are added.
Release notes and documented locale coverage
README.md, assets/release_notes/pl.json, test/features/release_notes/release_notes_localized_layout_test.dart
The README lists 14 locales. Polish 4.0.3 release notes are added, and release-note layout tests include pl.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant DeviceLocale
  participant FlutterLocalization
  participant LanguageSelector
  DeviceLocale->>FlutterLocalization: Resolve pl or pl_PL
  FlutterLocalization->>FlutterLocalization: Load AppLocalizationsPl
  FlutterLocalization->>LanguageSelector: Provide Polish labels and messages
  LanguageSelector->>FlutterLocalization: Select pl
Loading

Possibly related PRs

  • cogwheel0/conduit#602: The Polish release notes extend the localized release-note structure introduced by this PR.

Suggested reviewers: cogwheel0

Poem

A rabbit adds Polish to the locale list,
With translated strings in every mist.
Plurals follow each counted trace,
iOS menus greet the right place.
Fourteen locales now hop in step.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes satisfy issue #616 by adding Polish translations, locale registration, selectors, device matching, plural handling, placeholders, and native resources.
Out of Scope Changes check ✅ Passed The README, release notes, iOS resources, and tests directly support the Polish localization objectives and are in scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the primary change: adding Polish localization support.
✨ Finishing Touches
✨ Simplify code
  • Create PR with simplified code

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@lib/l10n/app_de.arb`:
- Line 199: Update the polish localization entry in the German catalog from
“Polski” to the German language name “Polnisch,” preserving the existing key and
catalog structure.

In `@lib/l10n/app_pl.arb`:
- Line 5921: Update the hermesSchedulesSummary translation to use a nested
plural for the active placeholder, producing “aktywny” when active equals one
and “aktywnych” for other counts while preserving the existing total
pluralization.

In `@lib/l10n/app_sk.arb`:
- Around line 897-900: Update the “polish” localization value from “Polski” to
the Slovak name “Poľština”; leave its metadata description unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: c51366cb-29e4-4808-b601-2b01af36960a

📥 Commits

Reviewing files that changed from the base of the PR and between 13f6f1d and 51fb4c6.

📒 Files selected for processing (25)
  • README.md
  • assets/release_notes/pl.json
  • ios/Runner.xcodeproj/project.pbxproj
  • ios/Runner/Info.plist
  • ios/Runner/pl.lproj/InfoPlist.strings
  • ios/Runner/pl.lproj/Localizable.strings
  • l10n.yaml
  • lib/core/utils/native_sheet_utils.dart
  • lib/features/profile/views/app_customization_page.dart
  • lib/l10n/app_cs.arb
  • lib/l10n/app_de.arb
  • lib/l10n/app_en.arb
  • lib/l10n/app_es.arb
  • lib/l10n/app_fr.arb
  • lib/l10n/app_it.arb
  • lib/l10n/app_ja.arb
  • lib/l10n/app_ko.arb
  • lib/l10n/app_nl.arb
  • lib/l10n/app_pl.arb
  • lib/l10n/app_ru.arb
  • lib/l10n/app_sk.arb
  • lib/l10n/app_zh.arb
  • lib/l10n/app_zh_Hant.arb
  • test/core/utils/polish_localization_test.dart
  • test/features/release_notes/release_notes_localized_layout_test.dart

Comment thread lib/l10n/app_de.arb Outdated
Comment thread lib/l10n/app_pl.arb Outdated
Comment thread lib/l10n/app_sk.arb Outdated
- localize the 'polish' language name per catalog (Polish/Polnisch/Polonais/Poľština/...)
- label the credentials auth mode 'E-mail i hasło' instead of 'Hasło'
- pluralize the active-schedule count in hermesSchedulesSummary (1 aktywny / 2 aktywne / 5 aktywnych)
- use feminine 'Poprzednia' for the previous-version action label
- replace literal 'szybkie pigułki' with 'szybkie akcje'
- reword server-downgrade instruction, shared-chat notice, and direct-connection delete message
- use the official product name 'Open Web UI' in user-facing values
- make the placeholder parity test robust to Dart identity-based set/list equality
@Dragonk

Dragonk commented Aug 6, 2026

Copy link
Copy Markdown
Author

All review points are addressed in commit 1075491 (fix(l10n): address Polish localization review feedback):

  1. P2 — language name per catalog: polish is now localized in every ARB file (de → Polnisch, sk → Poľština, fr → Polonais, cs → Polština, ru → Польский, ja → ポーランド語, ...). The selector renders the active catalog's name.
  2. P2 — credentials label: the Email/password auth-mode segment is now E-mail i hasło (verified against authentication_page.dart where it labels the AuthMode.credentials segment next to SSO/LDAP/Token).
  3. P2 — active-schedule plural: hermesSchedulesSummary now pluralizes active with one/few/many: 1 aktywny · 1 harmonogram, 2 aktywne · 3 harmonogramy, 5 aktywnych · 22 harmonogramy (64 combinations simulated, all grammatical).
  4. P2 — previous version label: previousLabelPoprzednia (verified against assistant_message_widget.dart where it labels the previous_version footer action).
  5. P2 — quick pills: szybkie pigułkiszybkie akcje in appCustomizationSubtitle and quickActionsDescription.
  6. P2 — downgrade wording: serverIncompatibleResolutionobniż wersję serwera do {maxVersion} lub starszej ....
  7. P2 — neutral shared-chat notice: shareChatExistingTen czat ma już link do udostępniania.
  8. P2 — pronoun without antecedent: directConnectionDeleteMessageusunięcie połączenia „{name}” i zapisanych dla niego danych logowania.
  9. P3 — product name: user-facing OpenWebUIOpen Web UI (10 values; key names unchanged).

Verification (real Flutter/Dart toolchain, now installed in the environment):

  • flutter pub get, dart run build_runner build
  • flutter gen-l10n ✅, verify_arb_descriptions.dart ✅, validate_arb_locales.dart ✅ (0 warnings for app_pl.arb)
  • flutter analyze --no-fatal-warnings --no-fatal-infosNo issues found!
  • flutter test test/core/utils/polish_localization_test.dart13/13 passed
  • flutter test test/features/release_notes/release_notes_localized_layout_test.dart14/14 passed (incl. pl)

The full flutter test suite on this branch shows only environment-sensitive failures (performance-budget, timing-race, and golden-pixel tests). The same failures reproduce on a clean upstream/main worktree — e.g. both release-notes golden tests fail there too with pixel diffs from headless font rasterization. None of those files are touched by this PR; all localization tests are green.

Thanks for the thorough review!


Update (CodeRabbit round 2 — commit 881814e)

All three comments from the latest CodeRabbit review are resolved:

  1. credentialsDane logowania — applied (username-inclusive label for the auth-mode segment). Replied in the thread.
  2. workspacePromptHistoryDeleteConfirmMessageTa wersja zostanie usunięta. Tej operacji nie można cofnąć. — applied (cleaner than the literal Ta migawka wersji…; "wersja" matches the "Version history" UI this message is shown in).
  3. channelMembers few branch → członkowie — intentionally not applied: with a digit, Polish requires 2 członków (genitive plural); Dwaj członkowie is only valid with the numeral written as a word. Explained in the PR thread.

Re-validation on the final state (all green):

  • flutter gen-l10n
  • dart run tool/verify_arb_descriptions.dart
  • dart run tool/validate_arb_locales.dart ✅ (0 warnings for app_pl.arb)
  • flutter analyze --no-fatal-warnings --no-fatal-infos → No issues found
  • flutter test test/core/utils/polish_localization_test.dart ✅ (13/13)
  • flutter test test/features/release_notes/release_notes_localized_layout_test.dart ✅ (14/14)
  • git diff --check

@coderabbitai[bot] — could you please re-review? Thanks!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
lib/l10n/app_pl.arb (2)

4868-4868: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Correct the gender of migawka.

Line 4868 uses Ten migawka. Since migawka is feminine, use Ta migawka wersji zostanie usunięta.

Proposed fix
-  "workspacePromptHistoryDeleteConfirmMessage": "Ten migawka wersji zostanie usunięta. Tej operacji nie można cofnąć.",
+  "workspacePromptHistoryDeleteConfirmMessage": "Ta migawka wersji zostanie usunięta. Tej operacji nie można cofnąć.",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/l10n/app_pl.arb` at line 4868, Update the Polish translation value for
workspacePromptHistoryDeleteConfirmMessage to use the feminine demonstrative
“Ta” with “migawka,” preserving the rest of the message unchanged.

2649-2649: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use członkowie for the few plural form.

The few branch currently renders 2–4 członków. For członek, Polish requires członkowie in this branch. Keep członków for the many branch.

Proposed fix
-  "channelMembers": "{count, plural, one{{count} członek} few{{count} członków} many{{count} członków} other{{count} członka}}",
+  "channelMembers": "{count, plural, one{{count} członek} few{{count} członkowie} many{{count} członków} other{{count} członka}}",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/l10n/app_pl.arb` at line 2649, Update the channelMembers localization
entry so its few plural branch uses “członkowie” instead of “członków”; preserve
“członków” for the many branch and leave the other plural forms unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@lib/l10n/app_pl.arb`:
- Line 408: Update the "credentials" localization value in the Polish catalog to
use a username-inclusive label such as "Dane logowania" instead of referring
only to email and password.

---

Outside diff comments:
In `@lib/l10n/app_pl.arb`:
- Line 4868: Update the Polish translation value for
workspacePromptHistoryDeleteConfirmMessage to use the feminine demonstrative
“Ta” with “migawka,” preserving the rest of the message unchanged.
- Line 2649: Update the channelMembers localization entry so its few plural
branch uses “członkowie” instead of “członków”; preserve “członków” for the many
branch and leave the other plural forms unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: c05f3b79-f256-4ed9-b970-63c4c7a81eb9

📥 Commits

Reviewing files that changed from the base of the PR and between 51fb4c6 and 1075491.

📒 Files selected for processing (15)
  • lib/l10n/app_cs.arb
  • lib/l10n/app_de.arb
  • lib/l10n/app_en.arb
  • lib/l10n/app_es.arb
  • lib/l10n/app_fr.arb
  • lib/l10n/app_it.arb
  • lib/l10n/app_ja.arb
  • lib/l10n/app_ko.arb
  • lib/l10n/app_nl.arb
  • lib/l10n/app_pl.arb
  • lib/l10n/app_ru.arb
  • lib/l10n/app_sk.arb
  • lib/l10n/app_zh.arb
  • lib/l10n/app_zh_Hant.arb
  • test/core/utils/polish_localization_test.dart

Comment thread lib/l10n/app_pl.arb Outdated
- use a username-inclusive label 'Dane logowania' for the credentials auth mode
- reword the prompt version delete confirmation to 'Ta wersja zostanie usunięta'
- keep channelMembers plural forms unchanged (with digits, '2 członków' is correct, not '2 członkowie')

Assisted-by: Open WebUI
@Dragonk

Dragonk commented Aug 6, 2026

Copy link
Copy Markdown
Author

Thanks for flagging the channelMembers plural suggestion (use członkowie in the few branch). I verified the Polish numeral construction and the suggestion is linguistically incorrect, so I'm leaving the translation unchanged.

With a numeral written as a digit, the correct forms are:

  • 1 członek
  • 2 członków
  • 3 członków
  • 4 członków
  • 5 członków
  • 22 członków

Dwaj członkowie would only be valid when the numeral is written as a word (dwaj), which is never the case here — {count} is always rendered as a digit. The few branch (2–4, 22–24, …) must use the genitive plural członków, exactly as implemented, and the existing test asserts 2 członków / 5 członków / 22 członków.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

@Dragonk, thanks for the detailed update. I will re-review the final PR state, including the Polish plural handling for channelMembers.

🐇 ✅


✏️ Learnings added
Learnt from: Dragonk
URL: https://github.com/cogwheel0/conduit/pull/617

Timestamp: 2026-08-06T07:46:01.943Z
Learning: In `lib/l10n/app_pl.arb`, when `channelMembers` renders `{count}` as a digit, Polish requires the genitive plural `członków` for the `few` and `many` plural categories (for example, `2 członków`, `5 członków`, and `22 członków`). The nominative form `członkowie` applies with certain numeral words, such as `dwaj`, but not with digit-rendered counts.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

⚠️ Action not completed

No files to review.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] Add Polish localization

1 participant