ajp_anton 096c6be8c7 Release 0.3.4: Jellyfin 12 stable support and audit fixes
Harden proxy permissions and cache behavior, streamline metadata fetching, remove obsolete rules, and validate the stable SDK with expanded regression coverage. Document backup format changes.
2026-09-09 01:18:43 +00:00
2026-07-16 00:42:52 +00:00
2026-07-15 22:45:54 +00:00

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.0 stable on Linux x64. The plugin remains beta software.

Upgrading to 0.2.5 or 0.3.4

Existing plugin data is upgraded automatically. Make fresh database exports after upgrading: older translation-database exports cannot be imported by these versions. User-settings-only exports keep their existing format. Obsolete text-based rules are no longer supported; current classification rules are unaffected.

The first missing-data scan records the new per-language and per-provider fetch state, so it may fetch more than subsequent scans. Later scans retry only missing data when due and repair downloaded artwork without refetching its metadata.

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 Original language 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 Jellyfin's responses for a configurable time, sharing the fetched list across pages and sort orders. Current translations and user rules are applied each time that list is used. Simultaneous requests share an in-progress fetch, and a short burst cache also handles fast repeated requests. Library, permission and watched-state changes invalidate affected caches. Movie and show libraries can optionally be fetched in advance when a user becomes active.

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.

S
Description
No description provided
Readme
15 MiB
Languages
C# 62.8%
HTML 22.1%
JavaScript 7%
Python 5.6%
CSS 2.5%