A language switcher is the visible part. The harder work is deciding what should be translated, what should be shared, and what must remain the same record. Get this wrong and you end up with duplicated users, split progress, and a maintenance nightmare.

Shared logical records, localized fields

The clean model: one logical record per thing, with localized fields for translated content. A video is one record; its title and description have per-language values. The progress, notes, and favorites all attach to that one record.

Interface vs. content translation

  • •Interface translations are the buttons, labels, and navigation—usually managed in translation files.
  • •Content translations are the actual articles, videos, or descriptions—managed in your data.

They're different problems with different workflows. Don't conflate them.

Fallback behavior

Decide what happens when a translation is missing. Fall back to the default language? Hide the item? Show a "translation coming" note? Choose deliberately, and make it consistent.

Stable routes and IDs

Keep routes and IDs stable across languages. A video route should work in English and Spanish, with the language as a parameter or prefix—not a different URL for the "Spanish version" of the same thing.

Keep progress attached to the logical record

User progress, favorites, ratings, and history belong to the logical record, not the localized view. If switching language resets progress, you've duplicated the record when you should have localized the fields.

Other considerations

  • •Localized search should search in the selected language but ideally fall back gracefully.
  • •Language-aware media—videos may have language-specific URLs or subtitles.
  • •Admin interfaces may remain in one operational language. Not everything needs translating.
  • •Proper nouns, URLs, email addresses, and organization names often stay the same across languages. Don't translate them by accident.
  • •Accessibility labels need translating too—screen reader announcements included.

Audit and test

  • •Run translation completeness audits before publishing a language.
  • •Test language changes on the same route—does the URL stay stable, does progress persist?
  • •Test direct navigation to a localized URL and repeated switching back and forth.

Plan before you load translated content

Decide the model before you import translations. Retrofitting "shared records with localized fields" onto a duplicated structure is painful. Planning is cheap; migration is not.

Takeaway

Translate the fields, not the records. One logical thing, many language views.