diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index 9d653ed886..bad3150d92 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -5,10 +5,11 @@ Track Selection --------------- ``--alang=`` - Specify a priority list of audio languages to use. Different container - formats employ different language codes. DVDs use ISO 639-1 two-letter - language codes, Matroska, MPEG-TS and NUT use ISO 639-2 three-letter - language codes, while OGM uses a free-form identifier. See also ``--aid``. + Specify a priority list of audio languages to use, as IETF language tags. + Equivalent ISO 639-1 two-letter and ISO 639-2 three-letter codes are treated the same. + The first tag in the list whose language matches a track in the file will be used. + A track that matches more subtags will be preferred over one that matches fewer, + with preference given to earlier subtags over later ones. See also ``--aid``. This is a string list option. See `List Options`_ for details. @@ -20,10 +21,7 @@ Track Selection audio. ``--slang=`` - Specify a priority list of subtitle languages to use. Different container - formats employ different language codes. DVDs use ISO 639-1 two letter - language codes, Matroska uses ISO 639-2 three letter language codes while - OGM uses a free-form identifier. See also ``--sid``. + Equivalent to ``--alang``, for subtitle tracks. This is a string list option. See `List Options`_ for details. @@ -33,6 +31,8 @@ Track Selection a DVD and falls back on English if Hungarian is not available. - ``mpv --slang=jpn example.mkv`` plays a Matroska file with Japanese subtitles. + - ``mpv --slang=pt-BR example.mkv`` plays a Matroska file with Brazilian + Portuguese subtitles if available, and otherwise any Portuguese subtitles. ``--vlang=<...>`` Equivalent to ``--alang`` and ``--slang``, for video tracks. diff --git a/player/loadfile.c b/player/loadfile.c index 009d1471ad..5095f6a49f 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -47,6 +47,7 @@ #include "common/recorder.h" #include "common/stats.h" #include "input/input.h" +#include "misc/language.h" #include "audio/out/ao.h" #include "filters/f_decoder_wrapper.h" @@ -447,8 +448,9 @@ static int match_lang(char **langs, const char *lang) if (!lang) return 0; for (int idx = 0; langs && langs[idx]; idx++) { - if (lang && strcasecmp(langs[idx], lang) == 0) - return INT_MAX - idx; + int score = mp_match_lang_single(langs[idx], lang); + if (score > 0) + return INT_MAX - (idx + 1) * LANGUAGE_SCORE_MAX + score - 1; } return 0; }