多语言包
功能介绍#
多语言包插件实现向arkid注册语言翻译数据功能,开发者仅需提供翻译完成后的字典和对应语言名称即可完成多语言国际化的配置功能。
实现思路#
开发者在开发多语言包插件时,仅需继承多语言插件基类并重载language_type与language_data两个函数即可,平台会将插件中数据整合进平台翻译数据,通过openapi描述分发至前端,前端页面即可获取对应数据以完成国际化功能。
注意: 一个语言包插件仅支持一种语言翻译数据,同时优先级为 数据库自定义翻译数据 > 插件翻译数据 > 平台自带翻译数据
sequenceDiagram
participant U as 客户端
participant C as 平台核心
participant B as 多语言包插件
C->>B: 加载插件
B->>C: 注册语言包
U->>C: 请求openAPI描述数据
C->>C: 整理翻译数据,依次叠加平台翻译、插件翻译、租户自定义翻译
C->>U: 整理完成的翻译数据
示例如下:
class TranslationZhExtension(LanguageExtension):
def language_type(self) -> str:
return _("简体中文")
def language_data(self) -> dict:
return {
"data":"数据"
}
抽象函数#
基类定义#
arkid.core.extension.language.LanguageExtension (Extension)
#
Source code in arkid/core/extension/language.py
class LanguageExtension(Extension):
TYPE = "language"
@property
def type(self):
return LanguageExtension.TYPE
def load(self):
super().load()
self.load_language_data(
language_type=self.language_type(),
data=self.language_data()
)
def load_language_data(self, data, language_type=_("简体中文")):
"""加载语言包
Args:
data (dict): 翻译数据
language_type (str, optional): 语言名称. Defaults to _("简体中文").
"""
self.language_type = language_type
self.extension_data = data
extension = self.model
try:
language_data, _ = LanguageData.active_objects.get_or_create(
extension=extension)
language_data.extension_data = self.extension_data
language_data.name = self.language_type
language_data.save()
except Exception as err:
logger.error(err)
self.refresh_lang_maps()
@abstractmethod
def language_type(self) -> str:
""" 语言类型
Returns:
str: 语言类型名称 默认为简体中文
"""
return _("简体中文")
@abstractmethod
def language_data(self) -> dict:
"""翻译数据
Returns:
dict: 翻译数据字典
"""
return {}
def refresh_lang_maps(self):
"""刷新语言包
"""
core_translation.lang_maps = core_translation.reset_lang_maps()
language_data(self)
#
language_type(self)
#
load(self)
#
load_language_data(self, data, language_type='简体中文')
#
加载语言包
Parameters:
Name | Type | Description | Default |
---|---|---|---|
data |
dict |
翻译数据 |
required |
language_type |
str |
语言名称. Defaults to _("简体中文"). |
'简体中文' |
Source code in arkid/core/extension/language.py
def load_language_data(self, data, language_type=_("简体中文")):
"""加载语言包
Args:
data (dict): 翻译数据
language_type (str, optional): 语言名称. Defaults to _("简体中文").
"""
self.language_type = language_type
self.extension_data = data
extension = self.model
try:
language_data, _ = LanguageData.active_objects.get_or_create(
extension=extension)
language_data.extension_data = self.extension_data
language_data.name = self.language_type
language_data.save()
except Exception as err:
logger.error(err)
self.refresh_lang_maps()