Skip to content

Translating Budvo

Budvo is translated by the people who use it. Every string in the dashboard, the iPhone app and the messages the server writes lives in one English catalog, and the translation hub shows how far along each language is. You don't need an account: pick a language, translate, and send it in with your name.

Two ways to contribute

In the browser. Open your language on the hub (or start a new one by its code, like sv or pt-PT). The page lists what's missing, what's outdated (the English changed since it was translated) and what a machine drafted and nobody has checked yet. Fill in the strings you know, and each one is checked as you type.

With a file. Download the English source from the hub (/api/translations/source). It has every string plus a description of what it is, where it appears and how long it should be. Translate in any editor and upload either a plain object of key: text, or a whole language pack (for example the current pack for your language, downloaded from its page and edited).

json
{  "common.save": "Enregistrer",  "settings.language.update": "Mettre à jour vers {version}"}

Keys stay exactly as they are; only the text changes. Leave out anything you haven't translated: it shows in English until someone does.

Placeholders

Words in braces are filled in by Budvo: {version}, {name}, {amount}. Keep each placeholder exactly as written, with the same name, and move it wherever your language puts it. Don't translate the name inside the braces.

text
English:  Update to {version}French:   Mettre à jour vers {version}

A translation with a missing, renamed or extra placeholder is refused, with the reason next to the string.

Plurals

Counts use ICU plural syntax. The English lists the forms English needs, and you write the forms your language needs. French treats 0 and 1 as singular, and adds many for very large round numbers:

text
English:  {count, plural, one {# bill due} other {# bills due}}French:   {count, plural, one {# facture à payer} many {# de factures à payer} other {# factures à payer}}
  • # is the number, formatted for your language.
  • =0 matches exactly zero and wins over the categories: {count, plural, =0 {Aucune facture} one {# facture} other {# factures}}.
  • The categories are zero, one, two, few, many and other. other is always required. Japanese only needs other; Arabic uses all six.
  • select picks text by a value Budvo sends (like a role). Keep its option names as in the English; you can leave some out, and they fall back to other.

A plain apostrophe is just an apostrophe: l'argent needs no escaping. To show a literal brace, write '{' or '}'.

What not to translate

Some things never go in the catalog, so you won't find them there, and they shouldn't appear in your translations either:

  • Money, dates and times. Budvo formats them for the household's region and passes them in as placeholders ({amount}, {date}). Never write a currency symbol or a month name into a string.
  • Brand and product names. Budvo, NullDaily, Claude, ChatGPT and bank names stay as they are.
  • People's own data. Account names, payees and categories people created are passed in as placeholders.
  • Technical identifiers. Codes, file names, CSV headers and addresses stay in English.

Plain text only

Translations are plain text. HTML tags, HTML entities like &, links the English doesn't have, invisible control characters and text-direction overrides are refused. Characters your language needs, like zero-width joiners and right-to-left marks, are fine. A string can be at most three times as long as the English plus 60 characters; the hub also warns when a button or label goes past the length it usually fits in.

Review and official status

Every submission waits in a review queue. A reviewer sees the English, the current translation and yours side by side, and accepts all of it, some of it, or none. Accepted strings go into the language's community pack straight away, and its version goes up.

Each language on the hub shows one badge:

  • Official: reviewed and signed by NullDaily. Servers verify the signature before they install it.
  • Community: at least half translated by volunteers, not signed.
  • Needs contributors: under half, including languages nobody has started.

A language can also say Machine drafted: some of its strings were drafted by a machine and are waiting for a person to check them. Correcting or confirming those is one of the most useful things you can do.

How servers get languages

A Budvo server owner chooses languages in Settings, Language. The server reads the hub's feed (/api/translations), shows each language's badge and completeness, and installs the pack. Community packs ask for a confirmation first, since nobody at NullDaily has signed them. Owners can also upload a pack file by hand. Anything a pack doesn't translate shows in English, and a pack only ever changes text.