有一段时间,我一直在使用这样的东西来获取用户的国家(ISO-3166):
const region = navigator.language.split('-')[1]; // 'US'
Run Code Online (Sandbox Code Playgroud)
我总是假设字符串类似于en-US- 国家将保持数组的第二个位置.
我认为这个假设是不正确的.根据MDN文档,navigator.language返回:"表示BCP 47中定义的语言版本的字符串." 读取BCP 47,主要语言子标签保证是第一个(例如,'en'),但区域代码不保证是第二个子标签.区域子标签之前和之后可以有子标签.
例如"sr-Latn-RS",有效的BCP 47语言标记:
sr | Latn | RS
primary language | script subtag | region subtag
Run Code Online (Sandbox Code Playgroud)
从navigator.languageBCP 47的子集返回的值是否仅包含语言和区域?或者是否存在通常用于从语言标记中提取区域子标签的库或正则表达式?
是否有一种聪明的方法可以在Android中为不到21的API获取BCP47语言代码?在API级别21+中,Locale.toLanguageTag正是我所需要的.如何在较低的API级别获得此功能?
我正在为iOS应用程序编写服务器API.作为初始化过程的一部分,应用程序应通过API调用将电话界面语言发送到服务器.
问题是Apple 在其功能中使用了称为IETF BCP 47语言标识符的东西.NSLocale preferredLanguages
返回的值具有不同的长度(例如[aa, ab, ace, ach, ada, ady, ae, af, afa, afh, agq, ...],我发现很少的解析器可以将此代码转换为适当的语言标识符.
我想使用更常见的ISO-639-2三字母语言标识符,它无处不在,有许多语言的许多解析器,并且有一个标准的3个字母的语言表示.
如何将IETF BCP 47语言标识符转换为ISO-639-2三字母语言标识符,最好是在Python中?