Merge pull request #2060 from OpenRefine/issue-1933-language-codes

Update Wikidata language codes
This commit is contained in:
Antonin Delpeuch 2019-06-14 14:22:37 +01:00 committed by GitHub
commit fb597f7b2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 574 additions and 23 deletions

View File

@ -3,28 +3,45 @@
* LANGUAGE SUGGEST * * LANGUAGE SUGGEST *
********************/ ********************/
// This list was manually copied from https://www.wikidata.org/w/api.php?action=paraminfo&modules=wbsetlabel on 2017-10-06 // This list was manually copied from Wikidata on 2019-05-31. It can be updated with the following command:
//
// curl "https://www.wikidata.org/w/api.php?action=query&meta=wbcontentlanguages&wbclcontext=monolingualtext&format=json&formatversion=2" | jq ".query.wbcontentlanguages[].code" | tr '\n' ','
//
// See https://stackoverflow.com/questions/46507037/how-to-get-all-allowed-languages-for-wikidata/46562061#46562061
// I don't think it is worth making every OpenRefine client perform this query at every startup, because it typically does // I don't think it is worth making every OpenRefine client perform this query at every startup, because it typically does
// not change very often. // not change very often.
// See https://stackoverflow.com/questions/46507037/how-to-get-all-allowed-languages-for-wikidata/46562061#46562061 //
WIKIDATA_LANGUAGES = [ "aa", "ab", "ace", "ady", "ady-cyrl", "aeb", "aeb-arab", "aeb-latn", "af", "ak", "aln", "als", "am", "an", "ang", "anp", "ar", "arc", "arn", "arq", "ary", "arz", // This is the list of language codes accepted for monolingualtext values. The language codes for terms are more restrictive.
"as", "ase", "ast", "atj", "av", "avk", "awa", "ay", "az", "azb", "ba", "ban", "bar", "bat-smg", "bbc", "bbc-latn", "bcc", "bcl", "be", "be-tarask", "be-x-old", "bg", "bgn", "bh", "bho", // TODO: in the future, store different lists for term languages and monolingual text languages.
"bi", "bjn", "bm", "bn", "bo", "bpy", "bqi", "br", "brh", "bs", "bto", "bug", "bxr", "ca", "cbk-zam", "cdo", "ce", "ceb", "ch", "cho", "chr", "chy", "ckb", "co", "cps", "cr", "crh", WIKIDATA_LANGUAGES = [
"crh-cyrl", "crh-latn", "cs", "csb", "cu", "cv", "cy", "da", "de", "de-at", "de-ch", "de-formal", "din", "diq", "dsb", "dtp", "dty", "dv", "dz", "ee", "egl", "el", "eml", "en", "en-ca", "aa","ab","abs","ace","ady","ady-cyrl","aeb","aeb-arab","aeb-latn","af","ak","aln","als","am","an","ang","anp",
"en-gb", "eo", "es", "et", "eu", "ext", "fa", "ff", "fi", "fit", "fiu-vro", "fj", "fo", "fr", "frc", "frp", "frr", "fur", "fy", "ga", "gag", "gan", "gan-hans", "gan-hant", "gd", "gl", "ar","arc","arn","arq","ary","arz","as","ase","ast","atj","av","avk","awa","ay","az","azb","ba","ban","bar",
"glk", "gn", "gom", "gom-deva", "gom-latn", "gor", "got", "grc", "gsw", "gu", "gv", "ha", "hak", "haw", "he", "hi", "hif", "hif-latn", "hil", "ho", "hr", "hrx", "hsb", "ht", "hu", "hy", "bbc","bbc-latn","bcc","bcl","be","be-tarask","bg","bgn","bh","bho","bi","bjn","bm","bn","bo","bpy","bqi","br",
"hz", "ia", "id", "ie", "ig", "ii", "ik", "ike-cans", "ike-latn", "ilo", "inh", "io", "is", "it", "iu", "ja", "jam", "jbo", "jut", "jv", "ka", "kaa", "kab", "kbd", "kbd-cyrl", "kbp", "brh","bs","btm","bto","bug","bxr","ca","cbk-zam","cdo","ce","ceb","ch","cho","chr","chy","ckb","co","cps","cr",
"kea", "kg", "khw", "ki", "kiu", "kj", "kk", "kk-arab", "kk-cn", "kk-cyrl", "kk-kz", "kk-latn", "kk-tr", "kl", "km", "kn", "ko", "ko-kp", "koi", "kr", "krc", "kri", "krj", "krl", "ks", "crh","crh-cyrl","crh-latn","cs","csb","cu","cv","cy","da","de","de-at","de-ch","din","diq","dsb","dtp","dty",
"ks-arab", "ks-deva", "ksh", "ku", "ku-arab", "ku-latn", "kv", "kw", "ky", "la", "lad", "lb", "lbe", "lez", "lfn", "lg", "li", "lij", "liv", "lki", "lmo", "ln", "lo", "loz", "lrc", "lt", "dv","dz","ee","egl","el","eml","en","en-ca","en-gb","eo","es","es-419","et","eu","ext","fa","ff","fi","fit",
"ltg", "lus", "luz", "lv", "lzh", "lzz", "mai", "map-bms", "mdf", "mg", "mh", "mhr", "mi", "min", "mk", "ml", "mn", "mo", "mr", "mrj", "ms", "mt", "mus", "mwl", "my", "myv", "mzn", "na", "fj","fo","fr","frc","frp","frr","fur","fy","ga","gag","gan","gan-hans","gan-hant","gcr","gd","gl","glk","gn",
"nah", "nan", "nap", "nb", "nds", "nds-nl", "ne", "new", "ng", "niu", "nl", "nl-informal", "nn", "no", "nod", "nov", "nrm", "nso", "nv", "ny", "nys", "oc", "olo", "om", "or", "os", "ota", "gom","gom-deva","gom-latn","gor","got","grc","gsw","gu","gv","ha","hak","haw","he","hi","hif","hif-latn","hil",
"pa", "pag", "pam", "pap", "pcd", "pdc", "pdt", "pfl", "pi", "pih", "pl", "pms", "pnb", "pnt", "prg", "ps", "pt", "pt-br", "qu", "qug", "rgn", "rif", "rm", "rmy", "rn", "ro", "roa-rup", "ho","hr","hrx","hsb","ht","hu","hy","hyw","hz","ia","id","ie","ig","ii","ik","ike-cans","ike-latn","ilo","inh",
"roa-tara", "ru", "rue", "rup", "ruq", "ruq-cyrl", "ruq-latn", "rw", "rwr", "sa", "sah", "sat", "sc", "scn", "sco", "sd", "sdc", "sdh", "se", "sei", "ses", "sg", "sgs", "sh", "shi", "io","is","it","iu","ja","jam","jbo","jut","jv","ka","kaa","kab","kbd","kbd-cyrl","kbp","kea","kg","khw","ki",
"shi-latn", "shi-tfng", "shn", "si", "simple", "sje", "sk", "skr", "skr-arab", "sl", "sli", "sm", "sma", "smj", "sn", "so", "sq", "sr", "sr-ec", "sr-el", "srn", "srq", "ss", "st", "stq", "kiu","kj","kjp","kk","kk-arab","kk-cn","kk-cyrl","kk-kz","kk-latn","kk-tr","kl","km","kn","ko","ko-kp","koi",
"su", "sv", "sw", "szl", "ta", "tay", "tcy", "te", "tet", "tg", "tg-cyrl", "tg-latn", "th", "ti", "tk", "tl", "tly", "tn", "to", "tokipona", "tpi", "tr", "tru", "ts", "tt", "tt-cyrl", "kr","krc","kri","krj","krl","ks","ks-arab","ks-deva","ksh","ku","ku-arab","ku-latn","kum","kv","kw","ky","la",
"tt-latn", "tum", "tw", "ty", "tyv", "tzm", "udm", "ug", "ug-arab", "ug-latn", "uk", "ur", "uz", "uz-cyrl", "uz-latn", "ve", "vec", "vep", "vi", "vls", "vmf", "vo", "vot", "vro", "wa", "lad","lb","lbe","lez","lfn","lg","li","lij","liv","lki","lmo","ln","lo","loz","lrc","lt","ltg","lus","luz","lv",
"war", "wo", "wuu", "xal", "xh", "xmf", "yi", "yo", "yue", "za", "zea", "zh", "zh-classical", "zh-cn", "zh-hans", "zh-hant", "zh-hk", "zh-min-nan", "zh-mo", "zh-my", "zh-sg", "zh-tw", "lzh","lzz","mai","map-bms","mdf","mg","mh","mhr","mi","min","mk","ml","mn","mni","mnw","mo","mr","mrj","ms","mt",
"zh-yue", "zu" ] "mus","mwl","my","myv","mzn","na","nah","nan","nap","nb","nds","nds-nl","ne","new","ng","niu","nl","nn","no","nod",
"nov","nqo","nrm","nso","nv","ny","nys","oc","olo","om","or","os","ota","pa","pag","pam","pap","pcd","pdc","pdt",
"pfl","pi","pih","pl","pms","pnb","pnt","prg","ps","pt","pt-br","qu","qug","rgn","rif","rm","rmy","rn","ro",
"roa-tara","ru","rue","rup","ruq","ruq-cyrl","ruq-latn","rw","rwr","sa","sah","sat","sc","scn","sco","sd","sdc",
"sdh","se","sei","ses","sg","sgs","sh","shi","shi-latn","shi-tfng","shn","shy-latn","si","sje","sk","skr","skr-arab",
"sl","sli","sm","sma","smj","smn","sms","sn","so","sq","sr","sr-ec","sr-el","srn","srq","ss","st","stq","sty","su",
"sv","sw","szl","ta","tay","tcy","te","tet","tg","tg-cyrl","tg-latn","th","ti","tk","tl","tly","tn","to","tpi","tr",
"tru","ts","tt","tt-cyrl","tt-latn","tum","tw","ty","tyv","tzm","udm","ug","ug-arab","ug-latn","uk","ur","uz","uz-cyrl",
"uz-latn","ve","vec","vep","vi","vls","vmf","vo","vot","vro","wa","war","wo","wuu","xal","xh","xmf","xsy","yi","yo",
"yue","za","zea","zgh","zh","zh-cn","zh-hans","zh-hant","zh-hk","zh-mo","zh-my","zh-sg","zh-tw","zu","und","mis",
"mul","zxx","abe","abq","ami","bnn","brx","chn","cnr","cop","el-cy","ett","eya","fkv","fos","fr-ca","frm","fro",
"fuf","gez","gmy","hai","haz","hbo","kjh","koy","lag","lkt","lld","mid","mnc","moe","non","nr","nxm","ood","otk",
"pjt","ppu","pwn","pyu","quc","qya","rar","shy","sia","sjd","sjk","sjn","sjt","sju","ssf","syc","tlb","trv","tzl",
"uga","umu","uun","xpu","yap","zun" ]
$.suggest("langsuggest", { $.suggest("langsuggest", {
_init: function() { _init: function() {

View File

@ -25,6 +25,7 @@ package org.openrefine.wikidata.schema;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.openrefine.wikidata.schema.exceptions.SkipSchemaExpressionException; import org.openrefine.wikidata.schema.exceptions.SkipSchemaExpressionException;
import org.openrefine.wikidata.utils.LanguageCodeStore;
import org.wikidata.wdtk.datamodel.interfaces.WikimediaLanguageCodes; import org.wikidata.wdtk.datamodel.interfaces.WikimediaLanguageCodes;
import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonCreator;
@ -59,10 +60,13 @@ public class WbLanguageConstant implements WbExpression<String> {
*/ */
public static String normalizeLanguageCode(String lang) { public static String normalizeLanguageCode(String lang) {
try { try {
WikimediaLanguageCodes.getLanguageCode(lang); if (LanguageCodeStore.ALLOWED_LANGUAGE_CODES.contains(lang)) {
return WikimediaLanguageCodes.fixLanguageCodeIfDeprecated(lang); return WikimediaLanguageCodes.fixLanguageCodeIfDeprecated(lang);
} else {
return null;
}
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
return null; return null;
} }
} }

View File

@ -0,0 +1,529 @@
package org.openrefine.wikidata.utils;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
/**
* A store for the allowed language code for terms and monolingual text values
* in Wikidata.
*
* @todo generalize for other Wikibase instances (fetch it dynamically via
* https://stackoverflow.com/questions/46507037/how-to-get-all-allowed-languages-for-wikidata/46562061)
* @todo separate the languages allowed for terms from the ones allowed for monolingual text.
* Currently the list is for monolingual texts (which is larger).
*
* Query to update this list:
* curl "https://www.wikidata.org/w/api.php?action=query&meta=wbcontentlanguages&wbclprop=code&wbclcontext=monolingualtext&format=json" | jq ".query.wbcontentlanguages[].code" | sed -e "s/$/,/"
*
* @author Antonin Delpeuch
*
*/
public class LanguageCodeStore {
public static Set<String> ALLOWED_LANGUAGE_CODES = Arrays.asList(
"aa",
"ab",
"abs",
"ace",
"ady",
"ady-cyrl",
"aeb",
"aeb-arab",
"aeb-latn",
"af",
"ak",
"aln",
"als",
"am",
"an",
"ang",
"anp",
"ar",
"arc",
"arn",
"arq",
"ary",
"arz",
"as",
"ase",
"ast",
"atj",
"av",
"avk",
"awa",
"ay",
"az",
"azb",
"ba",
"ban",
"bar",
"bbc",
"bbc-latn",
"bcc",
"bcl",
"be",
"be-tarask",
"bg",
"bgn",
"bh",
"bho",
"bi",
"bjn",
"bm",
"bn",
"bo",
"bpy",
"bqi",
"br",
"brh",
"bs",
"btm",
"bto",
"bug",
"bxr",
"ca",
"cbk-zam",
"cdo",
"ce",
"ceb",
"ch",
"cho",
"chr",
"chy",
"ckb",
"co",
"cps",
"cr",
"crh",
"crh-cyrl",
"crh-latn",
"cs",
"csb",
"cu",
"cv",
"cy",
"da",
"de",
"de-at",
"de-ch",
"din",
"diq",
"dsb",
"dtp",
"dty",
"dv",
"dz",
"ee",
"egl",
"el",
"eml",
"en",
"en-ca",
"en-gb",
"eo",
"es",
"es-419",
"et",
"eu",
"ext",
"fa",
"ff",
"fi",
"fit",
"fj",
"fo",
"fr",
"frc",
"frp",
"frr",
"fur",
"fy",
"ga",
"gag",
"gan",
"gan-hans",
"gan-hant",
"gcr",
"gd",
"gl",
"glk",
"gn",
"gom",
"gom-deva",
"gom-latn",
"gor",
"got",
"grc",
"gsw",
"gu",
"gv",
"ha",
"hak",
"haw",
"he",
"hi",
"hif",
"hif-latn",
"hil",
"ho",
"hr",
"hrx",
"hsb",
"ht",
"hu",
"hy",
"hyw",
"hz",
"ia",
"id",
"ie",
"ig",
"ii",
"ik",
"ike-cans",
"ike-latn",
"ilo",
"inh",
"io",
"is",
"it",
"iu",
"ja",
"jam",
"jbo",
"jut",
"jv",
"ka",
"kaa",
"kab",
"kbd",
"kbd-cyrl",
"kbp",
"kea",
"kg",
"khw",
"ki",
"kiu",
"kj",
"kjp",
"kk",
"kk-arab",
"kk-cn",
"kk-cyrl",
"kk-kz",
"kk-latn",
"kk-tr",
"kl",
"km",
"kn",
"ko",
"ko-kp",
"koi",
"kr",
"krc",
"kri",
"krj",
"krl",
"ks",
"ks-arab",
"ks-deva",
"ksh",
"ku",
"ku-arab",
"ku-latn",
"kum",
"kv",
"kw",
"ky",
"la",
"lad",
"lb",
"lbe",
"lez",
"lfn",
"lg",
"li",
"lij",
"liv",
"lki",
"lmo",
"ln",
"lo",
"loz",
"lrc",
"lt",
"ltg",
"lus",
"luz",
"lv",
"lzh",
"lzz",
"mai",
"map-bms",
"mdf",
"mg",
"mh",
"mhr",
"mi",
"min",
"mk",
"ml",
"mn",
"mni",
"mnw",
"mo",
"mr",
"mrj",
"ms",
"mt",
"mus",
"mwl",
"my",
"myv",
"mzn",
"na",
"nah",
"nan",
"nap",
"nb",
"nds",
"nds-nl",
"ne",
"new",
"ng",
"niu",
"nl",
"nn",
"no",
"nod",
"nov",
"nqo",
"nrm",
"nso",
"nv",
"ny",
"nys",
"oc",
"olo",
"om",
"or",
"os",
"ota",
"pa",
"pag",
"pam",
"pap",
"pcd",
"pdc",
"pdt",
"pfl",
"pi",
"pih",
"pl",
"pms",
"pnb",
"pnt",
"prg",
"ps",
"pt",
"pt-br",
"qu",
"qug",
"rgn",
"rif",
"rm",
"rmy",
"rn",
"ro",
"roa-tara",
"ru",
"rue",
"rup",
"ruq",
"ruq-cyrl",
"ruq-latn",
"rw",
"rwr",
"sa",
"sah",
"sat",
"sc",
"scn",
"sco",
"sd",
"sdc",
"sdh",
"se",
"sei",
"ses",
"sg",
"sgs",
"sh",
"shi",
"shi-latn",
"shi-tfng",
"shn",
"shy-latn",
"si",
"sje",
"sk",
"skr",
"skr-arab",
"sl",
"sli",
"sm",
"sma",
"smj",
"smn",
"sms",
"sn",
"so",
"sq",
"sr",
"sr-ec",
"sr-el",
"srn",
"srq",
"ss",
"st",
"stq",
"sty",
"su",
"sv",
"sw",
"szl",
"ta",
"tay",
"tcy",
"te",
"tet",
"tg",
"tg-cyrl",
"tg-latn",
"th",
"ti",
"tk",
"tl",
"tly",
"tn",
"to",
"tpi",
"tr",
"tru",
"ts",
"tt",
"tt-cyrl",
"tt-latn",
"tum",
"tw",
"ty",
"tyv",
"tzm",
"udm",
"ug",
"ug-arab",
"ug-latn",
"uk",
"ur",
"uz",
"uz-cyrl",
"uz-latn",
"ve",
"vec",
"vep",
"vi",
"vls",
"vmf",
"vo",
"vot",
"vro",
"wa",
"war",
"wo",
"wuu",
"xal",
"xh",
"xmf",
"xsy",
"yi",
"yo",
"yue",
"za",
"zea",
"zgh",
"zh",
"zh-cn",
"zh-hans",
"zh-hant",
"zh-hk",
"zh-mo",
"zh-my",
"zh-sg",
"zh-tw",
"zu",
"und",
"mis",
"mul",
"zxx",
"abe",
"abq",
"ami",
"bnn",
"brx",
"chn",
"cnr",
"cop",
"el-cy",
"ett",
"eya",
"fkv",
"fos",
"fr-ca",
"frm",
"fro",
"fuf",
"gez",
"gmy",
"hai",
"haz",
"hbo",
"kjh",
"koy",
"lag",
"lkt",
"lld",
"mid",
"mnc",
"moe",
"non",
"nr",
"nxm",
"ood",
"otk",
"pjt",
"ppu",
"pwn",
"pyu",
"quc",
"qya",
"rar",
"shy",
"sia",
"sjd",
"sjk",
"sjn",
"sjt",
"sju",
"ssf",
"syc",
"tlb",
"trv",
"tzl",
"uga",
"umu",
"uun",
"xpu",
"yap",
"zun"
).stream().collect(Collectors.toSet());
}

View File

@ -50,6 +50,7 @@ public class WbLanguageConstantTest extends WbExpressionTest<String> {
assertEquals("de", WbLanguageConstant.normalizeLanguageCode("de")); assertEquals("de", WbLanguageConstant.normalizeLanguageCode("de"));
assertEquals("nb", WbLanguageConstant.normalizeLanguageCode("no")); assertEquals("nb", WbLanguageConstant.normalizeLanguageCode("no"));
assertEquals("nb", WbLanguageConstant.normalizeLanguageCode("nb")); assertEquals("nb", WbLanguageConstant.normalizeLanguageCode("nb"));
assertEquals("mul", WbLanguageConstant.normalizeLanguageCode("mul"));
assertNull(WbLanguageConstant.normalizeLanguageCode("non-existent language code")); assertNull(WbLanguageConstant.normalizeLanguageCode("non-existent language code"));
assertNull(WbLanguageConstant.normalizeLanguageCode(null)); assertNull(WbLanguageConstant.normalizeLanguageCode(null));
} }