UI5 i18n 支持静态模型数据
UI5 i18n support for the static model data
我正在探索 sap.f.ProductSwitch
controller on a sample project sap.f.sample.ShellBarProductSwitch
。
除一件事外一切都很清楚,如果我想为产品列表 (model/data.json
) 提供 i18n
支持,应该采用什么方法?
例如除了硬编码的英文产品列表:
{
"items": [
{
"src": "sap-icon://home",
"title": "Home"
}
]
}
我想提供一个法文:
{
"items": [
{
"src": "sap-icon://home",
"title": "Maison"
}
]
}
通过基本对话,我可以依赖内置的 i18n
UI5 引擎,但在这里我不知道如何在 XML 模板中启用 i18n
:
<f:ProductSwitchItem
src = "{src}"
title = "{title}" />
自制解决方案。
XML-模板:
<f:ProductSwitchItem
src = "{src}"
title = "{titleI18NKey}" />
控制器:
const resourceBundle = this.getView().getModel("i18n").getResourceBundle();
const productSwitcherModelData = this.getView().getModel("productSwitcher")?.getData();
productSwitcherModelData.items.forEach((item) => {
item.titleI18NKey = resourceBundle.getText(item.titleI18NKey);
});
this.productSwitcher.setModel(this.getView().getModel("productSwitcher"));
在产品切换器模型而不是真实文本中,我存储了一个键值对:
titleI18NKey: i18n_dialogue_key
稍后被 i18n
模型的结束文本替换并设置为 productSwitcher
模型。
P.S。如果有更优雅的基于UI5功能的实现,请告诉我。
如果您只有静态值,我宁愿不使用列表绑定,而是单独创建产品切换项:
<ProductSwitch change="fnChange" >
<items>
<ProductSwitchItem src="sap-icon://retail-store" title="{i18n>Title_1}" />
<ProductSwitchItem src="sap-icon://family-care" title="{i18n>Title_2}" />
</items>
</ProductSwitch >
这样您就可以像往常一样使用标题的资源模型,不需要任何其他代码。
如果您更喜欢数据绑定方法,可以使用带有标题 属性 绑定的格式化程序从资源模型中检索文本。
必须在您的 data.json 中为每个项目定义资源包文本的密钥:
JSON数据模型:
{
"items": [
{
"src": "sap-icon://home",
"titleI18NKey": "myResourceBundleKeyToThisItem"
}
]
}
XML-template:
<ProductSwitch
change = "onClickProductSwitcherItem"
items = "{
path: '/items'
}">
<items>
<ProductSwitchItem
src = "{src}"
title = "{
path: 'titleI18NKey',
formatter: '.getText'
}" />
</items>
</ProductSwitch>
格式化程序 getText
需要在您的控制器中定义:
getText(i18nKey) {
const dialogue = this.getView().getModel("i18n").getProperty(i18nKey);
return dialogue;
}
我正在探索 sap.f.ProductSwitch
controller on a sample project sap.f.sample.ShellBarProductSwitch
。
除一件事外一切都很清楚,如果我想为产品列表 (model/data.json
) 提供 i18n
支持,应该采用什么方法?
例如除了硬编码的英文产品列表:
{
"items": [
{
"src": "sap-icon://home",
"title": "Home"
}
]
}
我想提供一个法文:
{
"items": [
{
"src": "sap-icon://home",
"title": "Maison"
}
]
}
通过基本对话,我可以依赖内置的 i18n
UI5 引擎,但在这里我不知道如何在 XML 模板中启用 i18n
:
<f:ProductSwitchItem
src = "{src}"
title = "{title}" />
自制解决方案。
XML-模板:
<f:ProductSwitchItem
src = "{src}"
title = "{titleI18NKey}" />
控制器:
const resourceBundle = this.getView().getModel("i18n").getResourceBundle();
const productSwitcherModelData = this.getView().getModel("productSwitcher")?.getData();
productSwitcherModelData.items.forEach((item) => {
item.titleI18NKey = resourceBundle.getText(item.titleI18NKey);
});
this.productSwitcher.setModel(this.getView().getModel("productSwitcher"));
在产品切换器模型而不是真实文本中,我存储了一个键值对:
titleI18NKey: i18n_dialogue_key
稍后被 i18n
模型的结束文本替换并设置为 productSwitcher
模型。
P.S。如果有更优雅的基于UI5功能的实现,请告诉我。
如果您只有静态值,我宁愿不使用列表绑定,而是单独创建产品切换项:
<ProductSwitch change="fnChange" >
<items>
<ProductSwitchItem src="sap-icon://retail-store" title="{i18n>Title_1}" />
<ProductSwitchItem src="sap-icon://family-care" title="{i18n>Title_2}" />
</items>
</ProductSwitch >
这样您就可以像往常一样使用标题的资源模型,不需要任何其他代码。
如果您更喜欢数据绑定方法,可以使用带有标题 属性 绑定的格式化程序从资源模型中检索文本。
必须在您的 data.json 中为每个项目定义资源包文本的密钥:
JSON数据模型:
{
"items": [
{
"src": "sap-icon://home",
"titleI18NKey": "myResourceBundleKeyToThisItem"
}
]
}
XML-template:
<ProductSwitch
change = "onClickProductSwitcherItem"
items = "{
path: '/items'
}">
<items>
<ProductSwitchItem
src = "{src}"
title = "{
path: 'titleI18NKey',
formatter: '.getText'
}" />
</items>
</ProductSwitch>
格式化程序 getText
需要在您的控制器中定义:
getText(i18nKey) {
const dialogue = this.getView().getModel("i18n").getProperty(i18nKey);
return dialogue;
}