Angular-i18n 代码翻译的解决方法?

2024-04-11

我们必须等到 Angular 6 的 Angular-i18n 才能支持错误消息等代码的翻译。

对于那些使用 angular-i18n(例如,而不是 ngx-translate)的人来说,您同时在做什么来处理代码中的翻译?我突然想到,如果字符串不多,那么一个简单的语言服务以及通过语言代码和 id 获取翻译的方法就可以工作,但我对更优雅和“有角度”的东西感兴趣。

我不知道承诺的代码翻译支持会是什么样子,但任何临时解决方案在理想情况下都可以在上线时轻松转换为 Angular-i18n 方式。

人们正在做什么来处理这个问题?有任何想法吗?


这个polyfill 似乎是目前最好的方法:

https://github.com/ngx-translate/i18n-polyfill https://github.com/ngx-translate/i18n-polyfill

它允许您将要翻译的任何内容包装在i18n()函数(这个 API 很可能会在 Angular 的未来版本中保留 - 请参阅本答案底部的我的注释)。

该polyfill主要由负责i18n的Angular团队成员Olivier Combe编写:


对于 Angular 5,安装时需要 0.2.0 版本:

npm install @ngx-translate/[email protected] /cdn-cgi/l/email-protection --save

对于 Angular 6,获取最新版本 - 当前为 1.0.0:

npm install @ngx-translate/[email protected] /cdn-cgi/l/email-protection --save

我让 Polyfill 工作了适用于 JIT 和 AOT 编译,对于 Angular 5(它也适用于 Angular 6)。以下是翻译为单一语言所需执行的操作(这是实现此功能的好方法 - 然后您可以稍后使用多种语言,我将在下面进一步解释):


应用程序模块.ts

将以下导入添加到根 Angular 模块:

import { TRANSLATIONS, TRANSLATIONS_FORMAT } from '@angular/core';
import { I18n } from '@ngx-translate/i18n-polyfill';

添加以下常量,并在根模块中指定提供程序:

// add this after import + export statements
// you need to specify the location for your translations file
// this is the translations file that will be used for translations in .ts files

const translations = require(`raw-loader!../locale/messages.fr.xlf`);

@NgModule({ ....

  providers:
  [
    I18n,
    {provide: TRANSLATIONS, useValue: translations},
    {provide: TRANSLATIONS_FORMAT, useValue: 'xlf'},
    ...

使用AOT编译的注意事项:如果您使用 AOT 编译 翻译您的模板,.ts 文件中消息的翻译 仍将在运行时使用 JIT 编译完成(这就是为什么你 需要参考TRANSLATIONS and TRANSLATIONS_FORMAT而不是仅仅 在构建脚本中指定这些)。


*.ts

在要提供翻译的 .ts 文件中,添加以下内容:

import { I18n } from '@ngx-translate/i18n-polyfill';

constructor(private i18n: I18n) {
    console.log(i18n("This is a test {{myVar}} !", {myVar: "^_^"}));
}

这表明您甚至可以在要翻译的消息中包含插值。

您可以使用 i18n 定义(即使用指定翻译“源”id、含义、描述),如下所示:

this.i18n({value: 'Some message', id: 'Some message id', meaning: 'Meaning of some message', description: 'Description of some message'})

您仍然需要提取消息,并且可以使用 ngx-extractor 工具来执行此操作。当您安装 polyfill 时,它已包含在内,并且我在下面添加了一个有关其在 npm 脚本中使用的示例。另请参阅自述文件填充页面 https://github.com/ngx-translate/i18n-polyfill%20%22%22.


多种语言

为了支持多种语言之间的切换,您需要一个工厂提供商来进行翻译。 readme 中有详细信息填充页面 https://github.com/ngx-translate/i18n-polyfill。您的根模块中需要类似的内容(或者对于 AOT 编译,请将返回值替换为localeFactory使用一个函数来检测当前正在运行的应用程序的哪种 AOT 编译语言变体):

  export function localeFactory(): string {
    return (window.clientInformation && window.clientInformation.language) || window.navigator.language;
  }

  providers:
  [
    {
      provide: TRANSLATIONS,
      useFactory: (locale) => {
        locale = locale || 'en'; // default to english if no locale provided
        return require(`raw-loader!../locale/messages.${locale}.xlf`);
      },
      deps: [LOCALE_ID]
    },
    {
      provide: LOCALE_ID,
      useFactory: localeFactory
    },

消息提取和 xliffmerge

所有这一切都兼容合并 https://github.com/martinroob/ngx-i18nsupport/wiki/Tutorial-for-using-xliffmerge-with-angular-cli,这是一个很好的工具,可以自动合并任何new您添加的翻译,不会覆盖现有翻译。 Xliffmerge 还可以使用 Google 翻译自动执行翻译(您需要 Google 翻译 API 密钥)。为此,我按以下顺序进行提取和合并/翻译,before我进行实际的 AOT 构建:

"extract-i18n-template-messages": "ng xi18n --outputPath=src/locale --i18n-format=xlf",
"extract-i18n-ts-messages": "ngx-extractor --input=\"src/**/*.ts\" --format=xlf --out-file=src/locale/messages.xlf",
"generate-new-translations": "xliffmerge --profile xliffmerge.json en fr es de zh"

网站特定语言版本的 AOT 构建如下所示:

"build:fr": "ng build --aot --output-path=dist/fr --base-href /fr/ --i18nFile=src/locale/messages.fr.xlf --i18nFormat=xlf --locale=fr",

该polyfill的当前状态:

这主要是由负责 i18n 的 Angular 团队成员 Olivier Combe 编写的。在此阶段,这是一个“推测性”polyfill,用于翻译 .ts 文件中的变量或字符串。它很可能会被 Angular 内置的 API 所取代,这将非常相似,因此以后的升级应该是可以合理管理的。以下是来自 Github 页面的免责声明:

这个库是一个推测性的polyfill,这意味着它应该 替换将来即将推出的 API。 如果 API 不同,如果可能且必要,将提供迁移工具。

关于即将推出的 Angular 6 小版本中对代码中变量/字符串翻译的支持进行了一些讨论。

以下是 Olivier Combe 的引言(今年 3 月),摘自 Github 上的以下讨论:

https://github.com/angular/angular/issues/11405 https://github.com/angular/angular/issues/11405

运行时 i18n 的第一个 PR 已合并到 master 中,同时 我们将使用一个 hello world 演示应用程序来测试功能。有用 在运行时,并且理论上支持代码翻译,即使有 目前还没有任何服务。目前它的支持非常少(静态 字符串),我们正在努力添加新功能(我将制作 下周进行提取工作,然后是带有占位符的动态字符串 和变量)。之后我们将提供代码翻译服务。 一旦新功能完成,它就会合并到主功能中,您 不必等待新专业。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular-i18n 代码翻译的解决方法? 的相关文章

  • Angular 2 路由器使用 Observable 进行解析

    Angular 2 RC 5 发布后引入了路由器解析 Here https angular io docs ts latest guide router html resolve guard使用 Promise 演示了示例 如果我使用 Ob
  • 测试 - 存根服务方法未定义

    我已经在非常简单的代码上编写了一个非常简单的测试 但由于某种原因存根服务方法未定义 当我使用 Jasmine Spy 时 它可以工作 但对于这样一个简单的任务 有人可以解释一下为什么会发生这种情况吗 我删除了 import 语句只是为了减少
  • Angular 5 中使用 rxjs 进行持久订阅

    我对 Angular 5 中的 rxjs 仍然有点陌生 并且很难表达我的问题 我仍然希望得到一些提示 我经常会得到相同的设置 多个组件显示相同的数据 访问数据的单个服务 现在通过 Observables 接收数据时我有 2 个选择 a 订阅
  • 在请求标头中设置 Cookie Angular2

    我是 angular2 的新手 我的服务器 spring 在其响应标头中使用 set cookie 值来响应身份验证 如何将该 cookie 设置为下一次 API 调用的请求标头 我搜索了很多 但找不到合适的解决方案 作为http get
  • Webpack 在 Angular 的 ng 服务中的作用

    我是 Angular 的新手 想知道当我们为应用程序提供服务时 Webpack 在幕后扮演什么角色 在最初的印象中 我开始知道 webpack 是一个构建和打包工具 它将所有必需的 JS 文件分组到单独的包中 然而 我无法找到 webpac
  • 无法在 Angular 10 中的“pdf-viewer”=>“ng2-pdf-viewer”中显示 blob url

    我有一个 API 它将上传的文件作为 blob 返回 当我尝试绑定时src如果使用 blob URL 则它不会显示任何内容 但是 当我尝试绑定直接 URL 时 它可以显示 PDF 文件 这是我下面给出的代码 我的 TS 代码 downloa
  • 发生未处理的异常:工作区中未设置配置“生产”

    您好 在 Angular 8 中创建了一个项目 最初它仅支持一种默认语言 US EN 然后我应用了本地化 在准备生产构建的本地化之前 我曾经给出以下命令 ng build prod base href Windchill com qiwkC
  • http.put 请求在 Angular2 中执行两次

    我正在尝试更新从我的 Angular2 应用程序调用 API 的公司记录 我在调试时注意到 http 调用被执行了两次 我找到了另一个堆栈溢出线程 https stackoverflow com questions 37241294 ang
  • 不同事件的角度停止传播

    在我的 Angular 4 应用程序中 我有一个带有 dblclick 处理程序的父组件和一个带有 click 处理程序的子组件 组件 html
  • ngrx 存储是否持久?

    ngrx 存储是否持久 换句话说 我们可以关闭浏览器重新打开它 并检索添加到ngrx 商店 https github com ngrx platform 目前 ngrx store 不支持此类功能 但是您可以通过使用类似的库来维护状态ngr
  • 如何使用 *ngFor 迭代对象键

    我想在 Angular 2 中使用 ngFor 迭代 object object 问题是该对象不是对象的数组 而是包含更多对象的对象的对象 data id 834 first name GS last name Shahid phone 0
  • 如何更改元素的 CSS 类并在单击时删除所有其他类

    我如何处理 AngularJS 2 中的一种情况 即单击一个元素需要更改其自己的样式 并且如果其他元素具有该样式 则需要将其删除 最好在一个函数中 如同Angular js 如何在单击时更改元素 css 类并删除所有其他元素 https s
  • Angular - 为每个请求设置标头

    我需要在用户登录后为每个后续请求设置一些授权标头 要为特定请求设置标头 import Headers from angular2 http var headers new Headers headers append headerName
  • Angular 停止 Enter 键提交

    I am trying to stop the Enter from submitting my button and rather make it point to another function I tried trapping th
  • 在 Angular 中获取当前路由路径名称的最简单方法是什么?

    我正在寻找一种获取当前路线的路径名称的好方法 这是我能找到的最简单的 this route snapshot firstChild url 0 path 有没有更好的办法 谢谢 谢谢大家的回答 这是我发现我必须做的 router event
  • Angular 2 ngModel 不工作(仅限 javascript)

    所以我是 Angular2 javascript 的新手 我能够通过 5 分钟的 Angular 教程制作一个简单的 Hello world 我对 Angular2 的新变化很好奇 我开始阅读 Angular2 Js 文档 但我发现它不完整
  • 使用 Nginx 在 Docker 容器内部署带有路由器的 Angular2

    我正在尝试部署一个使用框架的路由器功能的 Angular 2 但在 docker 容器内使用 nginx 为其提供服务时遇到一些问题 由 angular cli 构建的 Angular 应用程序具有如下文件结构 dist 08c42df75
  • 创建 AoT 兼容的服务工厂

    我正在尝试为缓存服务创建一个服务工厂 主要要求是每次可以使用不同的字符串实例化单个服务 最终的结果会有多个cache每个服务都由唯一定义databaseName 每个缓存可以有一个或多个stores也由唯一定义storeName 其他服务将
  • 使用 facebook 共享动态更新元标签 - Angular 6

    我需要动态更新元标记 如 og title og description 和 og image 并在 facebook 上共享相同的内容 我已经尝试了所有方法 但没有任何效果 首先 我尝试使用 javascript 设置元标记 如下所示 v
  • 如何禁用 ng2-dragula 上的某些元素的拖动

    我想在顶部显示名称组并取消其上的拖动事件 如何禁用移动某些元素 例如该组名称位于顶部 我的代码是 dragulaService drag subscribe value gt console log drag value 0 我的模板 di

随机推荐

  • Laravel 中的 Socket.io 轮询 404

    我正在尝试使用 Socket io 实现一个聊天应用程序 进入我的 Laravel 应用程序 聊天应用程序本身运行良好 但我在 Laravel 中遇到问题 我尝试在端口 8000 上提供 Laravel 服务 并在 8000 上提供聊天服务
  • 访问回调 user_is_anonymous 的反义词是什么?

    我知道在 drupal 模块中使用它来指定只有匿名用户才能看到该模块 仅指定登录用户的回调是什么 我有一个页面 我只想让登录用户访问 谢谢 它是用户 is logged in http api drupal org api function
  • 在 AVD 上运行自定义 ROM

    有谁知道是否可以在 AVD 上运行自定义 ROM 我该怎么做 谢谢 如果您自己构建自定义 rom 则在构建自定义 rom 后 您可以使用以下命令启动它emulator 但要做到这一点 你首先需要为模拟器构建 ROM 通常 full gene
  • 数据库结果的数组结构

    这可能是一个非常微不足道的问题 但是以下哪种方法是构造返回数据库结果的数组的最佳实践 比如说博客文章列表 对文章进行排序和分组 或者对元素进行排序和分组 Array title gt Array 0 gt Untitled 1 gt Unt
  • current_prolog_flag double_quotes DCG(代码或字符)?

    在使用 SWI Prolog DCG 时 我注意到有些人注意到 set prolog flag double quotes codes Jan http www swi prolog org pldoc man section string
  • 为什么正则表达式 ((x,y)|(x,z)) 是不确定的?

    为什么正则表达式 x y x z 像 Core Java 一书中所说的那样是不确定的 作者给出了他的观点 当解析器看到 x 时 它不知道采取两个替代方案中的哪一个 这个表达式可以以确定性形式重写为 x y z 谁能给我一个解释吗 为了具有确
  • Android 活动上下文为空

    所以我这里有这些代码 它运行时不会崩溃 但是 当我将 this 传递到网格适配器时 mContext 为空 我尝试传递 getApplicationContext 但仍然无法使 getImage 方法正常运行 因为 getResources
  • 我将如何获得 WPF Windows 应用程序的许可[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我开发了一个小型应用程序 我想尝试并销售它 但我不熟悉如何最好地做到这一点 我将如何锁定该程序以供试用1 我将如何处理接受付款 考虑到
  • SASS 或 LESS 关键帧百分比循环

    我正在测试一些特殊的东西 我正在尝试在关键帧内循环以动态地将百分比写入其中 我已经用 SASS 测试过类似的东西 但它不起作用 keyframes test for i from 0 through 100 i do special stu
  • Mercurial:保持两个分支同步但存在某些持久差异?

    我是一名使用 django 自己工作的 Web 开发人员 我正在尝试了解如何最好地使用 Mercurial 部署网站 我想要的是能够保留一个可用于生产和开发工作的存储库 生产 开发之间总会存在一些差异 例如 它们可能使用不同的数据库 开发总
  • docker 容器中的 Rails 应用程序在开发中不会重新加载

    我跟着这个docker compose 教程 https docs docker com compose rails 关于如何启动 Rails 应用程序 它运行完美 但当我更改控制器时 应用程序不会重新加载 还可以缺少什么吗 我也遇到了这个
  • 在 R6 类上定义括号 (`[`) 运算符

    这是不起作用的 library R6 Foo R6 R6Class Foo public list X NULL metadata NULL initialize function X metadata self X X self meta
  • DropDownListFor, selected = true 不起作用

    Select 对于 DropDownListFor 不起作用 谁能帮我 我有音乐类别和属于某一音乐类别的艺术家 在我的页面上 我想显示艺术家详细信息 并且我希望下拉列表加载所有音乐类别 并选择指定的艺术家音乐类别 但我无法在下拉列表中选择一
  • 找不到 boost_process cmake find_package

    我正在尝试将 boost 库导入到我的 C 项目中 由于某种原因 它找不到 Boost Process 尽管它找到了其他库 我的 CMakeLists txt 文件 cmake minimum required VERSION 3 9 FA
  • Python从某个元素开始重新排列列表

    我有一个 python 列表和一个项目的索引 我想在列表上从索引后面的元素开始循环 例如我有 original list 1 2 3 4 5 my index 2 new list 4 5 1 2 3 我正在努力实现新的清单 只需使用列表s
  • 在 R 中正确使用“ClusterEval”?

    我正在使用 R 编程语言 我有这个数据集 记录一组学生在不同时间的考试结果 1 通过 0 失败 library data table library doParallel Generate some sample data id sampl
  • 我可以将reveal.js 幻灯片对齐到页面顶部吗?

    我正在使用reveal js 并试图弄清楚如何强制我的幻灯片到页面的最左上角 这看起来应该很简单 但是当我使用元素检查器时 它从根本上改变了页面 以至于我什至无法开始将幻灯片移至顶部的归零 将其添加到我的主题中 reveal slides
  • 查看x86架构中的cpu缓存内容

    如何查看或转储基于 x86 的架构的 cpu 缓存内容 每次进行缓存刷新时 我如何才能看到刷新了什么 在哪里 你不能 真的 CPU 缓存被设计为对于 CPU 上运行的代码是透明的 它具有加快代码执行速度的效果 但 CPU 管理有关缓存的所有
  • 你能在 Clojure 中将插入排序表示为幺半群吗?

    这是 Clojure 中插入排序的代码 defn in sort data letfn insert raw x insert raw x sorted y raw x if nil y conj sorted x if lt x y co
  • Angular-i18n 代码翻译的解决方法?

    我们必须等到 Angular 6 的 Angular i18n 才能支持错误消息等代码的翻译 对于那些使用 angular i18n 例如 而不是 ngx translate 的人来说 您同时在做什么来处理代码中的翻译 我突然想到 如果字符