Translation status

10 Strings
10%
1,782 Words
1%
10,892 Characters
1%

Other components

Component Translated Unfinished Unfinished words Unfinished characters Untranslated Checks Suggestions Comments
DeepSix App 20% 5,258 35,714 209,776 5,254 27 1 0
Help 0% 866 27,701 163,593 0 0 0 0

Summary

Project website deepsixdive.com
Instructions for translators

DeepSix Voice Guide for Translators

Audience: Anyone translating DeepSix's source strings into a non-English locale via Weblate (translate.deepsixdive.com). Status: Living doc. The first round (v1.0 — Roy van der Valk, Dutch, 2026-05-28) is the test case. Patterns confirmed in v1 will harden into rules; ambiguous cases will get spelled out as we hit them.

This file is published as the project description on Weblate and is the first thing a new translator reads. It pairs with the glossary component (dive-glossary.tbx) which carries terminology rules.


The big picture

DeepSix is a dive memory system — a "dive log app" reframed around capturing and presenting the meaning of a dive, not just its data. The copy reflects that. We're not a chatty consumer toy ("Wow, you logged 5 dives!"); we're not a pro-tool spreadsheet ("Records: 5"); we're somewhere in between — friendly enough to feel like an app you'd send a tester home with, precise enough that a technical diver doesn't roll their eyes.

The five tenets the app is built on bleed directly into the copy:

  1. Aggregation & presentation — copy should make data legible, not decorative
  2. Data fidelity as user trust — never round, never silently lose, never overclaim
  3. Immutability — never paraphrase past events ("Logged dive #5 on Mar 17" not "Your dive on Mar 17")
  4. Offline-first — copy degrades gracefully when offline ("Will sync when online" not "Failed")
  5. Accuracy over completeness — "Approximately 25 m" beats "25 m" when the underlying data is interpolated

When in doubt, ask: would a careful diver who reads instrument labels in the wild trust this copy?


Tone

Friendly-technical. Warm enough to acknowledge the user is a person, precise enough to be trusted with their dive data.

Right:

  • Saved your gear list. We'll remember it for next trip.
  • No dives yet — let's log your first one.
  • Looks like 2 dives are missing depth data — want to estimate from your computer's profile?

Wrong:

  • Gear saved!! 🎉 (too consumer-toy)
  • Gear list saved. (too terse for greetings/empty states; OK for system result toasts — see Voice below)
  • Your gear configuration data has been persisted to local storage. (over-precise; reads as developer noise)

The "we" voice appears in framing copy — settings save toasts, empty states, onboarding moments where tone matters. Direct address ("you", "we'll") is allowed there. It does NOT appear in action confirmations or result toasts (see Voice).


Voice

Imperative for actions. System-as-actor for results. Don't address the user as the subject of an action.

Surface Pattern Example
Button labels Verb, no subject Save, Delete, Add Dive, Cancel
Confirmation dialogs Question + caveat Delete this dive? / This action can't be undone.
Result toasts System narrates its own action Dive deleted., 3 photos imported., Saved.
Empty states Friendly invitation No dives yet — let's log your first one.
Loading System action, present tense, ellipsis Analyzing photo 1 of 5…
Errors Honest description + (where possible) suggested action Couldn't reach iCloud. Will retry when online.

Don't write You deleted this dive. or We removed 3 photos. in result toasts — the result toast describes what happened to the data, not who did it. The framing tone is "we" / "you"; the action results are "Saved" / "Deleted" / "Removed N items."


Terminology

Dive computer + decompression terms appear with the native term first, English in parentheses on first occurrence on each screen. Subsequent mentions on the same screen use just the native term.

English Dutch German Pattern
NDL (No Decompression Limit) Geen-deco-limiet (NDL) Nullzeit (NDL) Native + English-parens
CNS Centraal zenuwstelsel (CNS) ZNS (CNS) Native + English-parens
SAC / RMV Gasverbruik (SAC) / Ademvolume (RMV) Atemminutenvolumen (RMV) Native + English-parens
Buhlmann ZHL-16C Buhlmann ZHL-16C Buhlmann ZHL-16C Proper name — keep English
EAN32, Nitrox 32 Nitrox 32 (EAN32) Nitrox 32 (EAN32) Industry name + technical-parens
Trimix 18/45 Trimix 18/45 Trimix 18/45 Mix shorthand — keep English
GF 30/85, Gradient Factors Gradiëntfactoren (GF) Gradientenfaktoren (GF) Native + English-parens
Setpoint, PPO₂ Setpoint (instelpunt), PPO₂ Sollwert (Setpoint), PPO₂ English-first OK when it's the industry standard the diver sees on their computer

Rule of thumb: if the term appears on the user's dive computer in English (Shearwater, Garmin, Suunto, all English by default in most regions), the English form needs to be visible in the app too — even when wrapped in a native explanation. A diver should be able to map the app's display back to what their computer shows them.

The full never-translate + translate-carefully list lives in dive-glossary.tbx and is loaded into Weblate's glossary component. Translators see inline glossary hints when a glossary term appears in a string they're translating.


Uncertainty

When a value is approximate, estimated, or unknown, use symbol prefixes for compactness:

Meaning Symbol Example
Approximately (rounded for display) ≈ ≈ 25 m, ≈ 3 min
Estimated (interpolated / inferred) ~ ~18 min bottom time
Unknown / no data — (em dash) Stats row: Water temp: —

Localize the prefix character to whatever your locale convention is — e.g., a locale where ~ reads ambiguously can swap to a different glyph. But preserve the visual hierarchy: prefix → value → unit. Don't suffix the qualifier (avoid 25 m (est.)); the symbol prefix reads scannable in tight stats grids.

Accessibility labels (VoiceOver / TalkBack) should spell out the qualifier even though the visual is symbolic: Approximately 25 meters, Estimated 18 minutes, Unknown water temperature. xcstrings handles this via separate accessibilityLabel keys where it matters.


Plurals

DeepSix uses xcstrings native variations.plural for all count-bearing strings. Do not write English-style suffix mechanisms (dive%@ for dive / dives) — those are bugs being progressively removed from the source catalog.

Your locale will see CLDR plural categories. Fill the ones your locale needs:

  • Dutch, German, Spanish, French, English, Italian, Portuguese — one (n=1) + other (everything else)
  • Polish — one + few + many
  • Russian — one + few + many
  • Arabic — zero + one + two + few + many + other
  • Japanese, Chinese, Korean, Vietnamese, Thai — other only (no grammatical plural)

If a category isn't in your locale's CLDR rule, Weblate hides it. You only fill what's relevant.


Numbers, units, and formatting

DeepSix already converts SI ↔ imperial at the display layer via UnitPreferences — translators don't pick units. Do translate:

  • Number formatting (thousands separator, decimal point) — these follow the user's locale automatically via NumberFormatter, you don't need to do anything
  • Unit labels (m, ft, °C, °F, bar, psi, kg, lb) — keep these in their canonical SI form unless your locale has a strong convention otherwise (e.g., Spanish dive community uses "m" not "metros" for depth)
  • Time formatting (durations like 18 min, 1 h 23 min) — translate the unit shortcuts to your locale's conventional abbreviation

Don't translate:

  • Numbers themselves
  • Format-specifier characters in source strings (%lld, %@, %.1f)
  • File format names (UDDF, FIT, CSV, XML, JSON)
  • Vendor names (Shearwater, Suunto, Garmin, MacDive, Subsurface)

Honesty patterns

Per the accuracy tenet, copy never overclaims. Translate these patterns carefully — the exact language matters:

Source pattern Why it matters Translate by preserving
Approximately, Estimated We're saying "we calculated this, it might be off" The qualifier; never silently drop it
Couldn't…, Failed to… We're admitting a failure, not blaming Don't shift to user-blame ("You failed to…")
Will sync when online Honest deferral, not failure Preserve the eventual-success framing
Possibly, Likely, Probably Confidence calibration Match the locale's confidence vocabulary; don't strengthen ("Definitely")
Unknown, No data Honest absence Don't fill with placeholder content ("None recorded yet" only when it's a meaningful invitation)

If a source string seems to overclaim in English, flag it via Weblate comment — it's probably a source bug.


When to ask vs guess

Use Weblate's source-string comment ("Add comment") to flag:

  • A source string that's structurally broken (e.g., another word%@-as-plural-suffix string we missed; an unclear placeholder; gender assumptions in English that don't map to your locale's grammar)
  • A glossary entry that's wrong for your locale
  • Multiple plausible translations where context isn't clear

Don't guess silently. The source-string author (often Rick + Claude in this codebase) sees the comments and either fixes the source or replies with context.


What's NOT translated (excluded entirely)

These keys are marked shouldTranslate: false in Localizable.xcstrings and don't appear in Weblate at all:

  • Debug log strings (developer-mode only)
  • Format identifiers (UDDF, FIT, ZHL-16C, etc. — these are protocol/spec names)
  • One-off developer-mode UI strings

If a string you'd expect to see is missing from Weblate, it's been deliberately excluded. If it should be visible, surface to Rick — it may be a tagging mistake.


Cross-references

  • dive-glossary.tbx — terminology dictionary (loaded into Weblate's Glossary component)
  • Scripts/sync_translations.py — the deeplog ↔ deepsix-translations broker
  • Scripts/verify_translations.py — automated checks (placeholder integrity, glossary compliance, optional AI consistency review)
  • deepsix-translation-tiers-spec.md — Core / Full / Excluded tiering for release inclusion
  • DeepSix product tenets (5 in total) — referenced at the top of this doc; see user_product_vision.md if you have access

This guide is living. If a pattern surfaces that this doc doesn't cover, surface it via Weblate comment and we'll add it. v1.0, 2026-05-29.

Translation license proprietary
Translation process
  • Translations can be made directly.
  • Translation suggestions can be made.
  • Any authenticated user can contribute.
  • The translation uses monolingual files.
  • The translation base language is editable.

Reviews are disabled for this language. Review setting: Project settings.

All translation states, including those needing editing, are eligible to be written to the translation file.

Learn how to customize the workflow for this language.

Source code repository https://gitea.bollar.com/rick/deepsix-translations.git
Repository branch main
Last remote commit help: refresh en.xliff source from articles 9c87ceb
Rick Bollar authored 10/16/2026
Last commit in Weblate Translated using Weblate (English (Simplified) (en-001)) 0c24d5a
User avatar admin authored 10/15/2026
Weblate repository https://translate.deepsixdive.com/git/deepsix/app/
File mask appstore/*
Monolingual base language file appstore/en-US
Translation file Download appstore/de-DE
Last change Oct. 14, 2026, 12:40 a.m.
Last change made by Gitea webhook
Language German
Language code de
Text direction Left to right
Case sensitivity Case-sensitive
Number of speakers 141,873,196
Number of plurals 2
Plural type One/other
Plurals Singular 1
Plural 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, …
Plural formula n != 1
10/14/2026

String statistics

Strings percent Hosted strings Words percent Hosted words Characters percent Hosted characters
Total 10 1,782 10,892
Translated 20% 2 1% 6 1% 39
Needs editing 40% 4 53% 954 54% 5,908
Read-only 0% 0 0% 0 0% 0
Failing checks 50% 5 53% 957 54% 5,931
Strings with suggestions 0% 0 0% 0 0% 0
Untranslated strings 40% 4 46% 822 45% 4,945

Quick numbers

1,782
Hosted words
10
Hosted strings
20%
Translated
and previous 30 days

Trends of last 30 days

+64%
Hosted words
+100%
+40%
Hosted strings
+100%
+20%
Translated
—
+50%
Contributors
+100%
User avatar webhook:gitea

Resource updated

The “appstore/en-US” file was changed. 10/14/2026
User avatar webhook:gitea

String added in the repository

 
10/14/2026
User avatar webhook:gitea

String updated in the repository

10/14/2026
User avatar webhook:gitea

Resource updated

The “appstore/en-US” file was changed. 10/13/2026
User avatar webhook:gitea

String updated in the repository

10/13/2026
User avatar webhook:gitea

Source string changed

10/13/2026
User avatar webhook:gitea

String updated in the repository

 
10/13/2026
User avatar webhook:gitea

String updated in the repository

10/13/2026
User avatar webhook:gitea

Source string changed

10/13/2026
User avatar webhook:gitea

String updated in the repository

10/13/2026
Browse all translation changes