From e1faf5595dc87d3478ef851913b6e2bc0ab6c7ca Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Fri, 24 Jun 2022 16:47:00 +0200 Subject: [PATCH 1/2] Improve typing --- UI/i18n/Translation.ts | 6 +++--- Utils.ts | 30 ++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/UI/i18n/Translation.ts b/UI/i18n/Translation.ts index 8d65e202b..4000ca97e 100644 --- a/UI/i18n/Translation.ts +++ b/UI/i18n/Translation.ts @@ -7,10 +7,10 @@ export class Translation extends BaseUIElement { public static forcedLanguage = undefined; - public readonly translations: object + public readonly translations: Record context?: string; - constructor(translations: object, context?: string) { + constructor(translations: Record, context?: string) { super() if (translations === undefined) { console.error("Translation without content at "+context) @@ -264,7 +264,7 @@ export class Translation extends BaseUIElement { } export class TypedTranslation extends Translation { - constructor(translations: object, context?: string) { + constructor(translations: Record, context?: string) { super(translations, context); } diff --git a/Utils.ts b/Utils.ts index ff93b6e88..c6e5073e5 100644 --- a/Utils.ts +++ b/Utils.ts @@ -931,20 +931,38 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be return track[str2.length][str1.length]; } - public static MapToObj(d: Map, onValue: ((t: T, key: string) => any) = undefined): object { + public static MapToObj(d: Map, onValue: ((t: V, key: string) => T)): Record { const o = {} const keys = Array.from(d.keys()) keys.sort(); for (const key of keys) { - let value = d.get(key) - if (onValue !== undefined) { - value = onValue(value, key) - } - o[key] = value; + o[key] = onValue(d.get(key), key); } return o } + /** + * Switches keys and values around + * + * Utils.TransposeMap({"a" : ["b", "c"], "x" : ["b", "y"]}) // => {"b" : ["a", "x"], "c" : ["a"], "y" : ["x"]} + */ + public static TransposeMap(d: Record) : Record{ + const newD : Record = {}; + + for (const k in d) { + const vs = d[k] + for (let v of vs) { + const list = newD[v] + if(list === undefined){ + newD[v] = [k] // Left: indexing; right: list with one element + }else{ + list.push(k) + } + } + } + return newD; + } + /** * Utils.colorAsHex({r: 255, g: 128, b: 0}) // => "#ff8000" * Utils.colorAsHex(undefined) // => undefined From 5aaf57137c34301e192f82a8796a8c7b506dd3f5 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Fri, 24 Jun 2022 16:49:03 +0200 Subject: [PATCH 2/2] Download official languages per country --- assets/language_in_country.json | 721 ++++++++++++++++++++++ assets/layers/language/language.json | 864 +++++++++++++++++++++++++++ scripts/fetchLanguages.ts | 72 ++- scripts/generateTranslations.ts | 7 + 4 files changed, 1660 insertions(+), 4 deletions(-) create mode 100644 assets/language_in_country.json create mode 100644 assets/layers/language/language.json diff --git a/assets/language_in_country.json b/assets/language_in_country.json new file mode 100644 index 000000000..847fa4da1 --- /dev/null +++ b/assets/language_in_country.json @@ -0,0 +1,721 @@ +{ + "AD": [ + "ca" + ], + "AE": [ + "ar" + ], + "AF": [ + "uz", + "tk", + "ar", + "ps" + ], + "AG": [ + "en", + "en" + ], + "AL": [ + "sq" + ], + "AM": [ + "hy" + ], + "AO": [ + "pt" + ], + "AR": [ + "es" + ], + "AT": [ + "de" + ], + "AU": [ + "en", + "en" + ], + "AZ": [ + "az" + ], + "BA": [ + "hr", + "sr", + "bs" + ], + "BB": [ + "en" + ], + "BD": [ + "bn" + ], + "BE": [ + "fr", + "de", + "nl" + ], + "BF": [ + "fr" + ], + "BG": [ + "bg" + ], + "BH": [ + "ar" + ], + "BI": [ + "fr", + "en", + "rn" + ], + "BJ": [ + "fr" + ], + "BN": [ + "en", + "ms" + ], + "BO": [ + "es", + "ay", + "qu", + "gn" + ], + "BR": [ + "pt" + ], + "BS": [ + "en", + "en" + ], + "BT": [ + "dz", + "dz" + ], + "BW": [ + "en" + ], + "BY": [ + "ru", + "be" + ], + "BZ": [ + "en" + ], + "CA": [ + "fr", + "en" + ], + "CD": [ + "fr" + ], + "CF": [ + "fr", + "sg" + ], + "CG": [ + "fr" + ], + "CH": [ + "fr", + "de", + "it", + "rm" + ], + "CI": [ + "fr" + ], + "CL": [ + "es" + ], + "CM": [ + "fr", + "en" + ], + "CN": [ + "zh" + ], + "CO": [ + "es" + ], + "CR": [ + "es" + ], + "CU": [ + "es" + ], + "CV": [ + "pt" + ], + "CY": [ + "tr", + "el" + ], + "CZ": [ + "cs" + ], + "DE": [ + "de", + "de" + ], + "DJ": [ + "fr", + "ar" + ], + "DK": [ + "da", + "da" + ], + "DM": [ + "en" + ], + "DO": [ + "es" + ], + "DZ": [ + "ar", + "ar" + ], + "EC": [ + "es" + ], + "EE": [ + "et", + "et" + ], + "EG": [ + "ar", + "ar" + ], + "ER": [ + "en", + "ar", + "ti" + ], + "ES": [ + "es" + ], + "ET": [ + "am" + ], + "FI": [ + "fi", + "sv", + "fi", + "sv" + ], + "FJ": [ + "en", + "fj" + ], + "FM": [ + "en" + ], + "FR": [ + "fr", + "fr" + ], + "GA": [ + "fr" + ], + "GB": [ + "en", + "en", + "en" + ], + "GD": [ + "en", + "en" + ], + "GE": [ + "ab", + "ka" + ], + "GH": [ + "en" + ], + "GI": [ + "en" + ], + "GM": [ + "en" + ], + "GN": [ + "fr" + ], + "GQ": [ + "fr", + "es", + "pt" + ], + "GT": [ + "es" + ], + "GW": [ + "pt" + ], + "GY": [ + "en" + ], + "HN": [ + "es" + ], + "HR": [ + "hr", + "hr" + ], + "HT": [ + "fr", + "ht" + ], + "HU": [ + "hu" + ], + "ID": [ + "id", + "jv" + ], + "IE": [ + "en", + "ga" + ], + "IL": [ + "he", + "he" + ], + "IN": [ + "hi", + "en" + ], + "IQ": [ + "ar", + "ku" + ], + "IR": [ + "fa" + ], + "IS": [ + "is" + ], + "IT": [ + "it" + ], + "JM": [ + "en", + "en" + ], + "JO": [ + "ar" + ], + "JP": [ + "ja" + ], + "KE": [ + "en", + "sw" + ], + "KG": [ + "ru", + "ky" + ], + "KH": [ + "km" + ], + "KI": [ + "en" + ], + "KM": [ + "fr", + "ar" + ], + "KN": [ + "en", + "en" + ], + "KP": [ + "ko", + "ko" + ], + "KR": [ + "ko" + ], + "KW": [ + "ar" + ], + "KZ": [ + "ru", + "kk" + ], + "LA": [ + "lo" + ], + "LB": [ + "ar", + "ar" + ], + "LC": [ + "en", + "en" + ], + "LI": [ + "de" + ], + "LK": [ + "ta", + "si" + ], + "LR": [ + "en" + ], + "LS": [ + "en", + "st" + ], + "LT": [ + "lt", + "lt" + ], + "LU": [ + "fr", + "de", + "lb" + ], + "LV": [ + "lv", + "lv" + ], + "LY": [ + "ar", + "ar" + ], + "MA": [ + "ar", + "ar" + ], + "MC": [ + "fr" + ], + "MD": [ + "ro" + ], + "MG": [ + "fr", + "mg" + ], + "MH": [ + "en", + "mh" + ], + "MK": [ + "sq", + "mk" + ], + "ML": [ + "fr" + ], + "MM": [ + "my" + ], + "MN": [ + "mn" + ], + "MR": [ + "ar" + ], + "MT": [ + "en", + "mt" + ], + "MU": [ + "fr", + "en" + ], + "MV": [ + "dv" + ], + "MW": [ + "en", + "ny" + ], + "MX": [ + "es", + "es" + ], + "MY": [ + "ms" + ], + "MZ": [ + "pt" + ], + "NA": [ + "en" + ], + "NE": [ + "fr" + ], + "NG": [ + "en", + "yo" + ], + "NI": [ + "es" + ], + "NL": [ + "nl", + "nl" + ], + "NO": [ + "no", + "nn", + "nb" + ], + "NP": [ + "ne" + ], + "NR": [ + "en", + "na" + ], + "NZ": [ + "en", + "mi", + "en", + "mi" + ], + "OM": [ + "ar" + ], + "PA": [ + "es" + ], + "PE": [ + "es", + "ay", + "qu" + ], + "PG": [ + "en", + "ho", + "en", + "ho" + ], + "PH": [ + "en" + ], + "PK": [ + "ur", + "en", + "ar" + ], + "PL": [ + "pl", + "pl" + ], + "PS": [ + "ar" + ], + "PT": [ + "pt", + "pt" + ], + "PW": [ + "en", + "ja" + ], + "PY": [ + "es", + "gn" + ], + "QA": [ + "ar" + ], + "RO": [ + "ro" + ], + "RS": [ + "sr" + ], + "RU": [ + "ru" + ], + "RW": [ + "fr", + "en", + "sw", + "rw" + ], + "SA": [ + "ar" + ], + "SB": [ + "en", + "en" + ], + "SC": [ + "fr", + "en" + ], + "SD": [ + "en", + "ar" + ], + "SE": [ + "sv", + "sv" + ], + "SG": [ + "en", + "ta", + "ms" + ], + "SI": [ + "sl", + "sl" + ], + "SK": [ + "sk" + ], + "SL": [ + "en" + ], + "SM": [ + "it" + ], + "SN": [ + "fr", + "wo" + ], + "SO": [ + "so", + "ar" + ], + "SR": [ + "nl" + ], + "SS": [ + "en", + "ar" + ], + "ST": [ + "pt" + ], + "SV": [ + "es" + ], + "SY": [ + "ar", + "ar" + ], + "SZ": [ + "en", + "ss" + ], + "TD": [ + "fr", + "ar" + ], + "TG": [ + "fr" + ], + "TH": [ + "th" + ], + "TJ": [ + "ru", + "tg" + ], + "TL": [ + "pt" + ], + "TM": [ + "tk" + ], + "TN": [ + "ar", + "ar" + ], + "TO": [ + "en", + "to" + ], + "TR": [ + "tr", + "tr" + ], + "TT": [ + "en" + ], + "TV": [ + "en", + "en" + ], + "TZ": [ + "en", + "sw" + ], + "UA": [ + "uk" + ], + "UG": [ + "en", + "sw" + ], + "UY": [ + "es" + ], + "UZ": [ + "uz" + ], + "VA": [ + "fr", + "la", + "it" + ], + "VC": [ + "en", + "en" + ], + "VE": [ + "es" + ], + "VN": [ + "vi" + ], + "VU": [ + "fr", + "en", + "bi" + ], + "WS": [ + "en", + "sm" + ], + "YE": [ + "ar" + ], + "ZA": [ + "af", + "ve", + "ss", + "tn", + "ts", + "st", + "nr", + "en", + "zu", + "xh" + ], + "ZM": [ + "en" + ], + "ZW": [ + "en", + "xh", + "ve", + "ny", + "sn", + "tn", + "ts", + "st", + "nd" + ] +} \ No newline at end of file diff --git a/assets/layers/language/language.json b/assets/layers/language/language.json new file mode 100644 index 000000000..094afbf2c --- /dev/null +++ b/assets/layers/language/language.json @@ -0,0 +1,864 @@ +{ + "id": "language", + "description": "Various tagRenderings to help language tooling", + "tagRenderings": { + "id": "official-language", + "mappings": [ + { + "if": "language=ca", + "then": { + "ca": "català", + "da": "catalansk", + "de": "Katalanisch", + "en": "Catalan", + "eo": "kataluna lingvo", + "es": "catalán", + "fi": "katalaani", + "fr": "catalan", + "gl": "lingua catalá", + "hu": "katalán", + "id": "Bahasa Katala", + "it": "catalano", + "ja": "カタルーニャ語", + "nb_NO": "katalansk", + "nl": "Catalaans", + "pl": "język kataloński", + "pt": "língua catalã", + "pt_BR": "língua catalã", + "ru": "каталанский язык", + "sl": "Katalonščina", + "sv": "katalanska", + "zh_Hans": "加泰罗尼亚语", + "zh_Hant": "加泰隆尼亞語" + }, + "hideInAnswer": "_country=ad" + }, + { + "if": "language=ar", + "hideInAnswer": "_country=ae|af|bh|dj|dz|eg|er|iq|jo|km|kw|lb|ly|ma|mr|om|pk|ps|qa|sa|sd|so|ss|sy|td|tn|ye" + }, + { + "if": "language=uz", + "hideInAnswer": "_country=af|uz" + }, + { + "if": "language=tk", + "hideInAnswer": "_country=af|tm" + }, + { + "if": "language=ps", + "hideInAnswer": "_country=af" + }, + { + "if": "language=en", + "then": { + "ca": "anglès", + "da": "engelsk", + "de": "Englisch", + "en": "English", + "eo": "angla lingvo", + "es": "inglés", + "fi": "englanti", + "fr": "anglais", + "gl": "lingua inglesa", + "hu": "angol", + "id": "Inggris", + "it": "inglese", + "ja": "英語", + "nb_NO": "engelsk", + "nl": "Engels", + "pl": "język angielski", + "pt": "inglês", + "pt_BR": "inglês", + "ru": "английский язык", + "sl": "angleščina", + "sv": "engelska", + "zh_Hans": "英语", + "zh_Hant": "英語" + }, + "hideInAnswer": "_country=ag|au|bb|bi|bn|bs|bw|bz|ca|cm|dm|er|fj|fm|gb|gd|gh|gi|gm|gy|ie|in|jm|ke|ki|kn|lc|lr|ls|mh|mt|mu|mw|na|ng|nr|nz|pg|ph|pk|pw|rw|sb|sc|sd|sg|sl|ss|sz|to|tt|tv|tz|ug|vc|vu|ws|za|zm|zw" + }, + { + "if": "language=sq", + "hideInAnswer": "_country=al|mk" + }, + { + "if": "language=hy", + "hideInAnswer": "_country=am" + }, + { + "if": "language=pt", + "then": { + "ca": "portuguès", + "da": "portugisisk", + "de": "Portugiesisch", + "en": "Portuguese", + "eo": "portugala lingvo", + "es": "portugués", + "fi": "portugali", + "fr": "portugais", + "gl": "lingua portuguesa", + "hu": "portugál", + "id": "Portugis", + "it": "portoghese", + "ja": "ポルトガル語", + "nb_NO": "portugisisk", + "nl": "Portugees", + "pl": "język portugalski", + "pt": "português", + "pt_BR": "português", + "ru": "португальский язык", + "sl": "portugalščina", + "sv": "portugisiska", + "zh_Hans": "葡萄牙语", + "zh_Hant": "葡萄牙語" + }, + "hideInAnswer": "_country=ao|br|cv|gq|gw|mz|pt|st|tl" + }, + { + "if": "language=es", + "then": { + "ca": "castellà", + "da": "spansk", + "de": "Spanisch", + "en": "Spanish", + "eo": "hispana lingvo", + "es": "español", + "fi": "espanja", + "fr": "espagnol", + "gl": "lingua castelá", + "hu": "spanyol", + "id": "Spanyol", + "it": "spagnolo", + "ja": "スペイン語", + "nb_NO": "spansk", + "nl": "Spaans", + "pl": "język hiszpański", + "pt": "espanhol", + "pt_BR": "espanhol", + "ru": "испанский язык", + "sl": "španščina", + "sv": "spanska", + "zh_Hans": "西班牙语", + "zh_Hant": "西班牙語" + }, + "hideInAnswer": "_country=ar|bo|cl|co|cr|cu|do|ec|es|gq|gt|hn|mx|ni|pa|pe|py|sv|uy|ve" + }, + { + "if": "language=de", + "then": { + "ca": "alemany", + "da": "tysk", + "de": "Deutsch", + "en": "German", + "eo": "germana lingvo", + "es": "alemán", + "fi": "saksa", + "fr": "allemand", + "gl": "lingua alemá", + "hu": "német", + "id": "Jerman", + "it": "tedesco", + "ja": "ドイツ語", + "nb_NO": "tysk", + "nl": "Duits", + "pl": "język niemiecki", + "pt": "alemão", + "pt_BR": "alemão", + "ru": "немецкий язык", + "sl": "nemščina", + "sv": "tyska", + "zh_Hans": "德语", + "zh_Hant": "德語" + }, + "hideInAnswer": "_country=at|be|ch|de|li|lu" + }, + { + "if": "language=az", + "hideInAnswer": "_country=az" + }, + { + "if": "language=hr", + "hideInAnswer": "_country=ba|hr" + }, + { + "if": "language=sr", + "hideInAnswer": "_country=ba|rs" + }, + { + "if": "language=bs", + "hideInAnswer": "_country=ba" + }, + { + "if": "language=bn", + "hideInAnswer": "_country=bd" + }, + { + "if": "language=fr", + "then": { + "ca": "francès", + "da": "fransk", + "de": "Französisch", + "en": "French", + "eo": "franca lingvo", + "es": "francés", + "fi": "ranska", + "fr": "français", + "gl": "lingua francesa", + "hu": "francia", + "id": "Prancis", + "it": "francese", + "ja": "フランス語", + "nb_NO": "fransk", + "nl": "Frans", + "pl": "język francuski", + "pt": "francês", + "pt_BR": "francês", + "ru": "французский язык", + "sl": "francoščina", + "sv": "franska", + "zh_Hans": "法语", + "zh_Hant": "法語" + }, + "hideInAnswer": "_country=be|bf|bi|bj|ca|cd|cf|cg|ch|ci|cm|dj|fr|ga|gn|gq|ht|km|lu|mc|mg|ml|mu|ne|rw|sc|sn|td|tg|va|vu" + }, + { + "if": "language=nl", + "then": { + "ca": "neerlandès", + "da": "nederlandsk", + "de": "Niederländisch", + "en": "Dutch", + "eo": "nederlanda lingvo", + "es": "neerlandés", + "fi": "hollanti", + "fr": "néerlandais", + "gl": "lingua neerlandesa", + "hu": "holland", + "id": "Belanda", + "it": "olandese", + "ja": "オランダ語", + "nb_NO": "nederlandsk", + "nl": "Nederlands", + "pl": "język niderlandzki", + "pt": "neerlandês", + "pt_BR": "neerlandês", + "ru": "нидерландский язык", + "sl": "Nizozemščina", + "sv": "nederländska", + "zh_Hans": "荷兰语", + "zh_Hant": "荷蘭語" + }, + "hideInAnswer": "_country=be|nl|sr" + }, + { + "if": "language=bg", + "hideInAnswer": "_country=bg" + }, + { + "if": "language=rn", + "hideInAnswer": "_country=bi" + }, + { + "if": "language=ms", + "hideInAnswer": "_country=bn|my|sg" + }, + { + "if": "language=ay", + "hideInAnswer": "_country=bo|pe" + }, + { + "if": "language=qu", + "hideInAnswer": "_country=bo|pe" + }, + { + "if": "language=gn", + "hideInAnswer": "_country=bo|py" + }, + { + "if": "language=dz", + "hideInAnswer": "_country=bt" + }, + { + "if": "language=ru", + "then": { + "ca": "rus", + "da": "russisk", + "de": "Russisch", + "en": "Russian", + "eo": "rusa lingvo", + "es": "ruso", + "fi": "venäjä", + "fr": "russe", + "gl": "lingua rusa", + "hu": "orosz", + "id": "Rusia", + "it": "russo", + "ja": "ロシア語", + "nb_NO": "russisk", + "nl": "Russisch", + "pl": "język rosyjski", + "pt": "russo", + "pt_BR": "russo", + "ru": "русский язык", + "sl": "ruščina", + "sv": "ryska", + "zh_Hans": "俄语", + "zh_Hant": "俄語" + }, + "hideInAnswer": "_country=by|kg|kz|ru|tj" + }, + { + "if": "language=be", + "hideInAnswer": "_country=by" + }, + { + "if": "language=sg", + "hideInAnswer": "_country=cf" + }, + { + "if": "language=it", + "then": { + "ca": "italià", + "da": "italiensk", + "de": "Italienisch", + "en": "Italian", + "eo": "itala lingvo", + "es": "italiano", + "fi": "italia", + "fr": "italien", + "gl": "lingua italiana", + "hu": "olasz", + "id": "Italia", + "it": "italiano", + "ja": "イタリア語", + "nb_NO": "italiensk", + "nl": "Italiaans", + "pl": "język włoski", + "pt": "italiano", + "pt_BR": "língua italiana", + "ru": "итальянский язык", + "sl": "italijanščina", + "sv": "italienska", + "zh_Hans": "意大利语", + "zh_Hant": "義大利語" + }, + "hideInAnswer": "_country=ch|it|sm|va" + }, + { + "if": "language=rm", + "hideInAnswer": "_country=ch" + }, + { + "if": "language=zh", + "hideInAnswer": "_country=cn" + }, + { + "if": "language=tr", + "hideInAnswer": "_country=cy|tr" + }, + { + "if": "language=el", + "hideInAnswer": "_country=cy" + }, + { + "if": "language=cs", + "hideInAnswer": "_country=cz" + }, + { + "if": "language=da", + "then": { + "ca": "danès", + "da": "dansk", + "de": "Dänisch", + "en": "Danish", + "eo": "dana lingvo", + "es": "danés", + "fi": "tanska", + "fr": "danois", + "gl": "lingua dinamarquesa", + "hu": "dán", + "id": "Bahasa Denmark", + "it": "danese", + "ja": "デンマーク語", + "nb_NO": "dansk", + "nl": "Deens", + "pl": "język duński", + "pt": "dinamarquês", + "pt_BR": "dinamarquês", + "ru": "датский язык", + "sl": "Danščina", + "sv": "danska", + "zh_Hans": "丹麦语", + "zh_Hant": "丹麥語" + }, + "hideInAnswer": "_country=dk" + }, + { + "if": "language=et", + "hideInAnswer": "_country=ee" + }, + { + "if": "language=ti", + "hideInAnswer": "_country=er" + }, + { + "if": "language=am", + "hideInAnswer": "_country=et" + }, + { + "if": "language=fi", + "then": { + "ca": "finès", + "da": "finsk", + "de": "Finnisch", + "en": "Finnish", + "eo": "finna lingvo", + "es": "finés", + "fi": "suomi", + "fr": "finnois", + "gl": "finés", + "hu": "finn", + "id": "Finlandia", + "it": "finlandese", + "ja": "フィンランド語", + "nb_NO": "finsk", + "nl": "Fins", + "pl": "język fiński", + "pt": "finlandês", + "pt_BR": "língua finlandesa", + "ru": "финский язык", + "sl": "finščina", + "sv": "finska", + "zh_Hans": "芬兰语", + "zh_Hant": "芬蘭語" + }, + "hideInAnswer": "_country=fi" + }, + { + "if": "language=sv", + "then": { + "ca": "suec", + "da": "svensk", + "de": "Schwedisch", + "en": "Swedish", + "eo": "sveda lingvo", + "es": "sueco", + "fi": "ruotsi", + "fr": "suédois", + "gl": "lingua sueca", + "hu": "svéd", + "id": "Swedia", + "it": "svedese", + "ja": "スウェーデン語", + "nb_NO": "svensk", + "nl": "Zweeds", + "pl": "język szwedzki", + "pt": "língua sueca", + "pt_BR": "língua sueca", + "ru": "шведский язык", + "sl": "švedščina", + "sv": "svenska", + "zh_Hant": "瑞典語" + }, + "hideInAnswer": "_country=fi|se" + }, + { + "if": "language=fj", + "hideInAnswer": "_country=fj" + }, + { + "if": "language=ab", + "hideInAnswer": "_country=ge" + }, + { + "if": "language=ka", + "hideInAnswer": "_country=ge" + }, + { + "if": "language=ht", + "hideInAnswer": "_country=ht" + }, + { + "if": "language=hu", + "then": { + "ca": "hongarès", + "da": "ungarsk", + "de": "Ungarisch", + "en": "Hungarian", + "eo": "hungara lingvo", + "es": "húngaro", + "fi": "unkari", + "fr": "hongrois", + "gl": "lingua húngara", + "hu": "magyar", + "id": "Hongaria", + "it": "ungherese", + "ja": "ハンガリー語", + "nb_NO": "ungarsk", + "nl": "Hongaars", + "pl": "język węgierski", + "pt": "húngaro", + "pt_BR": "língua húngara", + "ru": "венгерский язык", + "sl": "madžarščina", + "sv": "ungerska", + "zh_Hant": "匈牙利語" + }, + "hideInAnswer": "_country=hu" + }, + { + "if": "language=id", + "then": { + "ca": "indonesi", + "da": "indonesisk", + "de": "Indonesisch", + "en": "Indonesian", + "eo": "indonezia lingvo", + "es": "indonesio", + "fi": "indonesia", + "fr": "indonésien", + "gl": "lingua indonesia", + "hu": "indonéz", + "id": "Indonesia", + "it": "indonesiano", + "ja": "インドネシア語", + "nb_NO": "indonesisk", + "nl": "Indonesisch", + "pl": "język indonezyjski", + "pt": "língua indonésia", + "pt_BR": "língua indonésia", + "ru": "индонезийский язык", + "sl": "indonezijščina", + "sv": "indonesiska", + "zh_Hans": "印度尼西亚语", + "zh_Hant": "印尼語" + }, + "hideInAnswer": "_country=id" + }, + { + "if": "language=jv", + "hideInAnswer": "_country=id" + }, + { + "if": "language=ga", + "hideInAnswer": "_country=ie" + }, + { + "if": "language=he", + "hideInAnswer": "_country=il" + }, + { + "if": "language=hi", + "hideInAnswer": "_country=in" + }, + { + "if": "language=ku", + "hideInAnswer": "_country=iq" + }, + { + "if": "language=fa", + "hideInAnswer": "_country=ir" + }, + { + "if": "language=is", + "hideInAnswer": "_country=is" + }, + { + "if": "language=ja", + "then": { + "ca": "japonès", + "da": "japansk", + "de": "Japanisch", + "en": "Japanese", + "eo": "japana lingvo", + "es": "japonés", + "fi": "japani", + "fr": "japonais", + "gl": "lingua xaponesa", + "hu": "japán", + "id": "bahasa Jepang", + "it": "giapponese", + "ja": "日本語", + "nb_NO": "japansk", + "nl": "Japans", + "pl": "język japoński", + "pt": "japonês", + "pt_BR": "língua japonesa", + "ru": "японский язык", + "sl": "Japonščina", + "sv": "japanska", + "zh_Hans": "日语", + "zh_Hant": "日語" + }, + "hideInAnswer": "_country=jp|pw" + }, + { + "if": "language=sw", + "hideInAnswer": "_country=ke|rw|tz|ug" + }, + { + "if": "language=ky", + "hideInAnswer": "_country=kg" + }, + { + "if": "language=km", + "hideInAnswer": "_country=kh" + }, + { + "if": "language=ko", + "hideInAnswer": "_country=kp|kr" + }, + { + "if": "language=kk", + "hideInAnswer": "_country=kz" + }, + { + "if": "language=lo", + "hideInAnswer": "_country=la" + }, + { + "if": "language=ta", + "hideInAnswer": "_country=lk|sg" + }, + { + "if": "language=si", + "hideInAnswer": "_country=lk" + }, + { + "if": "language=st", + "hideInAnswer": "_country=ls|za|zw" + }, + { + "if": "language=lt", + "hideInAnswer": "_country=lt" + }, + { + "if": "language=lb", + "hideInAnswer": "_country=lu" + }, + { + "if": "language=lv", + "hideInAnswer": "_country=lv" + }, + { + "if": "language=ro", + "hideInAnswer": "_country=md|ro" + }, + { + "if": "language=mg", + "hideInAnswer": "_country=mg" + }, + { + "if": "language=mh", + "hideInAnswer": "_country=mh" + }, + { + "if": "language=mk", + "hideInAnswer": "_country=mk" + }, + { + "if": "language=my", + "hideInAnswer": "_country=mm" + }, + { + "if": "language=mn", + "hideInAnswer": "_country=mn" + }, + { + "if": "language=mt", + "hideInAnswer": "_country=mt" + }, + { + "if": "language=dv", + "hideInAnswer": "_country=mv" + }, + { + "if": "language=ny", + "hideInAnswer": "_country=mw|zw" + }, + { + "if": "language=yo", + "hideInAnswer": "_country=ng" + }, + { + "if": "language=no", + "hideInAnswer": "_country=no" + }, + { + "if": "language=nn", + "hideInAnswer": "_country=no" + }, + { + "if": "language=nb", + "hideInAnswer": "_country=no" + }, + { + "if": "language=ne", + "hideInAnswer": "_country=np" + }, + { + "if": "language=na", + "hideInAnswer": "_country=nr" + }, + { + "if": "language=mi", + "hideInAnswer": "_country=nz" + }, + { + "if": "language=ho", + "hideInAnswer": "_country=pg" + }, + { + "if": "language=ur", + "hideInAnswer": "_country=pk" + }, + { + "if": "language=pl", + "then": { + "ca": "polonès", + "da": "polsk", + "de": "Polnisch", + "en": "Polish", + "eo": "pola lingvo", + "es": "polaco", + "fi": "puola", + "fr": "polonais", + "gl": "lingua polaca", + "hu": "lengyel", + "id": "Polandia", + "it": "polacco", + "ja": "ポーランド語", + "nb_NO": "polsk", + "nl": "Pools", + "pl": "język polski", + "pt": "polaco", + "pt_BR": "língua polonesa", + "ru": "польский язык", + "sl": "poljščina", + "sv": "polska", + "zh_Hans": "波兰语", + "zh_Hant": "波蘭語" + }, + "hideInAnswer": "_country=pl" + }, + { + "if": "language=rw", + "hideInAnswer": "_country=rw" + }, + { + "if": "language=sl", + "then": { + "ca": "eslovè", + "da": "slovensk", + "de": "Slowenisch", + "en": "Slovene", + "eo": "slovena lingvo", + "es": "esloveno", + "fi": "sloveeni", + "fr": "slovène", + "gl": "lingua eslovena", + "hu": "szlovén", + "id": "Bahasa Slovenia", + "it": "sloveno", + "ja": "スロベニア語", + "nb_NO": "slovensk", + "nl": "Sloveens", + "pl": "język słoweński", + "pt": "língua eslovena", + "pt_BR": "língua eslovena", + "ru": "словенский язык", + "sl": "slovenščina", + "sv": "slovenska", + "zh_Hant": "斯洛維尼亞語" + }, + "hideInAnswer": "_country=si" + }, + { + "if": "language=sk", + "hideInAnswer": "_country=sk" + }, + { + "if": "language=wo", + "hideInAnswer": "_country=sn" + }, + { + "if": "language=so", + "hideInAnswer": "_country=so" + }, + { + "if": "language=ss", + "hideInAnswer": "_country=sz|za" + }, + { + "if": "language=th", + "hideInAnswer": "_country=th" + }, + { + "if": "language=tg", + "hideInAnswer": "_country=tj" + }, + { + "if": "language=to", + "hideInAnswer": "_country=to" + }, + { + "if": "language=uk", + "hideInAnswer": "_country=ua" + }, + { + "if": "language=la", + "hideInAnswer": "_country=va" + }, + { + "if": "language=vi", + "hideInAnswer": "_country=vn" + }, + { + "if": "language=bi", + "hideInAnswer": "_country=vu" + }, + { + "if": "language=sm", + "hideInAnswer": "_country=ws" + }, + { + "if": "language=af", + "hideInAnswer": "_country=za" + }, + { + "if": "language=ve", + "hideInAnswer": "_country=za|zw" + }, + { + "if": "language=tn", + "hideInAnswer": "_country=za|zw" + }, + { + "if": "language=ts", + "hideInAnswer": "_country=za|zw" + }, + { + "if": "language=nr", + "hideInAnswer": "_country=za" + }, + { + "if": "language=zu", + "hideInAnswer": "_country=za" + }, + { + "if": "language=xh", + "hideInAnswer": "_country=za|zw" + }, + { + "if": "language=sn", + "hideInAnswer": "_country=zw" + }, + { + "if": "language=nd", + "hideInAnswer": "_country=zw" + } + ], + "question": "What languages are spoken here?" + } +} \ No newline at end of file diff --git a/scripts/fetchLanguages.ts b/scripts/fetchLanguages.ts index 33e24012c..12c9f4ae6 100644 --- a/scripts/fetchLanguages.ts +++ b/scripts/fetchLanguages.ts @@ -7,6 +7,9 @@ import {Utils} from "../Utils"; import ScriptUtils from "./ScriptUtils"; import {existsSync, readFileSync, writeFileSync} from "fs"; import * as used_languages from "../assets/generated/used_languages.json" +import {QuestionableTagRenderingConfigJson} from "../Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson"; +import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; + const languageRemap = { // MapComplete (or weblate) on the left, language of wikimedia on the right "nb":"nb_NO", @@ -25,7 +28,6 @@ async function fetch(target: string){ async function fetchRegularLanguages() { - ScriptUtils.fixUtils() console.log("Fetching languages") const sparql = 'SELECT ?lang ?label ?code \n' + @@ -67,7 +69,6 @@ async function fetchSpecial(id: number, code: string) { '} ' const url = wds.sparqlQuery(sparql) -// request the generated URL with your favorite HTTP request library const result = await Utils.downloadJson(url, {"User-Agent": "MapComplete script"}) const bindings = result.results.bindings bindings.forEach(binding => binding["code"] = {value: code}) @@ -107,6 +108,32 @@ function getNativeList(langs: Map>){ return native } +async function getOfficialLanguagesPerCountry() : Promise>{ + const lngs = new Map(); + const sparql = `SELECT ?country ?countryLabel ?countryCode ?language ?languageCode ?languageLabel + WHERE + { + ?country wdt:P31/wdt:P279* wd:Q3624078; + wdt:P297 ?countryCode; + wdt:P37 ?language. + ?language wdt:P218 ?languageCode. + SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } + }` + const url = wds.sparqlQuery(sparql) + + const result = await Utils.downloadJson(url, {"User-Agent": "MapComplete script"}) + const bindings : {countryCode: {value: string}, languageCode: {value: string}}[]= result.results.bindings + for (const binding of bindings) { + const countryCode = binding.countryCode.value + const language = binding.languageCode.value + if(lngs.get(countryCode) === undefined){ + lngs.set(countryCode, []) + } + lngs.get(countryCode).push(language) + } + return lngs; +} + async function main(wipeCache = false){ const cacheFile = "./assets/generated/languages-wd.json" if(wipeCache || !existsSync(cacheFile)){ @@ -121,7 +148,7 @@ async function main(wipeCache = false){ writeFileSync("./assets/language_native.json", JSON.stringify(nativeList, null, " ")) - const translations = Utils.MapToObj>(perId, (value, key) => { + const translations = Utils.MapToObj(perId, (value, key) => { if(!usedLanguages.has(key)){ return undefined // Remove unused languages } @@ -135,7 +162,44 @@ async function main(wipeCache = false){ writeFileSync("./assets/language_translations.json", JSON.stringify(translations, null, " ")) + + + let officialLanguages : Record; + const officialLanguagesPath = "./assets/language_in_country.json" + if(existsSync("./assets/languages_in_country.json") && !wipeCache){ + officialLanguages = JSON.parse(readFileSync(officialLanguagesPath, "utf8")) + }else { + officialLanguages = Utils.MapToObj(await getOfficialLanguagesPerCountry(), t => t) + writeFileSync(officialLanguagesPath, JSON.stringify(officialLanguages, null, " ")) + } + + const perLanguage = Utils.TransposeMap(officialLanguages); + console.log(JSON.stringify(perLanguage, null, " ")) + const mappings: {if: string, then: Record, hideInAnswer: string}[] = [] + for (const language of Object.keys(perLanguage)) { + const countries = Utils.Dedup(perLanguage[language].map(c => c.toLowerCase())) + mappings.push({ + if: "language="+language, + then: translations[language], + hideInAnswer : "_country="+countries.join("|") + }) + } + + const tagRenderings = { + id: "official-language", + mappings, + question: "What languages are spoken here?" + } + + writeFileSync("./assets/layers/language/language.json", JSON.stringify({ + id:"language", + description: "Various tagRenderings to help language tooling", + tagRenderings + }, null, " ")) + } const forceRefresh = process.argv[2] === "--force-refresh" -main(forceRefresh).then(() => console.log("Done!")) \ No newline at end of file +ScriptUtils.fixUtils() +main(forceRefresh).then(() => console.log("Done!")) + diff --git a/scripts/generateTranslations.ts b/scripts/generateTranslations.ts index 32553fe39..b4aa5a5ce 100644 --- a/scripts/generateTranslations.ts +++ b/scripts/generateTranslations.ts @@ -32,6 +32,10 @@ class TranslationPart { } addTranslationObject(translations: any, context?: string) { + if(translations["#"] === "no-translations"){ + console.log("Ignoring object at ",context,"which has '#':'no-translations'") + return; + } for (const translationsKey in translations) { if (!translations.hasOwnProperty(translationsKey)) { continue; @@ -267,6 +271,9 @@ class TranslationPart { * @param tr */ function isTranslation(tr: any): boolean { + if(tr["#"] === "no-translations") { + return false + } for (const key in tr) { if (typeof tr[key] !== "string") { return false;