Skip to content

docs: explain how to use BetterVoting in another language - #1561

Open
masiarek wants to merge 3 commits into
Equal-Vote:mainfrom
masiarek:docs/using-another-language
Open

masiarek wants to merge 3 commits into
Equal-Vote:mainfrom
masiarek:docs/using-another-language

Conversation

@masiarek

Copy link
Copy Markdown
Collaborator

Description

Adds docs/help/using_another_language.md.

BetterVoting ships four languages and there is no way to discover that from the interface. i18n.ts uses the browser language detector, and nothing in packages/frontend/src offers a language switcher — i18n.language is used only for list formatting. The sole way to choose a language is the ?lng= parameter, which is documented for translators in the contribution guide and nowhere a voter would ever look.

Covers: detection is automatic and most people need nothing; the codes for the four current languages; how to append the parameter when the link already has a query string; and how to help add a language.

Three things the page is careful about

The choice is cached. i18next-browser-languagedetector's default order writes the selection to localStorage and a cookie, so it persists after the parameter is gone — and getting back to English needs an explicit ?lng=en, not just dropping the parameter. This gets its own warning callout; it's the most confusing behaviour here and the one most likely to generate a support message.

Mixed English is correct, not broken. Only Priority 0 is translated and fallbackLng is 'en', so a page can legitimately be part-translated. Saying so plainly stops a voter reporting it as a fault.

The election's own content is never translated. Candidate names, race titles, descriptions and the organiser's emails appear exactly as written. A Spanish interface can carry an English ballot question — that's the system working correctly, and it isn't obvious.

The admin section draws the practical conclusion: sending ?lng= links is worth doing for a known-language group, but it translates the buttons around your text, not the text itself — so a genuinely bilingual electorate is better served by writing the race description in both languages.

Language list. Lists only the four currently on main. German is in review (#1560) and can be added in a one-line follow-up once it merges.

Verification. Local build (github-pages, Jekyll 3.9): renders, sits under the BetterVoting Documentation parent, no unrewritten .md hrefs.

Screenshots / Videos (frontend only)

n/a — documentation.

Related Issues

Part of the documentation program in #1556. Complements #1560 (German translation).

BetterVoting ships four languages and there is no way to discover that from
the interface -- i18n.ts uses the browser language detector, and nothing in
packages/frontend/src offers a language switcher. The only way to choose one is
the ?lng= URL parameter, which is documented for translators in the
contribution guide and nowhere a voter would ever look.

Covers: that detection is automatic and most people need nothing; the codes
for the four current languages; how to append the parameter to a link that
already has a query string; and how to help add a language.

Three things the page is careful about, all of which have caught people out:

- The choice is CACHED. i18next-browser-languagedetector's default order
  writes the selection to localStorage and a cookie, so it persists after the
  parameter is gone -- and returning to English needs an explicit ?lng=en
  rather than just dropping the parameter. This gets its own warning callout;
  it is the single most confusing behaviour here.
- Mixed English is CORRECT, not broken. Only Priority 0 is translated and
  fallbackLng is 'en', so a page can legitimately be part translated. Saying so
  prevents a voter reporting it as a fault.
- The election's own content is never translated. Candidate names, race titles,
  descriptions and the organiser's emails are whatever they wrote. A Spanish
  interface can carry an English ballot question, and that is the system
  working correctly.

The admin section draws the practical conclusion: sending ?lng= links is worth
doing for a known-language group, but it translates the buttons around your
text and not the text itself, so a genuinely bilingual electorate is better
served by writing the race description in both languages.

Lists only the four languages currently on main. German is in review (Equal-Vote#1560)
and can be added in a one-line follow-up once it merges.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@netlify

netlify Bot commented Aug 17, 2026

Copy link
Copy Markdown

Deploy Preview for bettervoting ready!

Name Link
🔨 Latest commit a14031c
🔍 Latest deploy log https://app.netlify.com/projects/bettervoting/deploys/6a82e70bf1aafb0008addcb7
😎 Deploy Preview https://deploy-preview-1561--bettervoting.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@masiarek, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 47 minutes

Limit details: You’ve used all 1 included review currently available under your plan.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 02b37de8-a47a-4887-8ca3-207eaed11644

📥 Commits

Reviewing files that changed from the base of the PR and between 7bc75a8 and a14031c.

📒 Files selected for processing (1)
  • docs/help/using_another_language.md

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

masiarek and others added 2 commits August 17, 2026 06:43
Adds the three languages currently in review to the table, marked so the page
stays truthful either way: a voter who tries ?lng=de before it merges learns
that from the page rather than from a screen that stubbornly stays English.

The marker is prose rather than a PR number, so the only edit needed when they
land is deleting three words -- no link to rot, and nothing that reads oddly to
a user who has no idea what a pull request is.

Also splits the closing line in two. It was doing two jobs at once: telling
readers the list may lag reality, and telling them to just try their code. The
second is the actionable half and now stands on its own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The examples used https://bettervoting.com/your-election-id?lng=es in a fenced
code block. A code block invites copying, and the URL is well formed, so the
natural thing a reader does is paste it -- and gets '400: Election not found',
because no election has that id. Confirmed by a reader doing exactly that.

Two changes:

- The instruction now leads with what the reader actually has to do -- take
  YOUR address and append the parameter -- instead of presenting a URL to
  imitate. The placeholder is a short opaque id (a1b2c3) that reads as a stand-in
  rather than a real path segment, and the page says outright that opening the
  examples as written will error.
- The ?-vs-& case becomes a three-column table (your link, what to add, the
  result) rather than a second pasteable URL. That was the harder half to
  explain and the table carries it better than prose did.

Neither example now sits alone in a code fence where it can be mistaken for
something to run.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

## Choosing a language yourself

There is no language menu on the site. To pick a language, **take the address you already have and add `?lng=` and the language code to the end of it**.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can get a language selector added soon. I'll block this PR behind that feature

@ArendPeter ArendPeter added the Freeze This items should be hidden from the board. Remove the label once they're active again label Aug 28, 2026
@ArendPeter ArendPeter mentioned this pull request Aug 28, 2026
7 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Freeze This items should be hidden from the board. Remove the label once they're active again

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants