diff --git a/tools/cldr-code/src/main/resources/org/unicode/cldr/util/data/locales/scriptToExemplars.txt b/tools/cldr-code/src/main/resources/org/unicode/cldr/util/data/locales/scriptToExemplars.txt index 0c6f689d73f..de880485e69 100644 --- a/tools/cldr-code/src/main/resources/org/unicode/cldr/util/data/locales/scriptToExemplars.txt +++ b/tools/cldr-code/src/main/resources/org/unicode/cldr/util/data/locales/scriptToExemplars.txt @@ -1,6 +1,8 @@ # Contains sample aux exemplars for a hint in examples, for use in ScriptToExemplars.java -# It is generated from the different sets of exemplars that share the same script. -# Eg, if locale1 and locale2 use the same script, and locale1 has exemplars [abcd] and locale2 has [cdef], then the set will be [af] +# It is generated from the different sets of exemplars for locales that share the same script. +# It excludes characters that are common to all the locales. +# Eg, if locale1 and locale2 use the same script, and locale1 has exemplars [abcd] and locale2 has [cdef], +# then the resulting set will be [af] # If the set is [], it is omitted here. # It is cached here to avoid the cost of doing the derivation at runtime; possible because the CLDR exemplars don't change much in the ST, # and these are only hints. @@ -8,19 +10,19 @@ # - Contains a test that verifies that this data correspond to the derivation from the CLDR data. # - Also has the details of the derivation from CLDR data, and shows how to refresh this data, if CLDR data changes. # - NOTE: We may tweak the derivation over time. -Arab ; 110 ; [ؠ-ئةثحخذص-غؽف-كه-ْٰٔٙٛٲٶٹ-ځڃ-ڊڌڍڏڑړڕږژ-ښڠڢڤڦک-ګڭگڱڳڵں-ھہۄۆ-ېےەݜݢݲ{ئا}{ئه}{ئو}{ئى}{ئۆ}{ئۇ}{ئۈ}{ئې}] -Beng ; 10 ; [ঌঽৄৎৗৠ-ৣৰ] +Arab ; 105 ; [ؠ-ئةثحخذص-غؽف-كه-ْٰٔٙٛٲٶٹ-ځڃ-ڊڌڍڏڑړڕږژ-ښڠڢڤڦک-ګڭگڱڳڵں-ھہۃۄۆ-ېےەݙݜݢݨݲ] +Beng ; 12 ; [ঌরঽৄৎৗৠ-ৣৰৱ] Cans ; 133 ; [ᐁᐍᐏᐑᐓᐕᐘᐚᐟᐠᐢ-ᐤᐦᐨᐩᐯᐻᐽᐿᑁᑃᑅᑇᑉᑊᑌᑘᑚᑜᑞᑠᑢᑤᑦᑫᑵᑷᑹᑻᑽᑿᒁᒃᒉᒓᒕᒗᒙᒛᒝᒟᒡᒣᒭᒯᒱᒳᒵᒷᒹᒻᒼᓀᓊᓌᓎᓐᓕ-ᓘᓚᓛᓪᓭᓷᓹᓻᓽᓿᔁᔃᔅᔦᔰᔲᔴᔶᔸᔺᔼᔾᕆ-ᕉᕋᕌᕐᕕ-ᕚᕝᕿ-ᖃᖅᖏᖑ-ᖖᖠ-ᖦᙱ-ᙶ] -Cyrl ; 111 ; [ʼве-йфцш-яё-ќўџѡѣѧѫѯѱѳѵѷѻѽѿ҃҇ґғҕҗҙқҝҟҡңҥҩҫҭүұҳҵҷҹһҽҿӑӕӗәӡӣөӯӳӷԥⷠ-ⷪⷬⷭⷯⷱⷴⸯꙁꙋꙍꙗ꙽ꙿ{гӏ}{дь}{кӏ}{нь}{пӏ}{тӏ}{хӏ}{цӏ}{чӏ}] -Deva ; 63 ; [ँ-ःअ-ऍए-ऑओऔखघङछझञठढणथधफभऱळशष़ऽिू-ॅैॉौ्ॐ-॒ड़ॠ-ॣॻॼॾॿ‌‍{क्ष}{ज्ञ}{त्र}{श्र}] +Cyrl ; 109 ; [ʼве-йфцш-яё-ќўџѡѣѧѫѯѱѳѵѷѻѽѿ҃҇ґғҕҗҙқҝҟҡңҥҩҫҭүұҳҵҷҹһҽҿӑӕӗәӡӣөӯӳӷԥⷠ-ⷪⷬⷭⷯⷱⷴⸯꙁꙋꙍꙗ꙽ꙿ{гӏ}{кӏ}{пӏ}{тӏ}{хӏ}{цӏ}{чӏ}] +Deva ; 59 ; [ँ-ःअ-ऍए-ऑओऔखघङछझञठढणथधफभऱळशष़ऽिू-ॅैॉौ्ॐ-॒ड़ॠ-ॣॻॼॾॿ‌‍] Ethi ; 241 ; [ሇሏሗሟ-ሧሯሷ-ሿቇቐ-ቖቘቚ-ቝቧ-ቯቷ-ቿኇኗ-ኟኧኯኸ-ኾዀዂ-ዅዏዟ-ዧዯዷ-ጇጏጘ-ጟጧ-ጷጿ-ፇፏፗ-ፚ፟ᎀ-ᎏⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ] Grek ; 63 ; [ἀ-ἇἐ-ἕἠ-ἧἰ-ἷὂ-ὄὐ-ὗὢ-ὧὰὲὴὶὸὺὼᾶῆῒῖῗῢῦῧῶ] Hans ; 292 ; [丧乍乾仑仿伏佉佐佑佤侬俩俱倦偌傣储催兆兑净凉凶刑删券剂剌劣勋勾匆匙卜卧厍厘叉吕吞吠吴吻呈呐呦咤咨咯哟唔唤啰喏喻嗒圜圳坏坑埋塑墙壤壳夥奎妆妖妳姊娜娟嫁孕孜宅宠宫宴寇寡寮寸届岗岘岩岭岳崩帛庄庇庙庞弊彊彦彷後循徵怜恒悄患悦惊愧愿慎扑扥扮扰抑抛拏拘拦拷挂捉掩摇摊摔撑敍敲斜斥於旨晃暮曹栋框梨横樱欠歪毁氛汇泄泛泣泪泾洁津浑浙浴涂涅淋淘添渣渴溜滚澎灾灿烟煌煮燕牠-牢猫珀珥琉琊琳琼璃畅疲疾盈盒盗盲磅祛禄秩稀窭箫粒粹糖纠纬绵缚缠缪缶罐羯翅翠耻聘肖肤胁胶脚腐腔腹腾臂芒芭苗茂茅茨荼莪萍著蒲蓉蓬蔑蔕藉虚虹虾蚁蝎蠢袭触谚谜谨贩贸贼赔赶趁跎踩踪迹递遥遵邓郁酋鉴钵钻铺链锐锺镑镭阇阗阮雯霖韵頞颜飙馨骂骤魁鸭鹤] Hant ; 291 ; [俏倉偽傅傘凋凍刨刮剃勾匯卹唇唵啤喪喲噁噓嚏坑墅墓墟墳壩壺孕孵寺尿屍屑帚幟廈廟忡憊懨扮捏捧掠掰揹搏摀撕撲攀攤敞斑斜斧暮曇曬曳朔杖枯栓栽棍棕棺椒槌橄橇橘橙檬檸櫚櫻欖欠残殭汁沫沮泣浣浴涎涮淇淋湘溜漿澡濕烘烹焊焙焰煮燙爍犀犬狡狸猩猾猿獺獾瓢甕疲疾瘦瘧皂皿盆盈盔盥睏瞇瞌瞪磚礫祈禱禿稻穀窄竿筷箏箔篷籠糖糥紉紮紳綽綿縫繃繡繩纖罈罐罩聾肌肺脈脖腐腹膚膠臂臟芙芭芽苣茄茵茸莓莖菇菌萎萵葵蒜蒸蓄蓉蔔蔥蔬蕉蕾薑薯蘋蘑蘿蚊蚓蚯蜥蜴蝙蝟蝠蝦螂螃螞螺蟀蟄蟋蟑蟳蟻蠅蠕蠣衫袍裏裱裹褐襪襯訝診謎豎豔豹贛跆跪踩軸轎辜辣鄙酪醬鉅鉤鋁錨錶鍊鏈鏢鐡鑿閩阱雌霜静靴鞭頌頸顛颱飆飪餃餌餚餾駝駱驕鬍魷鮑鯊鯨鱷鳩鴨鵡鶴鸚鹽黛鼬龐] -Hebr ; 29 ; [ְ-ֹֻ-ֽֿׁׂׄפ{אַ}{אָ}{בֿ}{וּ}{יִ}{כּ}{פּ}{פֿ}{שׂ}{תּ}{ײַ}] -Latn ; 375 ; [a-mo-z·ß-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīį-ıĵķĺļľłńņňŋōŏőœŕŗřśŝşšťŧũūŭůűųŵŷźżžƒƙơưƴǀ-ǃǎǐǒǔǝǥǧǩǫǯǹșțȟɓɔɖɗəɛɣɨɩɲʉ-ʋʒʔʻʼˀḍḑḓḥḵḷḻḽḿṅṇṉṋṛṣṭṯṱṽẁẃẅẓạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹꞌ{a\:}{aʼ}{aː}{a̧}{a̱}{a᷆}{a᷇}{bʼ}{ch}{chʼ}{ch’}{cʼh}{dź}{e\:}{eʼ}{eː}{e̱}{e᷆}{e᷇}{gh}{gy}{gʷ}{gʻ}{g̃}{g̱}{i\:}{iʼ}{iː}{i̧}{i̱}{i᷆}{i᷇}{jhy}{kh}{kʷ}{kʼ}{k’}{ly}{mb}{m̀}{m̄}{nd}{ng}{ny}{n̄}{o\:}{oʻ}{oː}{o̱}{o᷆}{o᷇}{pʼ}{qʼ}{sh}{ts’}{ty}{tz}{tzʼ}{tł’}{tʼ}{t’}{uʼ}{uː}{u̧}{u᷆}{u᷇}{y̱}{à\:}{àː}{á\:}{áː}{è\:}{èː}{é\:}{éː}{ì\:}{ìː}{í\:}{íj́}{íː}{ò\:}{òː}{ó\:}{óː}{ùː}{úː}{ą́}{ę́}{į́}{ŋg}{ŋ̀}{ŋ́}{ŋ̄}{ǝ̀}{ǝ́}{ǝ̂}{ǝ̄}{ǝ̌}{ǫ́}{ɔ̀}{ɔ́}{ɔ̂}{ɔ̃}{ɔ̄}{ɔ̈}{ɔ̌}{ɔ̧}{ɔ̱}{ɔ᷆}{ɔ᷇}{ə̀}{ə́}{ə̂}{ə̄}{ə̌}{ɛ̀}{ɛ́}{ɛ̂}{ɛ̃}{ɛ̄}{ɛ̈}{ɛ̌}{ɛ̧}{ɛ̱}{ɛ̱̈}{ɛ᷆}{ɛ᷇}{ɨ̀}{ɨ́}{ɨ̂}{ɨ̄}{ɨ̌}{ɩ̀}{ɩ́}{ɩ̂}{ʉ̀}{ʉ́}{ʉ̂}{ʉ̄}{ʉ̈}{ʉ̌}{ʊ̀}{ʊ́}{ʊ̂}{ẹ̀}{ẹ́}{ọ̀}{ọ́}] +Hebr ; 12 ; [פ{אַ}{אָ}{בֿ}{וּ}{יִ}{כּ}{פּ}{פֿ}{שׂ}{תּ}{ײַ}] +Latn ; 329 ; [a-mo-z·ß-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīį-ıĵķĺļľłńņňŋōŏőœŕŗřśŝşšťŧũūŭůűųŵŷźżžƒƙơưƴǀ-ǃǎǐǒǔǝǥǧǩǫǯǹșțȟɓɔɖɗəɛɣɨɩɲʉ-ʋʒʔʻʼˀḍḑḓḥḵḷḻḽḿṅṇṉṋṛṣṭṯṱṽẁẃẅẓạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹꞌ{aː}{a̧}{a̱}{a᷆}{a᷇}{eː}{e̱}{e᷆}{e᷇}{gʷ}{g̃}{g̱}{iː}{i̧}{i̱}{i᷆}{i᷇}{kʷ}{m̀}{m̄}{n̄}{oː}{o̱}{o᷆}{o᷇}{uː}{u̧}{u᷆}{u᷇}{y̱}{àː}{áː}{èː}{éː}{ìː}{íj́}{íː}{òː}{óː}{ùː}{úː}{ą́}{ę́}{į́}{ŋ̀}{ŋ́}{ŋ̄}{ǝ̀}{ǝ́}{ǝ̂}{ǝ̄}{ǝ̌}{ǫ́}{ɔ̀}{ɔ́}{ɔ̂}{ɔ̃}{ɔ̄}{ɔ̈}{ɔ̌}{ɔ̧}{ɔ̱}{ɔ᷆}{ɔ᷇}{ə̀}{ə́}{ə̂}{ə̄}{ə̌}{ɛ̀}{ɛ́}{ɛ̂}{ɛ̃}{ɛ̄}{ɛ̈}{ɛ̌}{ɛ̧}{ɛ̱}{ɛ̱̈}{ɛ᷆}{ɛ᷇}{ɨ̀}{ɨ́}{ɨ̂}{ɨ̄}{ɨ̌}{ɩ̀}{ɩ́}{ɩ̂}{ʉ̀}{ʉ́}{ʉ̂}{ʉ̄}{ʉ̈}{ʉ̌}{ʊ̀}{ʊ́}{ʊ̂}{ẹ̀}{ẹ́}{ọ̀}{ọ́}] Mymr ; 63 ; [က-ဃစ-ဏဒ-နဖ-ဘဟ-ဧဩ-ာဲံ့္ှဿၵ-ၸၺ-ႄႇ-ႊ​ꧣ-ꧥ] -Nkoo ; 17 ; [ߑߠߧ-ߵ] -Orya ; 27 ; [ଋଐଓଔଖଘଛଝଠଢଥଧଫଭଯଵ-ଷୃୈୋୌ‌‍{ଅ\:}{ଆ\:}{ଏ\:}] -Telu ; 30 ; [ఋఌఐఔఖఘఙఛఝఠఢథధఫభఱళశషృౄైౌౕౖౠౡ‌‍{డ఼}] -Tibt ; 15 ; [ༀཪཷཹཿྕྖྮ-ྰྴྸ{ཱི}{ཱུ}{ཱྀ}] \ No newline at end of file +Nkoo ; 14 ; [ߑߠߧ߫-ߵ] +Orya ; 22 ; [ଋଐଓଔଖଘଛଝଠଢଥଧଫଭଯଵ-ଷୃୈୋୌ] +Telu ; 28 ; [ఋఌఐఔఖఘఙఛఝఠఢథధఫభఱళశషృౄైౌౕౖౠౡ{డ఼}] +Tibt ; 31 ; [ཊ-ཌཎཥཪཷཹཻཽ-྄ྀྕྖྚ-ྜྞྮ-ྰྴྸྺ-ྼ{ཱི}{ཱུ}{ཱྀ}] diff --git a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/LikelySubtagsTest.java b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/LikelySubtagsTest.java index 88902c478c0..b415fa5a5f7 100644 --- a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/LikelySubtagsTest.java +++ b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/LikelySubtagsTest.java @@ -468,13 +468,8 @@ public String showOverride(String script, String originCountry, String langScrip * Written as one test, to avoid the overhead of iterating over all locales twice. */ public void testGetResolvedScriptVsExemplars() { - if (true) { - warnln("testGetResolvedScriptVsExemplars is temporarily disabled"); - return; - } Factory factory = CLDRConfig.getInstance().getCldrFactory(); LanguageTagParser ltp = new LanguageTagParser(); - // Map scriptToExemplars = new TreeMap<>(); Multimap scriptToMains = TreeMultimap.create(); Multimap scriptToAuxes = TreeMultimap.create(); UnicodeSet collectedBad = new UnicodeSet(); @@ -612,13 +607,7 @@ private UnicodeSet checkSet( UnicodeSet bad = new UnicodeSet(); for (String s : main) { if (!MAIN_AUX_EXPECTED.containsAll(s)) { - s.codePoints() - .forEach( - x -> { - if (!MAIN_AUX_EXPECTED.contains(x)) { - bad.add(x); - } - }); + bad.add(s); } } if (!bad.isEmpty()) { @@ -632,21 +621,27 @@ private UnicodeSet checkSet( + bad.size() + " unexpected exemplar characters:\t" + bad.toPattern(false)); - collected.addAll(bad); } + collected.addAll(bad); } return CldrUtility.flatten(new UnicodeSet(main).removeAll(bad)); } - /** Remove items with a count equal to size */ + /** + * Remove items with a count equal to size (they are common to all locales), and flatten + * (against the whole set) + */ private UnicodeSet getUncommon(UnicodeMap counts, int size) { - for (String s : counts.keySet().freeze()) { + UnicodeSet flattenedAll = + CldrUtility.flatten(counts.keySet()); // we flatten against the whole set + UnicodeSet result = new UnicodeSet(); + for (String s : flattenedAll) { int count = counts.get(s); - if (count == size) { - counts.remove(s); + if (count != size) { + result.add(s); } } - return counts.keySet(); + return result.freeze(); } private void getCounts(Collection usets, UnicodeMap counts) { diff --git a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestExampleGenerator.java b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestExampleGenerator.java index dd018659f0e..e46ed140bd3 100644 --- a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestExampleGenerator.java +++ b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestExampleGenerator.java @@ -1507,13 +1507,13 @@ public void TestUnicodeSetExamples() { "hi", "//ldml/characters/exemplarCharacters[@type=\"auxiliary\"]", "[ॄ‌‍]", - "〖‎🗝️ ॑ ॒ ॠ ॡ क्ष ॻ ज्ञ ॼ ड़ ॾ त्र ॿ ऱ श्र ॢ ॣ〗〖❰ZWNJ❱ ≡ cursive non-joiner〗〖❰ZWJ❱ ≡ cursive joiner〗〖❬internal: ❭[ॄ‌‍]〗" + "〖‎🗝️ ॑ ॒ ॠ ॡ ॻ ॼ ड़ ॾ ॿ ऱ ॢ ॣ〗〖❰ZWNJ❱ ≡ cursive non-joiner〗〖❰ZWJ❱ ≡ cursive joiner〗〖❬internal: ❭[ॄ‌‍]〗" }, { "hu", "//ldml/characters/exemplarCharacters[@type=\"auxiliary\"]", "[qw-yàâ-èê-ìîïñòôøùûÿāăēĕīĭōŏœūŭ]", - "〖‎🗝️ · ắ ằ ẵ ẳ ấ ầ ẫ ẩ ǎ a̧ ą ą́ a᷆ a᷇ ả ạ ặ ậ a̱ a: á: à: aː áː àː aʼ bʼ ɓ ć ĉ č ċ ch ch’ chʼ cʼh ď ḑ đ ḍ ḓ ð dź ɖ ɗ ế ề ễ ể ě ẽ ė ę ę́ e᷆ e᷇ ẻ ẹ ẹ́ ẹ̀ ệ e̱ e: é: è: eː éː èː eʼ ǝ ǝ́ ǝ̀ ǝ̂ ǝ̌ ǝ̄ ə ə́ ə̀ ə̂ ə̌ ə̄ ɛ ɛ́ ɛ̀ ɛ̂ ɛ̌ ɛ̈ ɛ̃ ɛ̧ ɛ̄ ɛ᷆ ɛ᷇ ɛ̱ ɛ̱̈ ƒ ğ ĝ ǧ g̃ ġ ģ g̱ gh gʻ gʷ ǥ ɣ ĥ ȟ ħ ḥ ʻ ǐ ĩ İ i̧ į į́ i᷆ i᷇ ỉ ị i̱ i: í: ì: iː íː ìː íj́ iʼ ı ɨ ɨ́ ɨ̀ ɨ̂ ɨ̌ ɨ̄ ɩ ɩ́ ɩ̀ ɩ̂ ĵ jhy ǩ ķ ḵ k’ kh kʷ kʼ ƙ ĺ ľ ļ ł ḷ ḽ ḻ ḿ m̀ m̄ mb ń ǹ ň ṅ ņ n̄ ṇ ṋ ṉ nd ng ɲ ŋ ŋ́ ŋ̀ ŋ̄ ŋg ố ồ ỗ ổ ǒ õ ǫ ǫ́ o᷆ o᷇ ỏ ơ ớ ờ ỡ ở ợ ọ ọ́ ọ̀ ộ o̱ o: ó: ò: oː óː òː oʻ ɔ ɔ́ ɔ̀ ɔ̂ ɔ̌ ɔ̈ ɔ̃ ɔ̧ ɔ̄ ɔ᷆ ɔ᷇ ɔ̱ pʼ qʼ ŕ ř ŗ ṛ ś ŝ š ş ṣ ș sh ß ť ṭ ț ṱ ṯ t’ tł’ ts’ tz tzʼ tʼ ŧ ǔ ů ũ u̧ ų u᷆ u᷇ ủ ư ứ ừ ữ ử ự ụ uː úː ùː uʼ ʉ ʉ́ ʉ̀ ʉ̂ ʉ̌ ʉ̈ ʉ̄ ʊ ʊ́ ʊ̀ ʊ̂ ṽ ʋ ẃ ẁ ŵ ẅ ý ỳ ŷ ỹ ỷ ỵ y̱ ƴ ź ž ż ẓ ʒ ǯ þ ʔ ˀ ʼ ꞌ ǀ ǁ ǂ ǃ〗〖❬internal: ❭[qw-yàâ-èê-ìîïñòôøùûÿāăēĕīĭōŏœūŭ]〗" + "〖‎🗝️ · ắ ằ ẵ ẳ ấ ầ ẫ ẩ ǎ a̧ ą ą́ a᷆ a᷇ ả ạ ặ ậ a̱ aː áː àː ɓ ć ĉ č ċ ď ḑ đ ḍ ḓ ð ɖ ɗ ế ề ễ ể ě ẽ ė ę ę́ e᷆ e᷇ ẻ ẹ ẹ́ ẹ̀ ệ e̱ eː éː èː ǝ ǝ́ ǝ̀ ǝ̂ ǝ̌ ǝ̄ ə ə́ ə̀ ə̂ ə̌ ə̄ ɛ ɛ́ ɛ̀ ɛ̂ ɛ̌ ɛ̈ ɛ̃ ɛ̧ ɛ̄ ɛ᷆ ɛ᷇ ɛ̱ ɛ̱̈ ƒ ğ ĝ ǧ g̃ ġ ģ g̱ gʷ ǥ ɣ ĥ ȟ ħ ḥ ʻ ǐ ĩ İ i̧ į į́ i᷆ i᷇ ỉ ị i̱ iː íː ìː íj́ ı ɨ ɨ́ ɨ̀ ɨ̂ ɨ̌ ɨ̄ ɩ ɩ́ ɩ̀ ɩ̂ ĵ ǩ ķ ḵ kʷ ƙ ĺ ľ ļ ł ḷ ḽ ḻ ḿ m̀ m̄ ń ǹ ň ṅ ņ n̄ ṇ ṋ ṉ ɲ ŋ ŋ́ ŋ̀ ŋ̄ ố ồ ỗ ổ ǒ õ ǫ ǫ́ o᷆ o᷇ ỏ ơ ớ ờ ỡ ở ợ ọ ọ́ ọ̀ ộ o̱ oː óː òː ɔ ɔ́ ɔ̀ ɔ̂ ɔ̌ ɔ̈ ɔ̃ ɔ̧ ɔ̄ ɔ᷆ ɔ᷇ ɔ̱ ŕ ř ŗ ṛ ś ŝ š ş ṣ ș ß ť ṭ ț ṱ ṯ ŧ ǔ ů ũ u̧ ų u᷆ u᷇ ủ ư ứ ừ ữ ử ự ụ uː úː ùː ʉ ʉ́ ʉ̀ ʉ̂ ʉ̌ ʉ̈ ʉ̄ ʊ ʊ́ ʊ̀ ʊ̂ ṽ ʋ ẃ ẁ ŵ ẅ ý ỳ ŷ ỹ ỷ ỵ y̱ ƴ ź ž ż ẓ ʒ ǯ þ ʔ ˀ ʼ ꞌ ǀ ǁ ǂ ǃ〗〖❬internal: ❭[qw-yàâ-èê-ìîïñòôøùûÿāăēĕīĭōŏœūŭ]〗" }, { "de",