| D-M4-06-0 |
2026-10-15 |
The ticket was built on an integration base and ported onto main with only its own commits; the English docs and spec of main win, and text this ticket adds is English. The base's first commit (the language-check markers around the term table of 01 section 9) is left out because main has them. The port adds path: packages/l10n/lib/l10n/app_de.arb and path: packages/l10n/lib/src/generated/app_localizations_de.dart to tools/docs/language-allow.txt with the comment "German product strings of the de locale (D-W-94, M4-06)". |
The tickets are built in parallel on integration bases; main takes each ticket as one pull request; the language gate of main must not reject the German product strings. |
| D-M4-06-1 |
2026-10-15 |
app_en.arb is the template of flutter gen-l10n, German stays the default locale: preferred-supported-locales: [de] puts de first in supportedLocales, and resolveAppLocale falls back to de. l10n.yaml has no synthetic-package line: Flutter 3.47.7 rejects the option as removed (output into lib/src/generated/ is the only mode). |
Code and reviewers read English (D-W-94); 01 section 9 makes German the default. |
| D-M4-06-2 |
2026-10-15 |
The generation check is part of make codegen-check: for each Dart member with an l10n.yaml (SKIP codegen-dart when none or when apps is not selected), tools/ci/l10n_check.py copies pubspec.yaml, l10n.yaml and the ARB directory into a temporary directory, adds an untranslated-messages-file to the copied l10n.yaml (the generator ignores command-line options while an l10n.yaml exists), runs flutter gen-l10n there, and fails when the file lists a message or when lib/src/generated/ differs from the fresh output. The member is never written. |
A missing translation breaks the build and a stale generation fails (brief note 2), without touching the working tree. |
| D-M4-06-3 |
2026-10-15 |
Emoji are the code points of Extended_Pictographic (Unicode 13.0 emoji-data.txt, taken from the Unicode Character Database of Perl 5.34), the regional indicators U+1F1E6 to U+1F1FF and U+FE0F, kept in one constant emojiRanges of test/support/arb_rules.dart. The fixtures write the dash and the emoji as JSON escapes, so the fixture files pass the repository's text rules while the parsed values hold the characters. |
The property reserves the unassigned code points of the emoji blocks, so later emoji fall inside the ranges; escapes keep the text-rules hook valid for every file. |
| D-M4-06-4 |
2026-10-15 |
The term check runs from English to German: an English message with a term of the table as a whole word (case-insensitive, plural s) needs the German term of the row or its stem (without a final en, e, n or s) in the German message of the same key. Rows with alternatives become one pair each, a parenthesis in the German cell is a note. The generator is a Dart tool (packages/l10n/tool/term_table.dart) that test/term_table_test.dart also runs as the check, reading the chapter by walking up to the repository root; it reads docs/spec/01-product.md. |
The template is English (brief note 4); a Dart tool keeps the Markdown parsing next to its only consumer without a new Python tool package. |
| D-M4-06-5 |
2026-10-15 |
problemText maps every code of x-problem-codes and these reasons to their own messages: forbidden with capability_missing, level_insufficient, owner_only and view_as_read_only (07 section 4.1), channel_read_only with channel_archived and agent_invocation_denied with project_not_ready (docs/api/openapi.yaml); an unknown reason keeps the text of the code, an unknown code gives problemFallback(code). not_found reads "Not found or no access" (01 section 6.7). |
Brief note 5; the reasons are the ones the specification names with a user-facing meaning. |
| D-M4-06-6 |
2026-10-15 |
L10nFormat has two duration forms instead of the one durationShort of the brief: elapsed is the running clock of the live box (4:12, 1:02:03) and durationShort the finished duration (42 s, 28 min, 2 h 5 min). money joins number and currency code with a non-breaking space in the order of 01 section 9 (1,84 USD, USD 1.84) and takes the decimals of the currency from intl. relativeDay gives "Today", "Yesterday", the weekday for the five days before and the medium date otherwise, all in the given IANA time zone (timezone package, BSD-2-Clause). |
The screens of 01 show both forms (in English Running 4:12 and Ran 28 min); one function cannot tell a running from a finished run. |
| D-M4-06-7 |
2026-10-15 |
First keys: the trigger labels of components.md section 5 with the German texts of that table, the live box state words, reasons, stop button, earlier-steps link and stall banner (plurals) of section 2.1, "Not found or no access", "No access anymore", "Sending", "Sending delayed", "Offline", "Today" and "Yesterday", the problem texts and problemFallback. "Sending delayed" has no wording in 01 yet; the key follows the brief. |
Brief note 8: the keys M4-07 and M4-18 need first. |
| D-M4-06-8 |
2026-10-16 |
packages/*/tool/** is out of the Sonar coverage measure (sonar.coverage.exclusions); it stays in the analysis for issues. |
tool/term_table.dart is tested in-process by test/term_table_test.dart, but flutter test --coverage writes LCOV only for the files under lib/, so SonarQube Cloud counted the whole script as uncovered new code (64.6 % on the pull request, below quality.sonar.new_coverage_min_percent). |