i18n: decide the localization approach before extracting UI strings
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 35/100
- Issue type
- Feature
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- csharp
- Domain
- desktop, documentation, internationalization
Research direction
Read the existing placeholder-string precedent in src/LageBuch.Persistence/MasterData/MasterDataSet.cs:163 and inspect the German literals in src/ and the 23 .axaml files. Compare the listed localization mechanisms, scope, fallback, translator workflow, and migration options; the issue does not specify an implementation choice. Done means recording the decision in docs/ or this issue and converting one view end to end as a reference.
Written by the indexing model from the issue text.
Description
The org profile says applications "can be translated into other languages". The
code cannot, yet. There is no localization infrastructure at all:
- zero
.resxfiles undersrc/ - no
ILocalizer, no localization service, no string keys inDynamicResource - German sits as literal
Text="…"andContent="…"in 23.axamlfiles, and
in German string literals inside view models and domain code
The one partial precedent is AnonymizedExampleData in
src/LageBuch.Persistence/MasterData/MasterDataSet.cs:163, which centralizes
placeholder strings as constants and is bound from XAML with {x:Static md:…}.
Ten view files already use it.
Why this is a design issue and not a chore
It is tempting to start extracting literals into constant classes view by view,
and that is exactly the trap. Constants are not translatable. Doing the
extraction first means doing it twice, and the second pass has to touch every
file the first one did.
So: decide the approach, then extract. That is why this issue exists and why the
per-view extraction tasks are not filed yet.
What needs deciding
- Mechanism.
.resxwith the standard .NETResourceManager, an Avalonia
DynamicResourcebased scheme so the language can change without a restart,
or a third-party library. Each has a different story for XAML binding, for
designer support, and for how a translator supplies a file. - Scope. UI strings only, or also the German wording that reaches the PDF
report and the ETB entries. The domain layer currently produces German text
directly, for exampleFormattingandCoMeasurementLabels. Some of that is
arguably domain vocabulary rather than UI copy. - Fallback and default. German stays the default. What happens for a missing
key in another language. - Translator workflow. A plain file in the repo, or a platform such as
Weblate. This decides whether a non-developer can contribute a translation,
which is the whole point. - Migration order. Which view goes first as the proof of concept.
Output
A short design note in docs/, or a decision recorded in this issue, plus one
view converted end to end as the reference implementation. The remaining views
then become genuine good-first-issues that all follow the same pattern.
Opinions from anyone who has localized an Avalonia app are very welcome.
New here?
Comment to claim this issue and it is yours. If no pull request appears within
seven days it goes back in the pool, no hard feelings.
Before you open the PR, please skim CONTRIBUTING.md:
commits need DCO sign-off (git commit -s) and a Conventional Commit subject.
Changes under src/ additionally need an entry under ## [Unreleased] in
CHANGELOG.md — CI fails the PR otherwise.
Questions are welcome right here or in
Discussions.
- Dominant language
- C#
- Stars
- 1
- Forks
- 3
- Avg merge
- 5h 26m
- Merged PRs (30d)
- 196
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from CodeForFire/lagebuch
-
Stammdaten: in the Checkliste editor the PFLICHT header is not aligned with its columnPossibly taken @Saad-elnagar claimed this 5 days ago. Openbug ux
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
CodeForFire/lagebuch#714 · 1 comment ·
Maintainers usually reply within 1 day
-
Stammdaten: on a phone the Fahrzeuge editor squeezes Wache and Funkrufname to nothingPossibly taken @Saad-elnagar claimed this 5 days ago. Openbug ux
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
CodeForFire/lagebuch#713 · 1 comment ·
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
CodeForFire/lagebuch#405 ·
Maintainers usually reply within 1 day
-
documentation good first issue
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
CodeForFire/lagebuch#349 ·
Maintainers usually reply within 1 day
-
documentation good first issue
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
CodeForFire/lagebuch#348 ·
Maintainers usually reply within 1 day
All issues in CodeForFire/lagebuch
Similar issues
-
track:release
Difficulty 2/5 1-3 hours Newbie friendliness 80/100
-
[Bug] [Go] Ack returns nil when the server answers with a non-OK statusPossibly taken @leizhiyuan claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
apache/rocketmq-clients#1465 ·
Maintainers usually reply within 2 days
-
fix(testing): HeadlessTerminal disposes services synchronouslyPossibly taken @zidad claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 69/100
RazorConsole/RazorConsole#388 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
starlinghq/starling#209 ·
Maintainers usually reply within 1 day