如何将IETF BCP 47语言标识符转换为ISO-639-2?

Ada*_*tan 5 python ios iso-639-2 ietf-bcp-47

我正在为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中?

Mar*_*ers 6

BCP 47标识符以2个字母ISO 639-1 3个字母639-2,639-3或639-5语言代码开头; 请参阅RFC 5646语法部分:

Language-Tag  = langtag             ; normal language tags
              / privateuse          ; private use tag
              / grandfathered       ; grandfathered tags

langtag       = language
                ["-" script]
                ["-" region]
                *("-" variant)
                *("-" extension)
                ["-" privateuse]

language      = 2*3ALPHA            ; shortest ISO 639 code
                ["-" extlang]       ; sometimes followed by
                                    ; extended language subtags
              / 4ALPHA              ; or reserved for future use
              / 5*8ALPHA            ; or registered language subtag
Run Code Online (Sandbox Code Playgroud)

我不希望Apple使用这些privateusegrandfathered表格,因此您可以假设您在此处查看ISO 639-1,ISO 639-2,ISO 639-3或ISO 639-5语言代码.只需将2个字母的ISO-639-1代码映射到3个字母的ISO 639-*代码即可.

你可以使用这个pycountry:

import pycountry

lang = pycountry.languages.get(alpha2=two_letter_code)
three_letter_code = lang.terminology
Run Code Online (Sandbox Code Playgroud)

演示:

>>> import pycountry
>>> lang = pycountry.languages.get(alpha2='aa')
>>> lang.terminology
u'aar'
Run Code Online (Sandbox Code Playgroud)

其中术语形式是优选的3个字母的代码; 还有一个参考书目表格,仅有22个参赛作品不同.参见ISO 639-2 B和T代码.该套餐不包括ISO 639-5的条目; 该列表在某些地方与639-2重叠并发生冲突,我认为Apple根本不会使用这些代码.