MSaving

Languages

Vietnamese first, English second: screens, errors, export, the setup guide.

Vietnamese first, English second. How it works:

  • users.language: vi (the default) or en. Chosen before sign-up (the screens before sign-in open in Vietnamese with a switch to English, remembered in the browser), saved with the account, and changeable in Profile. Everything the app writes for the user follows it; nothing stored in the ledger is translated.
  • No email, so no email templates.
  • Screens: one string file per language (web/src/i18n/vi.json, en.json), shared with mobile later. The tests fail if the two files don’t have the same keys. Numbers, dates and money use the language’s locale through Intl (1.250.000 ₫ in Vietnamese, 1,250,000 ₫ in English). Amount fields group thousands while typing and parse by the same locale and the currency’s decimals, so “1.250” typed in Vietnamese for VND is 1250, not 1.25.
  • Errors: every error a user can cause starts with a code (currency_locked, txn_shape, owner_required, invite_invalid, …; Error codes). The clients show a message for the code in the user’s language; the English text after it in the database is for developers.
  • Labels from the database are English and translated by the app: book_people and my_pending_invites() return “Deleted user” (Vietnamese: “Người dùng đã xóa”), and currencies.name is English.
  • Starter categories (backend/app/domain/book_setup.py) are created in the user’s language when a book is made, then are ordinary text the user can rename.
  • Export: README, column headers and fixed values (types, roles, periods) in the user’s language; names, payees and notes as typed.
  • Documentation (these docs, the README, code comments): English only. The landing site’s pages are in both languages, Vietnamese at /.
  • AI advice, when it ships: written in the language of the owner who turned AI on.

Edit this page · Report a problem