7#include <packager/media/base/language_utils.h>
11#include <absl/log/check.h>
12#include <absl/log/log.h>
19 const char iso_639_2[4];
20 const char iso_639_1[3];
22const LanguageMapPairType kLanguageMap[] = {
23 {
"aar",
"aa"}, {
"abk",
"ab"}, {
"afr",
"af"}, {
"aka",
"ak"}, {
"alb",
"sq"},
24 {
"amh",
"am"}, {
"ara",
"ar"}, {
"arg",
"an"}, {
"arm",
"hy"}, {
"asm",
"as"},
25 {
"ava",
"av"}, {
"ave",
"ae"}, {
"aym",
"ay"}, {
"aze",
"az"}, {
"bak",
"ba"},
26 {
"bam",
"bm"}, {
"baq",
"eu"}, {
"bel",
"be"}, {
"ben",
"bn"}, {
"bih",
"bh"},
27 {
"bis",
"bi"}, {
"bod",
"bo"}, {
"bos",
"bs"}, {
"bre",
"br"}, {
"bul",
"bg"},
28 {
"bur",
"my"}, {
"cat",
"ca"}, {
"ces",
"cs"}, {
"cha",
"ch"}, {
"che",
"ce"},
29 {
"chi",
"zh"}, {
"chu",
"cu"}, {
"chv",
"cv"}, {
"cor",
"kw"}, {
"cos",
"co"},
30 {
"cre",
"cr"}, {
"cym",
"cy"}, {
"cze",
"cs"}, {
"dan",
"da"}, {
"deu",
"de"},
31 {
"div",
"dv"}, {
"dut",
"nl"}, {
"dzo",
"dz"}, {
"ell",
"el"}, {
"eng",
"en"},
32 {
"epo",
"eo"}, {
"est",
"et"}, {
"eus",
"eu"}, {
"ewe",
"ee"}, {
"fao",
"fo"},
33 {
"fas",
"fa"}, {
"fij",
"fj"}, {
"fin",
"fi"}, {
"fra",
"fr"}, {
"fre",
"fr"},
34 {
"fry",
"fy"}, {
"ful",
"ff"}, {
"geo",
"ka"}, {
"ger",
"de"}, {
"gla",
"gd"},
35 {
"gle",
"ga"}, {
"glg",
"gl"}, {
"glv",
"gv"}, {
"gre",
"el"}, {
"grn",
"gn"},
36 {
"guj",
"gu"}, {
"hat",
"ht"}, {
"hau",
"ha"}, {
"heb",
"he"}, {
"heb",
"iw"},
37 {
"her",
"hz"}, {
"hin",
"hi"}, {
"hmo",
"ho"}, {
"hrv",
"hr"}, {
"hun",
"hu"},
38 {
"hye",
"hy"}, {
"ibo",
"ig"}, {
"ice",
"is"}, {
"ido",
"io"}, {
"iii",
"ii"},
39 {
"iku",
"iu"}, {
"ile",
"ie"}, {
"ina",
"ia"}, {
"ind",
"id"}, {
"ipk",
"ik"},
40 {
"isl",
"is"}, {
"ita",
"it"}, {
"jav",
"jv"}, {
"jpn",
"ja"}, {
"kal",
"kl"},
41 {
"kan",
"kn"}, {
"kas",
"ks"}, {
"kat",
"ka"}, {
"kau",
"kr"}, {
"kaz",
"kk"},
42 {
"khm",
"km"}, {
"kik",
"ki"}, {
"kin",
"rw"}, {
"kir",
"ky"}, {
"kom",
"kv"},
43 {
"kon",
"kg"}, {
"kor",
"ko"}, {
"kua",
"kj"}, {
"kur",
"ku"}, {
"lao",
"lo"},
44 {
"lat",
"la"}, {
"lav",
"lv"}, {
"lim",
"li"}, {
"lin",
"ln"}, {
"lit",
"lt"},
45 {
"ltz",
"lb"}, {
"lub",
"lu"}, {
"lug",
"lg"}, {
"mac",
"mk"}, {
"mah",
"mh"},
46 {
"mal",
"ml"}, {
"mao",
"mi"}, {
"mar",
"mr"}, {
"may",
"ms"}, {
"mkd",
"mk"},
47 {
"mlg",
"mg"}, {
"mlt",
"mt"}, {
"mon",
"mn"}, {
"mri",
"mi"}, {
"msa",
"ms"},
48 {
"mya",
"my"}, {
"nau",
"na"}, {
"nav",
"nv"}, {
"nbl",
"nr"}, {
"nde",
"nd"},
49 {
"ndo",
"ng"}, {
"nep",
"ne"}, {
"nld",
"nl"}, {
"nno",
"nn"}, {
"nob",
"nb"},
50 {
"nor",
"no"}, {
"nya",
"ny"}, {
"oci",
"oc"}, {
"oji",
"oj"}, {
"ori",
"or"},
51 {
"orm",
"om"}, {
"oss",
"os"}, {
"pan",
"pa"}, {
"per",
"fa"}, {
"pli",
"pi"},
52 {
"pol",
"pl"}, {
"por",
"pt"}, {
"pus",
"ps"}, {
"que",
"qu"}, {
"roh",
"rm"},
53 {
"ron",
"ro"}, {
"rum",
"ro"}, {
"run",
"rn"}, {
"rus",
"ru"}, {
"sag",
"sg"},
54 {
"san",
"sa"}, {
"sin",
"si"}, {
"slk",
"sk"}, {
"slo",
"sk"}, {
"slv",
"sl"},
55 {
"sme",
"se"}, {
"smo",
"sm"}, {
"sna",
"sn"}, {
"snd",
"sd"}, {
"som",
"so"},
56 {
"sot",
"st"}, {
"spa",
"es"}, {
"sqi",
"sq"}, {
"srd",
"sc"}, {
"srp",
"sr"},
57 {
"ssw",
"ss"}, {
"sun",
"su"}, {
"swa",
"sw"}, {
"swe",
"sv"}, {
"tah",
"ty"},
58 {
"tam",
"ta"}, {
"tat",
"tt"}, {
"tel",
"te"}, {
"tgk",
"tg"}, {
"tgl",
"tl"},
59 {
"tha",
"th"}, {
"tib",
"bo"}, {
"tir",
"ti"}, {
"ton",
"to"}, {
"tsn",
"tn"},
60 {
"tso",
"ts"}, {
"tuk",
"tk"}, {
"tur",
"tr"}, {
"twi",
"tw"}, {
"uig",
"ug"},
61 {
"ukr",
"uk"}, {
"urd",
"ur"}, {
"uzb",
"uz"}, {
"ven",
"ve"}, {
"vie",
"vi"},
62 {
"vol",
"vo"}, {
"wel",
"cy"}, {
"wln",
"wa"}, {
"wol",
"wo"}, {
"xho",
"xh"},
63 {
"yid",
"yi"}, {
"yor",
"yo"}, {
"zha",
"za"}, {
"zho",
"zh"}, {
"zul",
"zu"},
66void SplitLanguageTag(
const std::string& tag,
67 std::string* main_language, std::string* subtag) {
71 size_t dash = main_language->find(
'-');
72 if (dash != std::string::npos) {
73 *subtag = main_language->substr(dash);
74 main_language->erase(dash);
84 if (language.size() == 0) {
88 std::string main_language;
90 SplitLanguageTag(language, &main_language, &subtag);
92 if (main_language.size() == 2) {
95 return main_language + subtag;
98 for (
size_t i = 0; i < std::size(kLanguageMap); ++i) {
99 if (main_language == kLanguageMap[i].iso_639_2) {
100 return kLanguageMap[i].iso_639_1 + subtag;
106 DCHECK_EQ(3u, main_language.size()) << main_language;
107 return main_language + subtag;
111 std::string main_language;
113 SplitLanguageTag(language, &main_language, &subtag);
115 if (main_language.size() == 3) {
117 return main_language + subtag;
120 for (
size_t i = 0; i < std::size(kLanguageMap); ++i) {
121 if (main_language == kLanguageMap[i].iso_639_1) {
122 return kLanguageMap[i].iso_639_2 + subtag;
126 LOG(WARNING) <<
"No equivalent 3-letter language code for " << main_language;
All the methods that are virtual are virtual for mocking.
std::string LanguageToISO_639_2(const std::string &language)
std::string LanguageToShortestForm(const std::string &language)