在 WPF 应用程序中实现本地化时,我如何知道 Roboto 是否与该语言不兼容?

When implementing localization in a WPF application, how would I know if Roboto would not be compatible with the language?

我有一个使用 Roboto FontFamily 作为主要字体的 WPF 应用程序,但可能存在与 Roboto 不兼容的语言(即中文)。我如何以编程方式确定该语言是否与 Roboto 不兼容,以便我可以加载正确的 FontFamily? Roboto 有不同的变体,例如 Light、Medium、Bold、Italic 等。如果替代字体也有一些变体,我希望能够选择那些。

Windows10支持​​的语言列表如下:

南非荷兰语、阿尔巴尼亚语、阿姆哈拉语、阿拉伯语、亚美尼亚语、阿萨姆语、阿塞拜疆语、孟加拉语(孟加拉国)、孟加拉语(印度)、巴斯克语、白俄罗斯语、波斯尼亚语、保加利亚语、加泰罗尼亚语、中库尔德语、切诺基语、中文(简体)、中文(繁体)、克罗地亚语、捷克语、丹麦语、达里语 - 波斯语(阿富汗)、荷兰语、德语、希腊语、英语(英国)、英语(美国)、爱沙尼亚语、芬兰语、菲律宾语、法语(加拿大)、法语(法国) 、加利西亚语、格鲁吉亚语、古吉拉特语、豪萨语、希伯来语、印地语、匈牙利语、冰岛语、伊博语、印度尼西亚语、爱尔兰语、意大利语、日语、卡纳达语、哈萨克语、高棉语、基切语、基尼亚卢旺达语、孔卡尼语、韩语、吉尔吉斯语、老挝语、拉脱维亚语、立陶宛语、卢森堡语、马其顿语、马来语、马拉雅拉姆语、马耳他语、毛利语、马拉地语、蒙古语、尼泊尔语、北索托语、挪威博克马尔语、挪威尼诺斯克语、奥里亚语、波斯语(伊朗)、旁遮普语(阿拉伯语)、旁遮普语(古尔穆基语)、波兰语、葡萄牙语 (巴西)、葡萄牙语(葡萄牙)、盖丘亚语、罗马尼亚语、俄语、苏格兰盖尔语、塞尔维亚语(西里尔文、波斯尼亚和黑塞哥维那)、塞尔维亚语(西里尔文、塞尔维亚语)、塞尔维亚语(拉丁语)、信德语(阿拉伯语)、僧伽罗语、斯洛伐克语、斯洛文尼亚语、西班牙语(西班牙)、西班牙语(墨西哥)、斯瓦希里语、瑞典语、塔吉克语、泰米尔语、鞑靼语、泰卢固语、泰语、提格里尼亚语、茨瓦纳语、土耳其语、土库曼语, 乌克兰语, 乌尔都语, 维吾尔语, 乌兹别克语, 巴伦西亚语, 越南语, 威尔士语, 沃洛夫语, 科萨语, 约鲁巴语, 祖鲁语。

是否有 Roboto 支持的 Windows 10 种语言的列表,或者 Roboto 不支持的语言列表?我没能找到这样的列表。

  1. 知道支持哪种语言字体并不是什么大事;你只能知道它包含什么字形。 (例如,逗号本身不是“英语”、“俄语”或“波斯语”符号,而是在字体中)。要更广泛地了解一种字体适合显示某种语言,您可以检查通常用于该语言的一系列符号(您可以查看它们 here or here). In C# 3.0 and later, you can use GlyphTypeface.CharacterToGlyphMap 来做到这一点。 例如,如果您想知道您的字体是否支持阿拉伯字符,您将首先检查哪个 unicode 范围包含阿拉伯字形(即 0600-06FF),然后您可以检查您的字体文件是否包含它们。这是一个示例(returns 如果所有相关的 glyps 都存在则为真,如果我们找不到某些东西则为假):
    private bool FontSuitableForArabic()
    {
        (int, int) langSymbolsRange;
        langSymbolsRange.Item1 = 0x600;
        langSymbolsRange.Item2 = 0x6FF;

        var families = Fonts.GetFontFamilies(@"C:\Users\User\Documents\Temp\TestFonts\Roboto-Regular.TTF");
        foreach (var family in families)
        {
            var typefaces = family.GetTypefaces();
            foreach (Typeface typeface in typefaces)
            {
                GlyphTypeface glyph;
                typeface.TryGetGlyphTypeface(out glyph);
                IDictionary<int, ushort> characterMap = glyph.CharacterToGlyphMap;
                for (int i = langSymbolsRange.Item1; i != langSymbolsRange.Item2; i++)
                {
                    if (!characterMap.TryGetValue(i, out ushort _))
                    {
                        Console.WriteLine($"Failed to find Unicode Character {i:X} in this font!");
                        return false;
                    }
                }
            }
        }
        return true;
    }
  1. 大多数时候,您并不需要这样做,因为 WPF 具有字体回退系统,如 question. To specify your own fallback fonts, you'd use the FontFamily class 中所述。例如。你想使用 Roboto,当它没有阿拉伯字符时,你想使用 Janna LT Bold:
    myTextBlock.FontFamily = new FontFamily("Roboto, Janna LT Bold");

<TextBlock FontFamily="Roboto, Janna LT Bold">Hello, world</TextBlock>

我就 Roboto 支持 Windows 10 种语言联系了 Google 字体团队,得到的答复是:

使用hyperglot.rosettatype.com确定任何字体的语言支持

使用本网站时,Roboto 不支持以下 Windows 10 种语言:

阿姆哈拉语、阿拉伯语、亚美尼亚语、阿萨姆语、阿塞拜疆语、孟加拉语(孟加拉国)、孟加拉语(印度)、白俄罗斯语、波斯尼亚语、切诺基语、中文(简体)、中文(繁体)、达里语 - 波斯语(阿富汗)、格鲁吉亚语、古吉拉特语、豪萨语、希伯来语、印地语、伊博语、卡纳达语、高棉语、孔卡尼语、韩语、吉尔吉斯语、老挝语、马拉雅拉姆语、马拉地语、尼泊尔语、奥迪亚语、波斯语、旁遮普语、罗马尼亚语、信德语、僧伽罗语、泰米尔语、泰卢固语、泰语、 提格里尼亚语、乌尔都语、维吾尔语、瓦伦西亚语、约鲁巴语