python脚本中的多语言支持

时间:2014-01-22 00:12:08

标签: python string multilingual

我有一个大型 python(2.7)脚本,它从数据库中读取数据并生成pdf格式的图片。我的照片上有标签等字符串......

现在我想为脚本添加多语言支持,因此我可以通过将变量传递给我的脚本来生成不同语言的相同图片。

我正在考虑将一个包含所有字符串及其翻译的类放在字典中。例如:

Strings['string1'] = {'de':'string in german', 'en': 'string in english'}

我可以使用

访问字符串
my_needed_string = 'string1'
selected_language = 'en'
Strings[my_needed_string][selected_language]

有更好,更专业的方法吗? “更好”我的意思是更灵活,更容易维护?我有两种或更多种语言的至少80种不同的字符串。

谢谢

4 个答案:

答案 0 :(得分:6)

请参阅python gettext模块以获取i18n支持

答案 1 :(得分:0)

前一段时间我遇到了这个问题,只是通过用我需要的两种语言的单词创建两个数组来解决了这个问题。

# array with english words
engList = ["dog", "cat"]
# array with german words
gerList = ["Hund", "Katze"]

然后,我只是将另一个数组设置为所需的语言数组,并使用该数组中的单词。

# referenced array set to the english array
langList = engList

print(langList[0],"+",langList[1])

# change to the german array when needed
langList = gerList

print(langList[0],"+",langList[1])

当然不可能完美,但这对我有用。 希望我能帮忙!

答案 2 :(得分:0)

如果您只是创建一个不同的.py并在那里使用每种语言的if语句在其中创建一个新类,则可能是一种更“ pythonic的方式”

class Locale:
def __init__(self, loc):
    if loc == "en":
    self.string = "something in english"
    if loc == "fr":
    self.string == "something in french"

答案 3 :(得分:0)

如果您只有几种语言,并且不想使用某些i18n东西,请尝试以下一种方法:

示例(我只是在py文件中使用字典,如果您要使用json,请告诉我)

此外,这是用python 3而不是2编写的。

en.py

en = {
    "eng": "english",
    "heb": "hebrew",
    "menu": {
        "menu1": "one",
        "menu2": "two"
    }
}

he.py

he = {
    "eng": "אנגלית",
    "heb": "עברית",
    "menu": {
        "menu1": "אחד",
        "menu2": "שתיים"
    }
}

使用SimpleNamespace的选项1:

from types import SimpleNamespace

#import language dicts from which ever folder and file they are, for me its the same folder and different files...
from .he import he
from .en import en

class NestedNamespace(SimpleNamespace):
    def __init__(self, dictionary, **kwargs):
        super().__init__(**kwargs)
        for key, value in dictionary.items():
            if isinstance(value, dict):
                self.__setattr__(key, NestedNamespace(value))
            else:
                self.__setattr__(key, value)

text = {}
text.update({"he": NestedNamespace(he)})
text.update({"en": NestedNamespace(en)})
print(text['he'].menu.menu1) #works

使用namedtuple的选项2(根据我所读到的关于namedtuple的制作方式的知识,我认为这比较慢,但我不是专业人士,因此请选择您喜欢的任何东西)

from collections import namedtuple

def customDictDecoder(dict1):
    for key, value in dict1.items():
        if type(value) is dict:
            dict1[key] = customDictDecoder(value)
    return namedtuple('X', dict1.keys())(*dict1.values())

text = {}
text.update({"he": customDictDecoder(he)})
text.update({"en": customDictDecoder(en)})
print(text['he'].menu.menu2) #works

如果您希望print(text.he.menu.menu1)工作,则可以,但是我看不到它的用途,如果您愿意,请告诉我