2022-07-07 20:51:47 +08:00
|
|
|
#!/usr/bin/python
|
|
|
|
# ----------------------------------------------------------------------------
|
|
|
|
# MultiLanguage: Get the multi-language strings for console.
|
|
|
|
#
|
|
|
|
# Author: Bin Zhang
|
|
|
|
#
|
|
|
|
# License: MIT
|
|
|
|
# ----------------------------------------------------------------------------
|
|
|
|
'''
|
|
|
|
Get the multi-language strings for console.
|
|
|
|
'''
|
|
|
|
|
2022-10-01 16:24:52 +08:00
|
|
|
import axmol
|
2022-07-07 20:51:47 +08:00
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import json
|
|
|
|
import locale
|
|
|
|
|
|
|
|
def get_current_path():
|
|
|
|
if getattr(sys, 'frozen', None):
|
|
|
|
ret = os.path.realpath(os.path.dirname(sys.executable))
|
|
|
|
else:
|
|
|
|
ret = os.path.realpath(os.path.dirname(__file__))
|
|
|
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
class MultiLanguage(object):
|
|
|
|
CONFIG_FILE_NAME = 'strings.json'
|
|
|
|
DEFAULT_LANGUAGE = 'en'
|
|
|
|
instance = None
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def get_available_langs(cls):
|
|
|
|
info = cls.get_instance().cfg_info
|
|
|
|
ret = []
|
|
|
|
if info is not None:
|
|
|
|
for key in info.keys():
|
2022-10-01 16:24:52 +08:00
|
|
|
if axmol.isunicode(key):
|
2022-07-07 20:51:47 +08:00
|
|
|
ret.append(key.encode('utf-8'))
|
|
|
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def get_instance(cls):
|
|
|
|
if cls.instance is None:
|
|
|
|
cls.instance = MultiLanguage()
|
|
|
|
|
|
|
|
return cls.instance
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def get_string(cls, key, fmt_value=None):
|
|
|
|
fmt = cls.get_instance().get_current_string(key)
|
|
|
|
if fmt_value is None:
|
|
|
|
ret = fmt
|
|
|
|
else:
|
|
|
|
if isinstance(fmt_value, tuple):
|
|
|
|
dst_values = []
|
|
|
|
for value in fmt_value:
|
2022-10-01 16:24:52 +08:00
|
|
|
if axmol.isunicode(value):
|
2022-07-07 20:51:47 +08:00
|
|
|
dst_values.append(value.encode(cls.get_instance().get_encoding()))
|
|
|
|
else:
|
|
|
|
dst_values.append(value)
|
|
|
|
ret = fmt % tuple(dst_values)
|
2022-10-01 16:24:52 +08:00
|
|
|
elif axmol.isunicode(fmt_value):
|
2022-07-07 20:51:47 +08:00
|
|
|
ret = fmt % fmt_value.encode(cls.get_instance().get_encoding())
|
|
|
|
else:
|
|
|
|
ret = fmt % fmt_value
|
|
|
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def set_language(cls, lang):
|
|
|
|
cls.get_instance().set_current_language(lang)
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
cfg_file_path = os.path.join(get_current_path(), MultiLanguage.CONFIG_FILE_NAME)
|
|
|
|
|
|
|
|
# python3 always unicode, so no needs to translate locale at python scripts
|
|
|
|
try:
|
|
|
|
sys_lang, self.encoding = locale.getdefaultlocale()
|
|
|
|
except:
|
|
|
|
sys_lang = None
|
|
|
|
self.encoding = None
|
|
|
|
pass
|
|
|
|
|
|
|
|
if (self.encoding is None) or sys.version_info.major >= 3:
|
|
|
|
self.encoding = 'utf-8'
|
|
|
|
|
|
|
|
if sys_lang is None:
|
|
|
|
cur_lang_key = MultiLanguage.DEFAULT_LANGUAGE
|
|
|
|
else:
|
|
|
|
cur_lang_key = self.get_lang_key(sys_lang)
|
|
|
|
|
|
|
|
# get the strings info
|
|
|
|
if os.path.isfile(cfg_file_path):
|
|
|
|
if(sys.version_info.major >= 3):
|
|
|
|
f = open(cfg_file_path,'r', encoding='utf-8')
|
|
|
|
self.cfg_info = json.load(f)
|
|
|
|
else:
|
|
|
|
f = open(cfg_file_path)
|
|
|
|
self.cfg_info = json.load(f, encoding='utf-8')
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
# python3 if self.cfg_info.has_key(cur_lang_key):
|
|
|
|
if (cur_lang_key in self.cfg_info):
|
|
|
|
self.cur_lang_strings = self.cfg_info[cur_lang_key]
|
|
|
|
else:
|
|
|
|
self.cur_lang_strings = None
|
|
|
|
|
|
|
|
if MultiLanguage.DEFAULT_LANGUAGE in self.cfg_info: # if self.cfg_info.has_key(MultiLanguage.DEFAULT_LANGUAGE):
|
|
|
|
self.default_lang_strings = self.cfg_info[MultiLanguage.DEFAULT_LANGUAGE]
|
|
|
|
else:
|
|
|
|
self.default_lang_strings = None
|
|
|
|
else:
|
|
|
|
self.cfg_info = None
|
|
|
|
self.cur_lang_strings = None
|
|
|
|
self.default_lang_strings = None
|
|
|
|
|
|
|
|
def get_lang_key(self, sys_lang):
|
|
|
|
sys_lang_info = sys_lang.split('_')
|
|
|
|
lang = sys_lang_info[0]
|
|
|
|
lang = lang.lower()
|
|
|
|
region = None
|
|
|
|
if len(sys_lang_info) > 1:
|
|
|
|
region = sys_lang_info[1]
|
|
|
|
region = region.lower()
|
|
|
|
|
|
|
|
if lang == 'zh':
|
|
|
|
if (region is None) or (region == 'cn'):
|
|
|
|
ret = lang
|
|
|
|
else:
|
|
|
|
ret = 'zh_tr'
|
|
|
|
else:
|
|
|
|
ret = lang
|
|
|
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
def has_key(self, key, strings_info):
|
|
|
|
ret = False
|
|
|
|
if strings_info is not None and (key in strings_info): # if strings_info is not None and strings_info.has_key(key):
|
|
|
|
ret = True
|
|
|
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
def set_current_language(self, lang):
|
|
|
|
if (self.cfg_info is not None) and (self.cfg_info.has_key(lang)):
|
|
|
|
self.cur_lang_strings = self.cfg_info[lang]
|
|
|
|
else:
|
2022-10-01 16:24:52 +08:00
|
|
|
axmol.Logging.warning(MultiLanguage.get_string('COCOS_WARNING_LANG_NOT_SUPPORT_FMT', lang))
|
2022-07-07 20:51:47 +08:00
|
|
|
|
|
|
|
def get_encoding(self):
|
|
|
|
return self.encoding
|
|
|
|
|
|
|
|
def get_current_string(self, key):
|
|
|
|
if self.has_key(key, self.cur_lang_strings):
|
|
|
|
ret = self.cur_lang_strings[key]
|
|
|
|
elif self.has_key(key, self.default_lang_strings):
|
|
|
|
ret = self.default_lang_strings[key]
|
|
|
|
else:
|
|
|
|
ret= key
|
|
|
|
|
2022-10-01 16:24:52 +08:00
|
|
|
ret = axmol.transcode(ret, self.encoding)
|
2022-07-07 20:51:47 +08:00
|
|
|
|
|
|
|
return ret
|