背景:
我正在处理一个相当大的应用程序,它在整个应用程序中都有硬编码的字符串。应用程序需要进行本地化和翻译的时候到了。此时,所有(或几乎所有)硬编码字符串都被移动到具有字符串参数的适当命名的类中。
我需要做什么:
我尝试做的是让所有这些字符串类对象扩展基类。在该基类内部,我抓住了操作系统的默认语言环境,并希望在不同的文件夹中加载适当的本地化类。
到目前为止我所拥有的:
示例字符串类 - 文件名HeaderStrings.py
class TabLabels(BaseLanguageClass):
label_one = 'Label 1'
label_two = 'Label 2'
label_three = 'Label 3'
BaseLanguageClass
class BaseLanguageClass(object):
def __init__(self, os_locale=None):
if os_locale is None:
os_locale = locale.getdefaultlocale()[0]
if os_locale == 'en_US':
pass # Do nothing and just initialize the called class
else:
# Gets set to TabLabels
string_class = str(self.___class__.__name__)
# Gets set to HeaderStrings
file_path = str(inspect.getfile(self.__class__)).split('\\')[-1].split('.')[0]
try:
object_i_want = getattr(__import__("path.to.l10n.classes.%s.%s" % (os_locale, file_path),
fromlist=[string_class]), string_class)()
except:
pass
object_i_want
正确获取了我需要的本地化类。但是,我需要能够返回此而不是实际调用的那个。如果导入失败,它只返回一个被调用的导入。我已经尝试将object_i_want
分配给自己,但我知道这不会起作用,但我是出于绝望而尝试过的。
如果我这样做:
var = TabLabels(os_locale='fr').label_one
,单步执行它会正确获取object_i_want
的法语类,但var最终成为原始TabLables的实例,而不是fr.TabLabels
我所拥有的可能是非常hackish,我希望有一个更好的方法来做到这一点,而无需重构接近2000个文件。任何和所有的帮助表示赞赏。
答案 0 :(得分:0)
在玩了一下之后,我已经确定最好的方法是使用TabLabels.label_one
来实际重新调用我想要的类对象。
不幸的是,我的其他同事一直在直接引用静态变量,而不是创建类的新实例(TabLabels().label_one
vs class BaseLanguageClass(object):
def __new__(self, os_locale=None):
if os_locale is None:
os_locale = locale.getdefaultlocale()[0]
if os_locale == 'en_US':
return self
else:
# Gets set to TabLabels
string_class = str(self).split('\\')[0].split('.')[-1].split('\'')[0]
# Gets set to HeaderStrings
file_path = str(self).split('\\')[0].split('.')[-2]
try:
return getattr(__import__("path.to.l10n.classes.%s.%s" % (os_locale, file_path),
fromlist=[string_class]), string_class)
except:
return self
)。因此,最终似乎需要进行大量的重构。除非有人有解决方案。
new Rectangle()