Skip to content

Feature/finnish UI - #156

Merged
21cncstudio merged 38 commits into
21cncstudio:mainfrom
cuzom-dev:feature/finnish-ui
Sep 19, 2026
Merged

21cncstudio merged 38 commits into
21cncstudio:mainfrom
cuzom-dev:feature/finnish-ui

Conversation

@harrikauhanen

@harrikauhanen harrikauhanen commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

What

Adds Finnish as UI language on the device. The new FI value is wired into the config enum, the string lookup, the language cycle and the settings label, and Finnish is included in the Latin glyph coverage check and the README language list.

  • src/ui/strings/UiStrings.fi.inc — new, 340 strings
  • src/config/AppConfig.h, src/ui/UiStrings.cpp, src/ui/UiLocalization.cpp — language wiring
  • tools/check_ui_font_coverage.py, README.md — include Finnish

No font regeneration is needed: the existing JetBrains Mono subsets already cover Ä and Ö, and the translation avoids Å/å, which the fonts do not contain.

Fitting the fixed-size labels

Finnish words are long, so several strings are written to fit the EEZ layout rather than translated literally. Every sensor info page was checked against screens.c: the body text must stay within six lines of the 760 px label before the threshold list, and threshold lines must not run under the tab buttons or past the right screen edge.

Two places where the Finnish word does not fit have a short comment in the string table explaining the choice:

  • the settings button (70 px) uses VALIKKO; ASETUKSET is clipped
  • the card unit label (40 px) keeps Index; Indeksi wraps. The other Latin-script locales keep Index as well

Out of scope

While reviewing the UI I found strings that no language can translate, because they are hardcoded in screens.c or built in C++: the GRAPH, LOGS and UNITS buttons, the LOG: and LANGUAGE: titles, and the optional gas page in UiOptionalGasProfile.cpp.

This PR is strictly "translation only".

Checklist

  • I understand that this PR cannot be merged until every contributor completes the CLA check.
  • I disclosed any third-party material and employer or organisation rights affecting this PR.
  • I tested my changes or explained why tests are not applicable.
  • I updated documentation if needed.

harrikauhanen and others added 30 commits September 15, 2026 11:26
Add a Finnish string table and wire the FI language into the config enum,
string lookup, language cycle and settings label. The existing JetBrains
Mono font subsets already cover Ä/Ö, so no font regeneration is needed;
the translation avoids Å/å, which the fonts do not contain.

Include Finnish in the Latin glyph coverage check and README language list.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
"LÄMPENEE" read as a temperature change and could look like a fault.
Use "KÄYNNISTYY" for the warmup label on the VOC, NOx, HCHO and CO
cards; it fits the 120 px label on one line. Match the VOC and NOx
help texts to the English "Blue indicator = sensor warming up."
wording with "anturi on käynnistysvaiheessa".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Add short comments to the Finnish string table: 'Index' is kept for
UnitIndex and 'VALIKKO' for the settings button because 'Indeksi' and
'ASETUKSET' do not fit their fixed-width labels.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Name hiilidioksidi before the CO₂ abbreviation, as the CO text already
does for häkä, and smooth the remaining sentences: state the outdoor
level as a concentration, drop the semicolon and vary the wording.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Use viihtyvyys for comfort to match lämpöviihtyvyys, replace the
technical optimialue and ääriarvot with plain wording, and say
lämpöolosuhteet in the closing sentence. The meaning of the English
source is unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The main text wrapped to seven lines and ran into the thresholds list,
which only leaves room for six. Tighten and smooth the wording
(ilmankosteus, ihannealue, fewer repeated verbs) so it fits.

Shorten the Excellent line so it no longer extends under the AH and RH
buttons.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The main text wrapped to seven lines; tighten and smooth it so it fits
in six, using the same ihannealue and viihtyvyys wording as the other
info pages. Use ihanteellinen on the Excellent line.

Spell out the title as ABSOLUUTTINEN KOSTEUS. The AH page has no graph,
and like the German and Dutch titles it wraps to two lines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
ABSOLUUTTINEN KOSTEUS wraps to two lines in the sensor info title on
the device, which looks broken. Restore ABSOL. KOSTEUS and note why in
a short comment.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The main text needed a seventh line in the conservative wrap estimate.
Fold the ASHRAE 55 note into one compound word so it fits in six.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The main text wrapped to seven lines. Join the SGP algorithm and
baseline sentences and drop the self-evident higher-value sentence so
it fits in six. Smooth the Uncomfortable line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The main text wrapped to seven lines and the Poor line ran past the
right screen edge. Tighten both and smooth the other threshold lines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The main text wrapped to seven lines. Shorten two sentences so it fits
in six, and smooth the Excellent line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Replace the odd sakkoja wording with plain Finnish and rephrase the
closing advice. The text still fits in six lines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The earlier wording changes made the main text wrap to seven lines.
Name UBA without the long agency name, as the German and Dutch texts
do, and use CO₂-pitoisuus so it fits in six. Use ihanteellinen on the
Excellent line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
List the sources and diseases in natural Finnish and fix the adverb
ending on the Uncomfortable line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Replace the semicolon with a separate sentence, use siitepölyn palaset,
and fix the adverb ending on the Uncomfortable line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The main text needed a seventh line in the conservative wrap estimate.
Give the sentences subjects, shorten the AQI reference so it fits in six,
and align the threshold lines with the PM2.5 wording.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Rephrase the most-dangerous sentence, replace the semicolon, and fix
the adverb ending on the Uncomfortable line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Give the measurement sentence a subject and fix the Acceptable line,
which said normal indoor air activity instead of normal indoor activity.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Name ilmanpaine explicitly, say herkille ihmisille in plain Finnish and
rephrase the Excellent and Poor lines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Replace paljastaa säätrendit with plain wording and fix the adverb
endings on the threshold lines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Fix the awkward mahdollisesti and todennäköisesti endings on the relative
and absolute humidity threshold lines. The RH Acceptable line also moves
further from the right screen edge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The main text needed a seventh line in the conservative wrap estimate.
Shorten the comparison and sweating sentences so it fits in six, and
use the viihtyvyys and miellyttävä wording from the other pages.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Simplify the conditions wording, end with a plain purpose clause, and
use vähennä instead of alenna on the Uncomfortable line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Say mahdollisia instead of todennäköisiä on the Poor line; the Finnish
word sounded stronger than the English likely. Replace the clumsy
Hajuja voi havaita with Hajuja saattaa esiintyä.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Split the long sentences: state the scale and then say mitä pienempi
luku, sitä parempi ilma as its own sentence, and say AQI huomioi
instead of arvo reagoi. Replace saastekuorma on the Uncomfortable line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Finnish saaste suggests industrial pollution, which is misleading for
indoor air. Use epäpuhtaus on the AQI page and in the PM2.5 and PM4
source lists; the NOx page already says päästöt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The PM pages measure particles, so outdoor pollution reads better as
ulkoilman hiukkaset than the general epäpuhtaudet. The AQI page keeps
epäpuhtaus because it combines particles and gases.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Two sentences in a row started with Ne, so the reader could lose track
of what they refer to. Say PM10-hiukkaset once and drop siitepöly from
the source list, where the opening sentence already mentions it, to keep
the text within six lines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
The opening sentence read oddly; say that the shifts can affect
well-being instead of listing sudden effects on it. Say mahdollisia
instead of todennäköisiä on the Poor line, as on the VOC page.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
harrikauhanen and others added 3 commits September 18, 2026 10:32
Say mahdollisia instead of todennäköisiä, matching the 3-hour pressure
and VOC pages.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Use mahdollinen on the middle threshold; the line already states the
dryness or mugginess, so todennäköinen read stronger than needed. The
Poor lines keep todennäköisiä, where the English likely is warranted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Say mahdollisia for the respiratory and skin symptoms. The relative
humidity Poor line keeps todennäköisiä because it also covers mold
growth, as does the mold risk page.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
@github-actions

github-actions Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

All contributors have signed the Project Aura CLA.
Posted by the CLA Assistant Lite bot.

@harrikauhanen

Copy link
Copy Markdown
Contributor Author

I have read and agree to the Project Aura Individual Contributor License Agreement v2.0, and I hereby sign it.

harrikauhanen and others added 5 commits September 18, 2026 11:30
Finnish readers know häkä, hiilidioksidi and formaldehydi better than the
CO, CO2 and HCHO abbreviations, so lead with the word and keep the
abbreviation in brackets. The longest line is 47 of the roughly 50
characters that fit beside the settings button, and the messages keep
plain CO2 because the subscript glyph is missing from the 14 px font.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Häkävaroitin is the established Finnish word for a CO alarm. The line
would exceed the space beside the settings button with the abbreviation,
so drop it here; the other two CO messages still carry it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Häkää (CO) koholla read awkwardly. Häkäpitoisuus koholla is plain
Finnish and sits between the detected and danger messages, matching the
English elevated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
All three messages now name häkä and carry (CO). The detected line uses a
comma so häkävaroitin still fits the 50 characters available beside the
settings button.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
Kosketus: is 99 px wide but the value starts 71 px after the label, so
the two overlapped on screen, and the word does not work in this
technical context. Keep the English word and note why in a comment.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0144uinNbUzZTQeatuAk9ei3
@harrikauhanen
harrikauhanen marked this pull request as ready for review September 18, 2026 08:57
@21cncstudio
21cncstudio merged commit 4e471a5 into 21cncstudio:main Sep 19, 2026
1 check passed
@github-actions github-actions Bot locked and limited conversation to collaborators Sep 19, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants