ngx-translate / i18n-polyfill

A speculative polyfill to support i18n code translations in Angular
MIT License
139 stars 30 forks source link

Missing translation error on JIT #10

Open carlos-ferras opened 6 years ago

carlos-ferras commented 6 years ago

The thing is that I have configure this:

{
  provide: MISSING_TRANSLATION_STRATEGY,
  useValue: MissingTranslationStrategy.Ignore
}

in my app.module.ts

and this:

platformBrowserDynamic().bootstrapModule(
  AppModule,
  {
    missingTranslation: MissingTranslationStrategy.Ignore,
  }
)

in my main.ts

The error is triggered here:

function xliffLoadToI18n(content) {
    // xliff to xml nodes
    var /** @type {?} */ xliffParser = new XliffParser();
    var _a = xliffParser.parse(content), msgIdToHtml = _a.msgIdToHtml, errors = _a.errors;
    // xml nodes to i18n messages
    var /** @type {?} */ i18nMessagesById = {};
    var /** @type {?} */ converter = new XmlToI18n();
    Object.keys(msgIdToHtml).forEach(function (msgId) {
        var _a = converter.convert(msgIdToHtml[msgId]), i18nNodes = _a.i18nNodes, e = _a.errors;
        errors.push.apply(errors, e);
        i18nMessagesById[msgId] = i18nNodes;
    });
    if (errors.length) {
        throw new Error("xliff parse errors:\n" + errors.join("\n")); // HERE IS TRIGGERED
    }
    return i18nMessagesById;
}
ocombe commented 6 years ago

Is the error saying that you have missing translations? If it's throwing in the xliff parser, it looks more like your xliff file has errors

What's the error message, and what's the content of your xliff file?

carlos-ferras commented 6 years ago

Yes, I know what it say, but I want to ignore it, not an error when it happen, anyway thanks for your work, I've been waiting a long time for this.

ocombe commented 6 years ago

If it's not an error, then the warning is an error :D Do you know what's causing this?

carlos-ferras commented 6 years ago

Yes, it 's because I have not a target translation tag for the source text, normally angular ignore this an use as target the value in source.

ocombe commented 6 years ago

I believe that this behavior was changed in Angular, I'll check

carlos-ferras commented 6 years ago

I already managed to avoid the error, just doing this:

package.json:

"scripts": {
    "start": "ng serve --open --locale es",
    "build": "for lang in en es; do ng build --aot --prod --bh /$lang/ --output-path=dist/$lang --i18n-file=src/locale/messages.$lang.xlf --i18n-format=xlf --missing-translation=ignore --locale=$lang; done",
    "i18n": "npm run i18n-templates && npm run i18n-ts && npm run i18n-merge",
    "i18n-templates": "ng xi18n -f xlf --output-path src/locale --outFile=messages.xlf --locale es",
    "i18n-ts": "ngx-extractor -i \"src/**/*.ts\" -f xlf -o src/locale/messages.xlf",
    "i18n-merge": "for lang in en es; do xliffmerge --profile xliffmerge.json es $lang; done"
  }

xliffmerge.json:

{
  "xliffmergeOptions": {
    "srcDir": "src/locale",
    "genDir": "src/locale",
    "defaultLanguage": "es",
    "i18nFile": "messages.xlf",
    "useSourceAsTarget": true
  }
}

what I did was generate the translation files with the translations initialized in the source. Clarify that if the translations are not generated with the target, the error persists, that should be checked anyway.