Jellyfin Multilang
Multilang is a Jellyfin plugin that lets different users see different metadata languages without changing Jellyfin's stored metadata.
The main branch is built for the Jellyfin 10.11.x stable series. The
jellyfin12 branch targets Jellyfin 12 and is currently early beta software.
What It Does
Multilang can fetch and display metadata and artwork in chosen languages for:
- Titles
- Overviews
- Taglines
- Posters
- Logos
- Banners
- Thumbnails
- Backdrops
In addition, it can translate genres into the user's Jellyfin display language.
Admin Features
Admins configure the data that Multilang can use:
- Choose which languages should be exposed for metadata and artwork fetching.
- Configure TMDb and Fanart.tv provider keys.
- Set metadata and artwork provider priority.
- Configure leading articles for sorting, such as
the,a,an, or language-specific equivalents. - Configure scheduled refresh timing for missing and existing metadata.
- Set thresholds for what requests to cache.
- View cache and recent request diagnostics.
- Enable logging when troubleshooting.
User Features
Each user can enable or disable Multilang for themselves.
Users can create classification rules that group items into categories. For example, a user can classify Finnish films, Swedish films, Spanish films, or movies produced in a specific country.
For each category, the user can choose an ordered fallback list for each field. For example:
- Use the Finnish title, then Swedish if that isn't available, then Jellyfin's default as the final fallback.
- Use the original title instead of any set language.
- Use a Swedish overview, then English if that isn't available.
- Use an original-language poster, then Jellyfin's default poster if that isn't available.
- Clear a field if no selected language has data.
Title and poster always force Jellyfin as a final fallback so browsing remains usable.
Users can also choose which language's alphabet and sorting rules should be used when Multilang sorts item lists.
How It Works
The admin chooses which languages Multilang should make available. These languages decide what metadata and artwork the plugin fetches from providers.
Each user then creates their own rules for what languages to display, when to display them, and which fields should use them. The available choices are:
- Languages selected by the admin.
- The
Originallanguage according to TMDb. - Jellyfin's own default metadata and artwork.
Multilang keeps fetched text metadata in its own SQLite database. Downloaded or proxied artwork is handled by the plugin separately from Jellyfin's normal metadata storage. Jellyfin's own library metadata is not overwritten.
The plugin changes the Jellyfin web UI by injecting JavaScript into Jellyfin's main web page. This works in a browser and in the official Jellyfin desktop app, because both use the Jellyfin web UI. It is not guaranteed to work in clients that do not use the web UI.
The injected script makes selected UI requests go through Multilang's plugin API instead of directly to Jellyfin. The plugin fetches the original response from Jellyfin, applies the current user's rules, and returns a modified response to the UI.
Some requests can be slow because Multilang may need to ask Jellyfin for a larger list than the UI will finally display. This is needed so the plugin can translate, filter, sort, and slice the list using the user's own rules. Multilang caches slow transformed responses for a configurable time and also uses a very short burst cache for repeated requests during navigation. Cache entries are invalidated when affected items are refreshed.
Original-Language Support
Multilang stores metadata and artwork tagged as Original.
This is useful when a user wants the original title and matching original poster for languages they do not otherwise want as their main metadata language.
Genres
Jellyfin stores and displays genres by name. If metadata was fetched in English,
the genre may be Drama; if it was fetched in Finnish, the genre may be
Draama. Jellyfin treats those names as separate genres, and it displays the
stored name regardless of the user's display language.
Multilang avoids this by storing TMDb genre IDs for each item. The ID stays the same across languages, so the plugin can display the genre name in the user's current Jellyfin display language when a translation is available.
Debugging
The plugin includes lightweight admin/debug tools:
- Cache diagnostics
- Recent request diagnostics
- Refresh queue/provider diagnostics
- Per-item debug view showing which category matched and which field action won
These are intended for troubleshooting configuration or missing metadata, not for normal daily use.
Current Status
This plugin is usable but still under active testing. The most important areas to test are:
- Large library browsing
- Sorting and filtering
- Collections
- Shows, seasons, and episodes
- Scheduled scans
- Complex per-user classification rules
AI Assistance
This codebase was written with substantial help from AI tools, under human direction and testing.