I've read the entire doc here : https://angular.io/guide/i18n
I can't make heads or tails of how I'm supposed to handle a html tag of this nature :
<div i18n="@@myId" class="title-text">{{currentPage}}</div>
or one like this :
<div i18n="@@myId" class="title-text" [innerHTML]="currentPage"></div>
it doesn't mention any variable text at all as if they just assume we'd have all our names and text hard coded into the html.
a language file is supposed to look like this :
<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="ng2.template">
<body>
<trans-unit id="myId" datatype="html">
<source>Hello</source>
<target>Bonjour</target>
</trans-unit>
</body>
</file>
</xliff>
Am I to do something like this to handle the multiple possibilities of the var?
<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="ng2.template">
<body>
<trans-unit id="myId" datatype="html">
<source>Title 1</source>
<target>Titre 1</target>
<source>Help 2</source>
<target>Aide 2</target>
<source>New 3</source>
<target>Nouveau 3</target>
</trans-unit>
</body>
</file>
</xliff>
I don't think that'll work. How do I handle variables?
UPDATE :
if I use their language file generation tool :
ng xi18n --output-path locale --out-file english.xlf --i18n-locale fr
I get :
<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="fr" datatype="plaintext" original="ng2.template">
<body>
<trans-unit id="9f3e56faa6da73b83f4646a1e074b970891894da" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{currentPage}}"/></source>
<context-group purpose="location">
<context context-type="sourcefile">app/logged.in/top.bar/top.bar.component.ts</context>
<context context-type="linenumber">85</context>
</context-group>
<note priority="1" from="description">the title of the current route</note>
</trans-unit>
</body>
</file>
</xliff>
pretty sure equiv-text="{{currentPage}}"
is garbage. but It may yet work need to test.
in the meantime I can't get ng serve to accept the new configs.
UPDATE AGAIN :
to get ng serve --configuration=fr
to work
you have to edit angular.json
further, it's not specified in the official docs but they do talk about it here : https://github.com/angular/angular-cli/wiki/stories-internationalization
Well I added a <target>Title</target>
and it works but of course this implies that right now every single value for the var returns "title" no matter what.
also upon placing the i18n
tags everywhere, I ran into this in my code :
<dropzone [message]="valid? '' : 'Placez ici votre fichier Excel csv à Ajouter aux lignes ci-dessous. (Ces lignes apparaîtront à la fin de la table)'" (success)="uploaded()"></dropzone>
so what now? how do I translate the message passed to the dropzone?
This polyfill seems like the best way to go right now - it's mainly written by Olivier Combe, a member of the Angular team responsible for i18n:
https://github.com/ngx-translate/i18n-polyfill
For Angular 5, you'll need version 0.2.0 when you install:
npm install @ngx-translate/i18n-polyfill@0.2.0 --save
For Angular 6, get the latest version - currently 1.0.0:
npm install @ngx-translate/i18n-polyfill@1.0.0 --save
I got the polyfill working for both JIT and AOT compilation, for Angular 5 (it will also work for Angular 6). Here's what you need to do to translate to a single language (this is a good way to get this working - you can then get multiple languages working later):
app.module.ts
Add the following imports to your root Angular module:
add the following constant, and specify the providers in your root module:
*.ts
In the .ts file where you want to provide a translation, add this:
This demonstrates that you can even include interpolations in the messages that you want to translate.
You can use i18n definitions (i.e. using specifying the translation 'source' id, meaning, description) like this:
You'll still need to extract the messages, and you can use the ngx-extractor tool to do this. See the readme on the polyfill page.
All of this is compatible with xliffmerge, which is a great tool for automatically merging any new translations you add, without overwriting existing translations. Xliffmerge can also automatically perform translations using Google translate (you'll need a Google translate API key). For this to work, I do the extraction and merging/translation in the following order, before I do the actual AOT build:
The AOT build for a specific language version of the site looks like this:
Current status of this polyfill:
This is mainly written by Olivier Combe, a member of the Angular team responsible for i18n. At this stage this it's a 'speculative' polyfill for translating variables or strings in the .ts file. It's likely to be replaced by an API built into Angular which will be very similar, so upgrading later should be reasonably manageable. Here's the diclaimer from the Github page:
There's been some discussion around support in forthcoming minor versions of Angular 6 for translations of variables/strings in code.
Here's a quote from Olivier Combe (from March this year), from the following discussion on Github:
https://github.com/angular/angular/issues/11405
Given the official instructions "translating-plural-and-select-expressions", can't you do ? :