Skip to content

多语言包

功能介绍#

多语言包插件实现向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) #

翻译数据

Returns:

Type Description
dict

翻译数据字典

Source code in arkid/core/extension/language.py
@abstractmethod
def language_data(self) -> dict:
    """翻译数据

    Returns:
        dict: 翻译数据字典
    """
    return {}

language_type(self) #

语言类型

Returns:

Type Description
str

语言类型名称 默认为简体中文

Source code in arkid/core/extension/language.py
@abstractmethod
def language_type(self) -> str:
    """ 语言类型

    Returns:
        str: 语言类型名称 默认为简体中文
    """
    return _("简体中文")

load(self) #

抽象方法,插件加载的入口方法

Source code in arkid/core/extension/language.py
def load(self):
    super().load()
    self.load_language_data(
        language_type=self.language_type(),
        data=self.language_data()
    )

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()

refresh_lang_maps(self) #

刷新语言包

Source code in arkid/core/extension/language.py
def refresh_lang_maps(self):
    """刷新语言包
    """
    core_translation.lang_maps = core_translation.reset_lang_maps()

示例#

extension_root.com_longgui_language_zh.TranslationZhExtension (LanguageExtension) #

Source code in extension_root/com_longgui_language_zh/__init__.py
class TranslationZhExtension(LanguageExtension):
    def language_type(self) -> str:
        return _("简体中文")

    def language_data(self) -> dict:
        return {
            "data":"数据"
        }

language_data(self) #

翻译数据

Returns:

Type Description
dict

翻译数据字典

Source code in extension_root/com_longgui_language_zh/__init__.py
def language_data(self) -> dict:
    return {
        "data":"数据"
    }

language_type(self) #

语言类型

Returns:

Type Description
str

语言类型名称 默认为简体中文

Source code in extension_root/com_longgui_language_zh/__init__.py
def language_type(self) -> str:
    return _("简体中文")

评论