我正在开发一个Electron React / Redux应用程序,它需要能够即时更改语言。目前我们将一些字符串存储为常量(对于不是React组件的组件,例如对话框内容),我们还有一个从模板生成的菜单(见下文)。 我们目前正在使用i18n-react库,它似乎易于使用并支持一些高级功能,如复数等。这是一个加载我们菜单的英语翻译的例子:
import T from 'i18n-react';
T.setTexts({
menu: {
file: {
label: '&File',
new: '&New...',
open: '&Open...',
// etc.
}
}
});
这将是菜单的模板:
const template = [{
label: T.translate('menu.file.label'), //'&File'
submenu: [{
label: T.translate('menu.file.new'), //'&New...'
accelerator: 'Ctrl+N',
click: () => { /*some code*/ },
}],
// etc.
}]
const menu = Electron.remote.Menu.buildFromTemplate(template)
Electron.remote.Menu.setApplicationMenu(menu)
问题是翻译后的字符串就是那个普通的常量字符串。因此,当我们动态更改语言(使用T.setTexts)时,字符串不会改变。反应组件(可能)很好,因为它们存储一个对象,而不仅仅是一个字符串(来自docs的例子):
React.render(
<T.span text={{ key: "greeting", myName: "i18n-react" }}/>,
document.getElementById('content')
);
但是如何说服电子菜单,对话框等改变?