我想知道如何通过按模块或页面分离翻译文件来实现 Angular v11 项目中的国际化。
我正在学习 i18n 国际化,我发现的示例对每种语言使用一个文件,该语言的所有翻译都存储在一个文件中。但是,我至少希望按模块分开,因为我的项目包含大量文本,单个文件最终会变得很大且令人困惑。有人有什么提示或建议吗?
我已经看到了这样做的可能,但我没有找到太多例子。
我想知道如何通过按模块或页面分离翻译文件来实现 Angular v11 项目中的国际化。
我正在学习 i18n 国际化,我发现的示例对每种语言使用一个文件,该语言的所有翻译都存储在一个文件中。但是,我至少希望按模块分开,因为我的项目包含大量文本,单个文件最终会变得很大且令人困惑。有人有什么提示或建议吗?
我已经看到了这样做的可能,但我没有找到太多例子。
我正在研究一个示例项目,但很明显,你正在用翻译文件的大小来换取合并各种翻译文件和/或同步多个实例的开销
TranslateService
。总结:这是个坏主意。文档建议采用集中式方法(仅具体提到使用文件夹来分组翻译文件,但暗示所有翻译文件都应该在那里):
关于您担心的“单个文件最终会变得很大且令人困惑”,文档的管理翻译部分介绍了一种简化编辑的方法。我没有将它包括在我的答案中,因为它推广了特定的(付费)产品。
此外,文档的为什么 [...] 上下文 ID [...]部分建议使用嵌套的翻译定义,以便按代码库中以开发人员为中心的方面(如页面、模块、组件或功能)进行分组,从而使组织(以及查找)翻译更容易:
但如果你确实想这样做......
在默认使用情况下,每个 实例都会
TranslateService
打开一个<lang>.json
文件。如果您希望<lang>.json
每个模块/组件都有一个文件,则您需要手动将该模块/组件的翻译文件中的翻译添加到现有 已知的翻译键中,或者您需要为模块/组件的翻译文件TranslateService
创建一个新的 实例。TranslateService
第一种方法应该可以使用,
setTranslation
但是您必须将<lang>.json
文件加载到内存中并将其解析为InterpolatableTranslationObject
您自己的文件。我不确定这种方法是否能按预期工作,您可能会遇到一些问题(可能必须手动触发变化检测,可能必须手动切换语言并返回当前语言以触发重新翻译,可能必须推迟加载组件直到当前模块/组件完成修补其翻译等),我不知道。
但粗略的草图可能是这样的:
您也可以尝试按照daniel-sc的回答在 Angular 中更新/合并 i18n 翻译文件。
第二种方法需要元服务(或更可能是注入令牌)来同步多个实例,这
TranslateService
对我来说是一个直接的危险信号,表明这不是一个好方法。除非这是最后的选择,否则我不会尝试它。