dram.me

metasfresh的多语言处理

本文以metasfresh的主菜单为例,介绍metasfresh的多语言处理机制。

metasfresh的多语言数据存放在数据库中,包括两份数据:基础语言数据和翻译数据。界面文本呈现时的核心逻辑是判断当前语言是否是基础语言,如果是,则不获取翻译数据,如果不是,则获取。metasfresh的基础语言是德语,例如数据库表AD_Menu中的name字段,就有大量德语。

对于基础语言的判断处理,主要在de.metas.i18n.Language.isBaseLanguage()

再来看一下主菜单中文本的处理,文本相关的代码主要是在org.compiere.model.MTree.getNodeDetails()接口,其中调用了org.adempiere.model.tree.spi.IPOTreeSupport.getNodeInfoSelectSQL(),返回菜单项信息,针对不同语言,返回的SQL语句不同,可能关联翻译表中的信息。

另外,IPOTreeSupport包含多个实现,不同的实现,适用于不同的数据库,具体的关联在de.metas.modelvalidator.SwatValidator.initialize()注册。

例如主菜单的文本,通过以下语句关联MenuTreeSupport

Services.get(IPOTreeSupportFactory.class).register(I_AD_Menu.Table_Name, MenuTreeSupport.class);