在Python中从语言环境中剥离变量?

在Python中从语言环境中剥离变量?,python,locale,Python,Locale,当用户向我的服务器发出请求时,他们会从浏览器中发送语言环境,这样我们就可以用他们喜欢的语言为他们提供服务。对于大多数美国英语用户,我们得到的语言环境是en-US,正如预期的那样。但是,有些人将区域设置作为en-US-posix或en-US-u-va-posix发送。我们只想用en-US版本。显然,我们可以找到replace-posix和-u-va-posix,但我们也希望在其他语言中这样做,而无需查看每个语言环境并手动做出决定 所以我们只想去掉任何语言环境的变体,得到简化的语言环境。问题是,变量

当用户向我的服务器发出请求时,他们会从浏览器中发送语言环境,这样我们就可以用他们喜欢的语言为他们提供服务。对于大多数美国英语用户,我们得到的语言环境是
en-US
,正如预期的那样。但是,有些人将区域设置作为
en-US-posix
en-US-u-va-posix
发送。我们只想用en-US版本。显然,我们可以找到replace
-posix
-u-va-posix
,但我们也希望在其他语言中这样做,而无需查看每个语言环境并手动做出决定

所以我们只想去掉任何语言环境的变体,得到简化的语言环境。问题是,变量所在的地区之间不一致。在某些语言中,变体介于语言和国家之间

我还没有找到一个库,可以解析我们看到的所有类型的语言环境。例如,巴贝尔没有识别我们收集的555个地区中的120个

本地python
locale
模块似乎至少可以识别所有的locale,但我看不到一种方法可以仅提取给定的语言/国家,比如
en-US-u-va-posix


如何从python中的任何语言环境中剥离变体?

这是一个非常好的问题。我不知道
locale
中有任何元数据可以帮助您,但一个快速而肮脏的解决方案可能是使用正则表达式,或者根据需要构建异常。例如:

import re

def get_short_locale(locale_name):
    return re.match(r'^([a-zA-Z]+-[a-zA-Z]+)(.*)$', locale_name)[1]

对于复杂的区域设置,如“iu-Cans-CA”和“iu-Latn-CA”,这很容易出错,但是如果您需要支持这些,您可以添加异常,直到有人提出更具弹性的解决方案。

这是一个非常好的问题。我不知道
locale
中有任何元数据可以帮助您,但一个快速而肮脏的解决方案可能是使用正则表达式,或者根据需要构建异常。例如:

import re

def get_short_locale(locale_name):
    return re.match(r'^([a-zA-Z]+-[a-zA-Z]+)(.*)$', locale_name)[1]
对于复杂的区域设置,如“iu Cans CA”和“iu Latn CA”,这很容易出错,但如果您需要支持这些,可以添加异常,直到有人提出更具弹性的解决方案