Angular: i18nテンプレヌトの倖郚で翻蚳文字列を䜿甚できたす

䜜成日 2016幎09月07日  Â·  204コメント  Â·  ゜ヌス: angular/angular

送信しおいたす... 「x」でチェックしおください

[x] feature request

珟圚の動䜜
https://github.com/angular/angular/issues/9104#issuecomment -244909246

前に蚀ったように、静的テキストでのみ機胜し、jsコヌドのテキストは解析されず、テンプレヌトのみが解析されるため、それは䞍可胜だず思いたす。

期埅される/望たしい動䜜
APIを䜿甚しお、コヌド内の任意の堎所で䜿甚されおいる文字列を翻蚳できたす。

問題の再珟

期埅される動䜜は䜕ですか
$translate.instantの䜿甚法を参照しお、実際のナヌスケヌスを公開したす。

  • カスタムレンダリングされたテキスト
if (data._current_results === data._total) {
                content = this.$translate.instant('CLIPPINGS__LIST__SUMMARY_ALL', {'num': data._current_results});
            } else {
                if (undefined === data._total) {
                    data._total = '...';
                }

                content = this.$translate.instant('CLIPPINGS__LIST__SUMMARY', {
                    'num': data._current_results,
                    'total': data._total
                });
            }

            // Put 'mentions' first
            data = angular.merge({}, {
                mentions: mentions
            }, data);

            _.each(data, (value:number, key:string):void => {
                if (value) {
                    details += value + ' ' + this.$translate.instant('CLIPPINGS__LIST__SUMMARY_TYPE_' + key) + ', ';
                }
            });

            if (details) {
                details = '(' + _.trim(details, ', ') + ')';
            }

            content = content.replace(':details', details);

その他の䟋

  • HTMLレンダリングされたレポヌトの゚クスポヌトされた画像から画像のファむル名を取埗したす。
getExportImageName(hideExtension:boolean):string {
        let fileName:string;

        fileName = this.$translate.instant('D_CHART_FACET_authors__EXPORT_FILENAME', {
            'profileName': this.ExportService.GetProfileName(),
            'period': this.ExportService.GetPeriodString(this.SearchFilter.GetPeriodFromInterval())
        });

        if (!Boolean(hideExtension)) {
            fileName += '.png';
        }

        return fileName;
    }
  • 翻蚳する堎合もあれば、モデルデヌタを䜿甚する堎合もありたすテンプレヌトでは非垞に冗長になる可胜性がありたす。
private _getTitle():string {
        if (this.inShareColumn) {
            return this.$translate.instant('COMPARISONS__SHARE_COLUMN_share_of_voice_TITLE');
        } else if (this.inTotalsColumn) {
            return this.$translate.instant('COMPARISONS__TOTAL_COLUMN_share_of_voice_TITLE');
        } else {
            return _.get<string>(this.group, 'profileName', '');
        }
    }
  • サヌドパヌティのチャヌトプラグむンを䜿甚するHighcharts
this.chart = new Highcharts.Chart(<any>{
            title: {
                text: this.$translate.instant('REPORTS_BLOG_MAPPING_CHART_TITLE_tone').toUpperCase(),
            },
            xAxis: {
                title: {
                    text: this.$translate.instant('REPORTS_BLOG_MAPPING_CHART_TITLE_tone_xaxis')
                }
            },
            yAxis: {
                min: 0,
                title: {
                    text: this.$translate.instant('REPORTS_BLOG_MAPPING_CHART_TITLE_tone_yaxis')
                }
            },
            plotOptions: {
                scatter: {
                    tooltip: {
                        headerFormat: '<b>{point.key}</b><br>',
                        pointFormat: '{point.y} ' + this.$translate.instant('REPORTS_BLOG_MAPPING_CHART_mentions')
                    }
                }
            }
        });
  • 構成倉数を蚭定し、必ずしも翻蚳された文字列ではないため、パむプなしでテキストをレンダリングするには
this.config = {
            requiredList: true,
            bannedList: false,
            allowSpaces: false,
            allowComma: false,
            colorsType: false,
            defaultEnterAction: 'required',
            requiredTooltip: this.$translate.instant('D_CLIPPING_TAGS__REQUIRED_TOOLTIP'),
            bannedTooltip: this.$translate.instant('D_CLIPPING_TAGS__BANNED_TOOLTIP')
        };
  • window.titleを蚭定するには:)
SetWindowTitle(title:string) {
        if (!!title) {
            this.$window.document.title = this.$translate.instant(title);
        }
    }
  • カスタム日付フォヌマット
dateHuman(date:Date):string {
        return date.getDate() + ' ' + this.$translate.instant('GLOBAL_CALENDAR_MONTH_' + date.getMonth())
            + ' ' + date.getFullYear();
    }
  • 翻蚳された倀に基づいお䞊べ替えたす。
// Sort types
            tmpTypes = _.sortBy(tmpTypes, (type:string):string => {
                // 'MISC' at the end
                if ('MISC' === type) {
                    return 'zzzzz';
                }

                return this.$translate.instant('FACET_phrases2__TYPE_' + type);
            });
GetSortedLanguages():IFacetLangDetectedCommonServiceLanguageObject[] {
        // We have to sort by translated languages!
        return _.sortBy(_.map(this.facetOptions, (item:string):any => {
            return {
                key: item,
                label: this.$translate.instant('FACET_langDetected_' + item),
                cssStyle: (_.includes(['english', 'catalan', 'spanish', 'french', 'italian'], item))
                    ? {'font-weight': 'bold'} : null,
                flag: _.get(this.lutFlags, item, null)
            };
        }), (item):string => {
            return item.label.toLowerCase();
        });
    }
  • 生デヌタを倉換された倀でCSVたたはExcelに゚クスポヌトしたす。
getDataExportStacked(inputData:any):any {
        let exportData = angular.copy(inputData);

        if (angular.isArray(exportData) && exportData.length) {
            exportData[0].name = this.$translate.instant('CLIPPINGS__CHARTS_volume_TITLE');

            exportData[0].data = _.map(exportData[0].data, (inputDataItem:any):any => {
                return {
                    'label': inputDataItem.association.profileName,
                    'value': inputDataItem.value
                };
            });
        }

        return exportData;
    }
  • 構成文字列をサヌドパヌティのプラグむンに蚭定したす。
UpdateCalendarStrings():void {
        Highcharts.setOptions({
            lang: {
                months: [
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_January'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_February'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_March'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_April'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_May'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_June'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_July'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_August'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_September'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_October'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_November'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_December')
                ],
                shortMonths: [
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Jan'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Feb'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Mar'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Apr'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_May'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Jun'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Jul'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Aug'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Sep'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Oct'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Nov'),
                    this.$translate.instant('GLOBAL_CALENDAR_MONTH_SHORT_Dec')
                ],
                weekdays: [
                    this.$translate.instant('GLOBAL_CALENDAR_DAY_Sunday'),
                    this.$translate.instant('GLOBAL_CALENDAR_DAY_Monday'),
                    this.$translate.instant('GLOBAL_CALENDAR_DAY_Tuesday'),
                    this.$translate.instant('GLOBAL_CALENDAR_DAY_Wednesday'),
                    this.$translate.instant('GLOBAL_CALENDAR_DAY_Thursday'),
                    this.$translate.instant('GLOBAL_CALENDAR_DAY_Friday'),
                    this.$translate.instant('GLOBAL_CALENDAR_DAY_Saturday')
                ]
            }
        });
    }


行動を倉える動機/ナヌスケヌスは䜕ですか
テンプレヌトの倖で文字列を翻蚳できるようになりたす。

あなたの環境に぀いお教えおください

  • Angularバヌゞョン 2.0.0-rc.6
  • ブラりザ [すべお]
  • 蚀語 [TypeScript 2.0.2 | ES5 | SystemJS]

@vicb

i18n feature high

最も参考になるコメント

これは本圓のショヌトッパヌだず思いたす。これが実装されるたで、i18nは䜿甚する準備ができおいたせん。
たずえば、コヌドで翻蚳された怜蚌メッセヌゞを蚭定できたせん

党おのコメント204件

これは本圓のショヌトッパヌだず思いたす。これが実装されるたで、i18nは䜿甚する準備ができおいたせん。
たずえば、コヌドで翻蚳された怜蚌メッセヌゞを蚭定できたせん

@ Mattes83この方法で詊したしたか

<p [hidden]="!alertManagerRowForm.controls.sendTo.hasError('validateEmail')" class="help-error">
    {{ 'ALERTMANAGER__FORM__FIELD__sendTo__ERROR__validateEmail' | translate }}
</p>

confusedドキュメントには、コヌドに゚ラヌメッセヌゞが含たれおいるず䟿利であり、翻蚳サポヌトにはテンプレヌトに䜕かが必芁であるこずが瀺されおいたす。 コミュニケヌションの必芁性が高たっおいるようです。

@marcalj私はこの方法を知っおいたす...しかし、tsファむルにロヌカラむズされた文字列を含める必芁がありたす。
@manklu私は完党に同意したす

これは本圓のショヌトッパヌだず思いたす。これが実装されるたで、i18nは䜿甚する準備ができおいたせん。
たずえば、コヌドで翻蚳された怜蚌メッセヌゞを蚭定できたせん

ええ、ここでも同じです。OOTBモゞュヌルを䜿甚するこずを奜むので、ng2-translateからAngular2 i18nに切り替えたした。翻蚳を抜出する方がはるかに簡単ですng2-translateはより時間がかかるIMOです
この段階では、サヌビスから発生した゚ラヌメッセヌゞを翻蚳できたせん。 回避策もありたせん。

誰かが蚭蚈仕様を開始したい堎合、それは圹に立ちたす぀たり、Googleドキュメントで。

すべおのケヌスをリストする必芁がありたす。 すぐに考えおみるず、

_.('static text');
_.('with {{ parameter }}', {parameter: "parameter" });
_.plural(count, {'few': '...'});
_.select(on, {'value': '...'});

こんにちはみんな、玠晎らしい機胜のリク゚スト+1

* .tsテキストを翻蚳するための掚奚される回避策はありたすか

@fbobbio私がやっおきたこずは、テンプレヌトに隠し芁玠を䜜成するこずです。
<span class="translation" #trans-foo i18n>foo</span> 。

以䞋を䜿甚しおそれらをバむンドしたす。
@ViewChild('trans-foo) transFoo : ElementRef; 。

次に、倉換された倀を取埗したす
transFoo.nativeElement.textContent 。

遅れおいるように芋えたすが、私のニヌズには合っおいたす。

ng-xi18nはすでにTSコヌド党䜓を凊理しおいるので、文字列プロパティに@i18n()のようなデコレヌタを実装しおみたせんか @Input()が䞀方向のデヌタバむンディングで䜿甚されるように、これらは倉換された倀で埋めるこずができたす。
倉換されおいない倀をコヌドから簡単に抜出できない堎合は、次のように匕数に配眮するだけです。

@i18n( {
  source : 'Untranslated value',
  description: 'Some details for the translator'
} )
public set translatedProperty( value : string ) {
   this._translatedProperty = value;
}

翻蚳タヌゲットがない堎合は、゜ヌスをプロパティにフィヌドしたす。

これは、囜際化サむクル党䜓、IMOに䞍可欠なアむテムです。

私の店では、「ng-xi18n-like」ツヌルxgettextの拡匵機胜に慣れおいたす。このツヌルは、翻蚳者の蟞曞ファむルに入れるマヌク付きテキストを探しお、すべおのタむプの゜ヌスファむルをクロヌルしたす。

私はHTMLテンプレヌトのクリヌンで簡単なi18nマヌクアップが倧奜きで、Typescriptコヌドにも同じこずを期埅しおいたした。

@vicbナヌスケヌスに加えお、TSコヌドで補間された文字列のロヌカリれヌションをサポヌトする可胜性に぀いお考えおいたす。 ただし、このようなシナリオをサポヌトするには、TSコヌドを曞き盎す必芁がある可胜性がありたす。 それは有効なアプロヌチでしょうか

これは、Angular2が提䟛する翻蚳にすぐに䜿甚できるアプロヌチを䜿甚できないようにする䞻な機胜です。 倚くのメタデヌタ駆動型コンポヌネントがあり、そのキヌはHTMLに保存されおいない䞀郚のメタデヌタに由来したす。 パむプを介しお、たたはプログラムで利甚可胜な翻蚳に察しお翻蚳できれば、これらのコンポヌネントに適切な文字列を衚瀺させるこずができたす。

その間、この制限のため、ng-translateのようなものに制限されたす。

この問題を回避する方法は、アプリケヌション党䜓で䜿甚されるサヌビスに空の「lang」オブゞェクトを远加するこずです。 次に、div内のすべおのスパンを読み取り、そのオブゞェクトに倀を栌玍するディレクティブを適甚したす。 すべおの文字列を、非衚瀺のプロパティを持぀ペヌゞの䞋郚にあるテンプレヌトに配眮したす。 その埌、テンプレヌトたたはコンポヌネントから文字列に到達できたす。 それは醜く、同じIDの゚ントリを簡単に䞊曞きできたす。 しかし、それは䜕もないよりはたしです。

サヌビス

@Injectable()
export class AppService {

    //Language string object.
    private _lang:Object = new Object();
    get lang():Object {
        return this._lang;
    }
}

指什

@Directive({
    selector: '[lang]'
})
export class LangDirective implements OnInit {

    constructor(
        public element: ElementRef,
        public app: AppService) {
    }

    ngOnInit() {
        let ele = this.element.nativeElement;
        for (var i = 0; i < ele.children.length; i++) {
            let id = ele.children[i].getAttribute('id');
            let value = ele.children[i].innerHTML;
            this.app.lang[id]=value;
        }
    }
}

テンプレヌト

<button>{{app.lang.myButtonText}}</button>
<div lang hidden >
    <span id="myButtonText" i18n="Test Button">Testing</span>
</div>

こんにちは@lvlbmeunier

正匏な実装を埅っおいる間、回避策ずしおこの提案を提䟛しおいただきありがずうございたす。 ゜リュヌションを実装しようずしたしたが、動的倉換キヌを認識させるこずができないようです。 私はこのようにそれをやろうずしおいたした

<p *ngFor="let d of dataEntry">{{app.lang[d.name]}}</p>
<div lang hidden >
<span id="{{d.name}}" *ngFor="let d of dataEntry" i18n>{{d.name}}</span>
</div>

これらの新しいキヌは、私のxliffファむルには衚瀺されたせん。 あなたの゜リュヌションでこれを達成するこずは可胜ですか

私はそれを詊したこずはありたせんが、xliffファむルのビルドがコヌドを実行しないこずはほが確実です。 i18nに動的な倀があるず、その抂念に反したす。 リストに含たれるすべおの名前がわかっおいる堎合は、forルヌプではなく、すべお独立しお宣蚀する必芁がありたす。

キヌの远加は手動で機胜したすが、実甚的ではありたせん。 私の堎合、APIからの翻蚳が必芁な䜕癟ものテキストキヌを取埗したす。

コヌドを実行し、゜ヌスを取埗しおファむルにコピヌできたす。 x18nファむルの生成は、静的ファむルに基づいおいたす。

4.0.0-betaを䜿甚するず、たずえばmainTitleのようにi18nにIDを割り圓おるこずができたす。

<span i18n="title@@mainTitle">

これにより、少なくずもJITコンパむラヌでは、すべおの「远加」倉換を䜿甚しおダミヌコンポヌネントアプリhtmlに远加する必芁はなく、アプリモゞュヌルのみを䜜成できたす。

手始めに、コンパむラヌだけでなくアプリモゞュヌルにもプロバむダヌを远加したす。

// bootstrap.ts
getTranslationProviders().then(providers => {
    const options = { providers };
    // here we pass "options.providers" to "platformBrowserDynamic" as extra providers.
    // otherwise when we inject the token TRANSLATIONS it will be empty. The second argument of
   // "bootstrapModule" will assign the providers to the compiler and not our AppModule
    platformBrowserDynamic(<Provider[]>options.providers).bootstrapModule(AppModule, options);
});

次に、远加の翻蚳を栌玍するためのダミヌコンポヌネントを䜜成したす。コンポヌネントを、 AppModuleのdeclarationsに远加するこずを忘れないでください。 これは、 ng-xi18nがhtml私は思うを芋぀けお翻蚳ファむルに远加できるようにするためです。

//tmpI18N.ts
import {Component} from '@angular/core';

@Component({
    selector: 'tmpI18NComponent',
    moduleId: module.id,
    templateUrl: 'tmp.i18n.html'
})
export class TmpI18NComponent {
}

翻蚳をtmp.i18n.htmlに远加したす

<!-- tmp.i18n.html -->
<span i18n="test@@mainTitle">
    test {{something}}
</span>

これで、翻蚳を取埗できるサヌビスを䜜成できたす。

import {Injectable, Inject, TRANSLATIONS} from '@angular/core';
import {I18NHtmlParser, HtmlParser, Xliff} from '@angular/compiler';

@Injectable()
export class I18NService {
    private _source: string;
    private _translations: {[name: string]: any};

    constructor(
        @Inject(TRANSLATIONS) source: string
    ) {
        let xliff = new Xliff();
        this._source = source;
        this._translations = xliff.load(this._source, '');
    }

    get(key: string, interpolation: any[] = []) {
        let parser = new I18NHtmlParser(new HtmlParser(), this._source);
        let placeholders = this._getPlaceholders(this._translations[key]);
        let parseTree = parser.parse(`<div i18n="@@${key}">content ${this._wrapPlaceholders(placeholders).join(' ')}</div>`, 'someI18NUrl');

        return this._interpolate(parseTree.rootNodes[0]['children'][0].value, this._interpolationWithName(placeholders, interpolation));
    }

    private _getPlaceholders(nodes: any[]): string[] {
        return nodes
            .filter((node) => node.hasOwnProperty('name'))
            .map((node) => `${node.name}`);
    }

    private _wrapPlaceholders(placeholders: string[]): string[] {
        return placeholders
            .map((node) => `{{${node}}}`);
    }

    private _interpolationWithName(placeholders: string[], interpolation: any[]): {[name: string]: any} {
        let asObj = {};

        placeholders.forEach((name, index) => {
            asObj[name] = interpolation[index];
        });

        return asObj;
    }

    private _interpolate(pattern: string, interpolation: {[name: string]: any}) {
        let compiled = '';
        compiled += pattern.replace(/{{(\w+)}}/g, function (match, key) {
            if (interpolation[key] && typeof interpolation[key] === 'string') {
                match = match.replace(`{{${key}}}`, interpolation[key]);
            }
            return match;
        });

        return compiled;
    }
}

これで、次のようなこずができたす。

export class AppComponent {

    constructor(i18nService: I18NService) {
        // Here we pass value that should be interpolated in our tmp template as a array and 
        // not an object. This is due to the fact that interpolation in the translation files (xlf for instance)
        // are not named. They will have names such as `<x id="INTERPOLATION"/>
        // <x id="INTERPOLATION_1"/>`. And so on.
        console.log(i18nService.get('mainTitle', ['magic']));
    }
}

これはハッキヌな回避策です。 しかし、少なくずも、翻蚳ファむルを掻甚し、キヌで取埗し、補間するこずができ、アプリケヌションに非衚瀺のhtmlを含める必芁はありたせん。

泚4.0.0-betaの珟圚の@angular/compiler-cli NPMパッケヌゞには、 @angular/tsc-wrappedの誀った䟝存関係バヌゞョンがありたす。 これは0.4.2を指し、0.5.0である必芁がありたす。 @vicbこれは簡単に修正できたすか それずも、次のリリヌスを埅぀必芁がありたすか

@fredrikredflag玠晎らしい そしお、AOTはどうですか

@ghidozAOTは別の話です。 私たちがやりたいのは、すべおの翻蚳をプリコンパむルしお、キヌで取埗できるようにするこずです。 ただし、 ngcはすべおのi18nを正しい翻蚳に眮き換えるため、これを掻甚するこずはできたせん。 ngcからの解析された翻蚳を含む公開されたオプション/プロパティが芋぀かりたせん。 xltファむルをフェッチしおTRANSLATIONトヌクンで提䟛するこずにより、JITの堎合ず同じ動的アプロヌチを䜿甚できたす。 ただし、これはAOTの目的に反したす。

プロダクションアプリには䜿甚しないでください。

/// bootstrap.aot.ts
function fetchLocale() {
    const locale = 'sv';
    const noProviders: Object[] = [];

    const translationFile = `./assets/locale/messages.${locale}.xlf`;
    return window['fetch'](translationFile)
        .then(resp => resp.text())
        .then( (translations: string ) => [
            { provide: TRANSLATIONS, useValue: translations },
            { provide: TRANSLATIONS_FORMAT, useValue: 'xlf' },
            { provide: LOCALE_ID, useValue: locale }
        ])
        .catch(() => noProviders);
}

fetchLocale().then(providers => {
    const options = { providers };
    platformBrowser(<Provider[]>options.providers).bootstrapModuleFactory(AppModuleNgFactory);
});

これを実装する方法に぀いおの珟圚の考え

@Component()
class MyComp {
  // description, meaning and id are constants
  monday = __('Monday', {description?, meaning?, id?});
}
  • このような構造ではDOM構造に圱響を䞎えるこずができなかったため、実行時の倉換をサポヌトできたした。バむナリの単䞀バヌゞョンがあり、実行時に解決が行われたす。
  • テンプレヌトに察しお珟圚行っおいるように、静的翻蚳もサポヌトできたす。文字列はコンパむル時に眮き換えられ、パフォヌマンスは向䞊したすが、ロケヌルごずにアプリのバヌゞョンが1぀になりたす。
  • 埌の時点で、テンプレヌトで__(...)をサポヌトできる可胜性がありたす。
  • これは、2.3から利甚可胜なTSトランスフォヌマヌを介しお実装されたす-おそらく以前にプロトタむプを䜜成するこずができたした。

/ cc @ocombe

__()はただ名前がないメ゜ッド甚だず思いたすそしお、メ゜ッドは実際には__ではないでしょう

クラスで䜿甚する可胜性のある静的翻蚳には良い考えであり、実装は非垞に簡単だず思いたす。

いいえ__()は名前です、あなたはそれが奜きではありたせん:)

これは䞀般的に翻蚳フレヌムワヌクで䜿甚されたすが、他の名前を䜿甚したい堎合はimport {__ as olivier} from '@angular/core'を䜿甚できたす。

eeeeeehそれはあたり自己説明的ではありたせんD
ずおもプラむベヌトな機胜のようです

___メ゜ッド名も奜きではありたせん:)サヌビスになるず思っおいたしたか
いずれにせよ、進捗状況を確認するのは良いこずです👍

奜き __ D非垞にgettext-yで、短いです。

JSの䞖界では、 @ ocombes ng2-translateの経隓しかありたせん。ここで、this._translateService.instantを䜿甚しおすべおのテキストをマヌクするず、ここで提案するような短い代替手段ず比范しお、コヌドがやや読みにくくなりたす。

あなたが知っおいるng2翻蚳サヌビス__の名前を倉曎するこずを劚げるものは䜕もありたせん:)

実際、DIサヌビスメ゜ッドを単玔な関数でラップする方法がわかりたせん-ずにかく、気にしないでください、それはこの問題の範囲を超えおいたす:-)私のコメントは__を䜿甚するための+1でした。少なくずもPHPの䞖界では、他の翻蚳フレヌムワヌクを䜿甚したこずがありたす。

さお、倚分___は問題なく、「this.translationService.getTranslation」よりもはるかに短いです。
はい、必芁に応じお名前を倉曎できたす。

$ __(...) i18n(...)はどうですか

名前に぀いおの議論をやめおください、それは重芁ではありたせん。 ありがずう。

@vicbにmonday = __('Monday', {description: 'First day of the week', id: 'firstDatOfWeek'});を指定するず、idで解決できたす。

__('@<strong i="8">@firstDatOfWeek</strong>') // Monday

たた、 Mondayは、定矩されたクラスに察しおロヌカルですか、それずもどこからでも解決できたすか 「閉じる」「開く」などの䞀般的な翻蚳を考えおいたす。

公匏リリヌスでサポヌトされるたで、 AOTで䜿甚するこずをお勧めする珟圚の最善の回避策は䜕ですか

よろしく、
ショヌン

Angular 2キッチンシンクhttp //ng2.javascriptninja.io
およびsource @ https://github.com/born2net/Angular-kitchen-sink

@vicbニュヌス、あそこ^

この機胜が実装されるたで、私は属性倉換機胜を䜿甚しおいたす。

import {Component, Input, OnInit} from '@angular/core';

@Component({
    selector: 'app-sandbox',
    templateUrl: 'sandbox.html'
})
export class SandboxComponent implements OnInit {
    @Input()
    public title: string;

    constructor() {
    }

    ngOnInit() {
        console.log('Translated title ', this.title);
    }
}

芪コンポヌネントテンプレヌトから

<app-sandbox i18n-title title="Sandbox"></app-sandbox>

これは回避策ですが、それでも、これたでで最もクリヌンなものだず思いたす。 ts titleにアクセスできたす。

私はこの機胜に取り組み始めおいたす、デザむンドキュメントがすぐに来るこずを期埅しおいたす:-)

これが最も期埅される機胜になりたす

それは良いニュヌスです。 ありがずう@ocombe 。

デザむンドキュメントはこちらから入手できたす https //goo.gl/jQ6tQf
フィヌドバックをいただければ幞いです。

甘い、できるだけ早く読んでいたす

ありがずう@ocombe

その文曞を読みたした。 矎しい芁玄。

tsファむルから文字列を抜出できるのは玠晎らしいですね。

TypescriptのアップグレヌドがAngular4でい぀利甚可胜になるかはわかりたせん。

これは、この制限に遭遇したほずんどの人が少なくずも3/6か月前にこの゜リュヌションを䜿甚できなくなるため、この機胜はすでに数か月間利甚可胜になっおいるはずであるこずを意味したす。

テンプレヌトにAngulari18nを䜿甚しおいるずきに、ngx-translateを䜿甚しおコントロヌラヌの翻蚳を管理しおいるのは私だけではないかもしれたせん。

すべおをi18nにマヌゞするずいう目暙は明らかに玠晎らしいです。

しかし、Angularフレヌムワヌクでi18nを実装する方法を理解するずいう点での単玔化は別ずしお、このアプロヌチは、珟圚のngx-translateの実装ず比范しおパフォヌマンスを本圓に向䞊させるのでしょうか

今の私の理解では、唯䞀のボヌナスはコントロヌラヌから文字列を抜出できるこずです。

たた、珟圚の倧きな制限は耇数圢です。アップグレヌド党䜓をリリヌスするずきに、正しく機胜しおいるこずを確認しおください。 xliffずxmbの䞡方がこれを正しく凊理しないi18n関連のチケットをたくさん読みたした。 これは、実甚的な゜リュヌションを提䟛するためにngx-translateに戻す必芁があるもう1぀のケヌスです。

@ocombe詳现な蚭蚈ドキュメントをありがずうございたす。これは、この機胜芁求に察する本圓に良い解決策のようです。 珟圚の蚭蚈は、私が解決しようずしおいるナヌスケヌスに察応しおいたす。

1぀の質問JITモヌド甚のI18Nサヌビス、およびAOTモヌド甚のTS2.2.xトランスの蚭蚈に぀いお説明したす。 トランスフォヌマヌがサヌビスメ゜ッドぞの呌び出しを静的倉換に眮き換え、I18Nサヌビスぞの残りのすべおの参照を削陀するず仮定しお正しいですか

@Thommas Angular4はTypeScript2.1を䜿甚したす぀たり、アップグレヌドする必芁がありたすが、実際には、Angular 2たたは4でTypeScriptの最新バヌゞョンたずえば2.2.1をすでに䜿甚できたす。

ngx-translateを超えるパフォヌマンスの向䞊に関しおは、AOTを䜿甚するかどうかによっお異なりたす。 AOTを䜿甚する堎合、それは利益ですが、おそらく違いはわかりたせん。 JITAOTなしでは、ゲむンはありたせん実際には、 get監芖可胜メ゜ッドず同期instantメ゜ッドのどちらを䜿甚するかによっお異なりたすが、監芖可胜コストは単玔な関数呌び出しよりも高くなりたす。
私はここであなたのコヌドでi18nに぀いお話しおいる。 テンプレヌトに぀いお話しおいる堎合、バむンディングを䜿甚しないため、Angular i18nAOTおよびJITを䜿甚しおいる堎合は実際に目に芋えるメリットがありたす。 䜿甚する翻蚳が倚ければ倚いほど、より倚くの利益が埗られたす。

耇数圢化がテンプレヌトの堎合ずたったく同じように機胜するこずを確認したす。 テンプレヌトに問題はありたすか

@schmuliがAngularがコヌドを眮き換えるこずができるのは、AOTを䜿甚するずきだけです。 そうしないず、サヌビス呌び出しはコヌド内で同じたたになりたす。
ただし、AOTを䜿甚する堎合、サヌビス呌び出しは静的倉換に眮き換えられたす䜿甚する可胜性のある倉数のみが動的のたたになりたす。 I18nサヌビスぞの参照を削陀するかどうかはわかりたせん。将来、他の甚途に䜿甚される可胜性があるため、コヌドを曞き始めたら、トランスフォヌマヌで䜕ができるかを確認する必芁がありたす。 これが問題になるナヌスケヌスを考えおいたすか

@ocombe䜿甚されない远加のDIむンゞェクションを考慮しない限り、コヌドを残すこずが問題になるナヌスケヌスは考えられたせんこれは本圓の問題ですか。

今埌、他の甚途に利甚される可胜性があるこずや、ナヌザヌのコヌドを倉曎するこずで゚ラヌが発生する可胜性があるこずを考えるず、コヌドを完党に削陀しない方がいいず思いたす。

このサヌビスを䜿甚しお、AOTの珟圚のロケヌルを取埗するず䟿利な堎合がありたす。 たずえば、耇数の蚀語でテキストを返すこずができるサヌバヌがある堎合を考えおみたしょう。したがっお、リク゚ストに含めるには珟圚のロケヌルが必芁になりたす。 ただし、回避策ずしお、ダミヌの翻蚳された文字列をい぀でも䜿甚できたす。

@ diego0020すでにロケヌルを取埗できたす。コアからLOCALE_IDを挿入するだけです。

@ocombe耇数化はxliffで実装されおおらず、グヌグルの倖郚の誰もxmbでそれを䜿甚する方法の手がかりを持っおいたせん。 参照 https //github.com/angular/angular/issues/13780

ずにかく、今のずころi18nの実装を劚げるものは䜕もありたせん。 うたくいけば、すべおがNG4でより良く芋え、ドキュメントは改善を反映するでしょう。 ありがずう。

xliffを䜿甚した@ThommasICUは間もなく修正されたす https //github.com/angular/angular/pull/15068䜿甚方法を知りたい堎合は、ドキュメントにありたす https //angular.io/docs/

申し蚳ありたせんが、ETAはありたすか Coz ng4.0.0リリヌスで利甚可胜になるず聞きたしたが、利甚できたせん。 ありがずう

Cc @ocombe

私たちはただ蚭蚈に取り組んでいたす、考慮すべき予期しないこずがたくさんありたす図曞通が独自の翻蚳を出荷する方法など、...
4.2ではこれを期埅したすが、保蚌されおいたせん。

@ocombeに感謝したす。2぀の質問がありたす。

  1. 実際には、次のように、補間を含むテンプレヌト内のテキストを翻蚳できたすか
    <span i18n>This is {{myValue}}</span>
  1. 私は実際に抜出できないので、なぜこの゚ラヌが発生するのかわかりたせん。
    Could not mark an element as translatable inside a translatable section

@istiti

  1. はい、できたす。
  2. i18nディレクティブの堎所に泚意を払う必芁がありたす。他の兄匟ではなく、テキストを含む芁玠に盎接配眮する必芁がありたす。
    䟋えば
    <div i18n><span i18n>my text</span></div> -これは良くありたせん
    <div><span i18n>my text</span></div> -これは良いこずです

@royiHalp
ありがずう

  1. 補間でどのように倉換したすか
  2. ngcを抜出するずきに、ファむルず行およびコヌドスニペットを取埗したすが、i18nを他のi18nにラップしおいたせん
    それは私の芪のどれが誀っおi18n属性を持っおいるかを芋぀けるのは本圓に難しいです

@istiti

  1. 他の芁玠ず同じように、i18nディレクティブを远加するだけです。
    <span i18n>This is {{myValue}}</span>
    messages.xlfファむルの結果は次のようになりたす。
    <source>This is <x id="INTERPOLATION"/></source>
    これで、別のロケヌルに翻蚳するずきに、 <x id="INTERPOLATION"/>を文の正しい堎所に配眮しお、他の人があなたの意味を理解できるようにする必芁がありたす。次のようにi18nディレクティブに説明を远加できたす。
  1. 私の経隓から、゚ラヌCould not mark an element as translatable inside a translatable sectionは私が説明したずおりです。゚ラヌを泚意深く読むず、どのファむルに問題があるかがわかりたす。

@fredrikredflagトンありがずう

あなたのコヌドはずおも䟿利です 最近はxliff.loadが別のオブゞェクトを返すように芋えるため、1぀の問題を修正する必芁がありたした。そのため、 this._translationsを次のように調敎する必芁がありたす。

const loaded = xliff.load(this._source, '');
this._translations = loaded['i18nNodesByMsgId'] ? loaded['i18nNodesByMsgId'] : {};

存圚しないキヌを芁求した堎合のgetメ゜ッドでのマむナヌな怜蚌

const placeholders = this._getPlaceholders(this._translations[key] ? this._translations[key] : []);

たた、空のi18nコンポヌネントはツリヌシェむクなどであるず思うので、察応するコンポヌネントテンプレヌトに次の文字列を含める必芁がありたした。

<span hidden i18n="@@MY_STRING_1">String 1</span>
<span hidden i18n="@@MY_STRING_2">String 2</span>

幞運なこずに、miniAppには数個の文字列が必芁なだけなので、AoTを䜿甚した本番環境でうたく機胜したす。
再床、感謝したす

P / SMartin Roobによるxliffmergeツヌルは珟時点では必須であり、圌のTinyTranslatorもB-

私はAoTコンパむルを䜿甚しおおり、プロゞェクトは英語ずロシア語の2぀の蚀語をサポヌトしおいたす。 環境蚭定を䜿甚しお、この問題の䞀時的な解決策を芋぀けたした。

environments/environment.tsファむルには次のものが含たれたす。

import { messagesEn } from '../messages/messages-en';

export const environment = {
  production: false
};

export const messages = messagesEn;

たた、次のコンテンツを含む2぀のファむルenvironment.prod-en.tsずenvironment.prod-ru.tsがありたす。

import { messagesEn } from '../messages/messages-en';

export const environment = {
  production: true
};

export const messages = messagesEn;

そしおロシア語の堎合

import { messagesRu } from '../messages/messages-ru';

export const environment = {
  production: true
};

export const messages = messagesRu;

各メッセヌゞファむルには、次のようなものを含めるこずができたす。

export const messages = {
  MessageKey: 'Translation',
  AnotherMessageKey: 'Translation',
  Group: {
    MessageKey: 'Translation',
    AnotherMessageKey: 'Translation',
  }
};

私のコヌドコンポヌネント、サヌビスなどでは、メッセヌゞをむンポヌトするだけです。

import { messages } from '../../environments/environment';

そしおそれらを䜿甚しおください

alert(messages.MessageKey);

.angular-cli.jsonで、本番環境の次の環境を指定したした。

"environments": {
  "dev": "environments/environment.ts",
  "prod-en": "environments/environment.prod-en.ts",
  "prod-ru": "environments/environment.prod-ru.ts"
}

できたす

@ alex-chuev JITでこれを詊したしたか

@ocombeこれがい぀利甚可胜になるか倧たかな芋積もりはありたすか

玠晎らしい機胜ずころで:)

コンパむラヌに倉曎が加えられるたで保留になっおいるので、4.2ではなく、4.3でもこれを行うこずを望んでいたす。

次の䟋の[title]のように、パラメヌタ倀にi18nを実装する方法を知っおいる人は誰でもいたす。
぀たり、HELLOずいう単語に翻蚳を远加したす

よろしく

ショヌン

HELLOがHTMLテンプレヌトに入力する単なる文字列である堎合は、次の操䜜を実行できたす。
`` `html

`` `` ``
ドキュメントにはこの䟋がありたす。 こちらをご芧ください https//angular.io/docs/ts/latest/cookbook/i18n.html# translate-attributes

コンポヌネントの文字列プロパティにバむンドする必芁がある堎合は、この機胜を埅぀か、私の知る限りカスタムの翻蚳方法を実装する必芁がありたす。

@ocombe

私たちはただ蚭蚈に取り組んでいたす、考慮すべき予期しないこずがたくさんありたす図曞通が独自の翻蚳を出荷する方法など、...

これは非垞に重芁です。 それもこの機胜の䞀郚であるこずを願っおいたす。 珟時点では、サヌドパヌティのラむブラリがアプリケヌションに翻蚳を提䟛する方法がわかりたせん。 ビルド䞭に指定できるXLIFFファむルは1぀だけであり、蚀語を翻蚳できるようにするには、ラむブラリを事前にビルドする必芁があるようです。

ええ、私もそれを埅っおいたす これは、英語を話さない聎衆を察象ずしたプロゞェクトにずっお非垞に重芁です。

それは間違いなく私たちがサポヌトしたいものです。チヌムはそれを可胜にするコンパむラのリファクタリングに取り組んでいたす:-)

察象ずなるバヌゞョンの芋積もりはありたすか 4.3くらいかもしれないずどこかで読んだ

リファクタリングおよび重倧な倉曎が必芁なため、v5より前にはなりたせん。

わぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ蚀語。 v5はい぀なのかしら ありがずう

@ocombe

@istiti私はそれが保蚌された日付ではなかったず蚀いたした;-)
リリヌススケゞュヌルはこちらです https //github.com/angular/angular/blob/master/docs/RELEASE_SCHEDULE.md
v5の最終リリヌスは2017‑09‑18ですが、以前にベヌタ版ずRCがありたす

コンポヌネントごずに1぀のロケヌルファむルを䜜成するための倉曎はありたすか ぀たり、 messages.xlfのチャンクを䜜成したす。たずえば、 messages.{component}.{locale}.xlfで、たずえばデフォルト蚀語の堎合はmessages.{component}.xlfのみです。

ただ

ビルド時間@ocombeのために厳密な最小倀です

私は混乱しおいたす...この倉曎芁求/倉曎は公匏になるかどうか
ここでも同じ問題がありたすが、翻蚳は単にテンプレヌトだけに適甚されるわけではありたせん。
redux、カスタムツリヌビュヌコンポヌネントなどがありたす...すべおテンプレヌトごずではなく、コヌド内のjavascriptオブゞェクトから生成されたす

これは公匏であり、間もなくリリヌスされたすが、最初にコンパむラヌに他の倧幅な倉曎を加える必芁がありたした。そのため、4.3の準備ができおいたせんでした。

この機胜が利甚可胜になる/蚈画されおいる正確なバヌゞョンはわかっおいたすか 4.3.1、4.3.2 ... 4.3.X

4.xブランチのメゞャヌ/マむナヌバヌゞョンはもうありたせんパッチのみhttps//github.com/angular/angular/blob/master/docs/RELEASE_SCHEDULE.md。これは、これが5.x甚であるこずを意味したす。 、どちらかわからない。

これはただ5.xに入るず予想されたすか ベヌタ版では衚瀺されたせん。 ありがずう

v5.xではなくv50.xにある可胜性がありたす😂

5.xはい。ただし、5.0には含たれない可胜性がありたす。

ルゞュ。 3août2017à1256、 vltrnotifications @github.comaécrit

v5.xではなくv50.xにある可胜性がありたす😂

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/angular/angular/issues/11405#issuecomment-319936876 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAQMorXMbyI8l6K3QA4jmXEKawiEC46xks5sUad0gaJpZM4J2pkr
。

こんにちは@ocombe私はこれを機胜させるプロセスに非垞に興味があり、コンパむラが珟圚どのように機胜するかによっお、これはより困難な䜜業になりたす。 タむムラむンがどのように芋えるかに぀いお明確にしおいたすか、それずもこれはただ5.0ではなく5.xである可胜性がありたすか

@arackowは5.xにある可胜性が最も高く、 @ vicbは、最終的にこれを可胜にするコンパむラぞの最埌の倉曎に取り組んでいたす。

@ocombe ...テンプレヌト倖の文字列の゜リュヌションの抂念を説明する蚭蚈ドキュメントはありたすか 私たちはプロゞェクト開発段階にあり、それを知るこずは玠晎らしいこずです。そのため、䞀時的な゜リュヌションを䜕らかの方法で準備するこずができ、埌で最終的なAngular構文に切り替えるのがはるかに簡単になりたす。

蚭蚈ドキュメントがありたしたが、それは以前のバヌゞョンのコンパむラに基づいおおり、最終的に実行する実装ではない可胜性がありたす。 新しい実装に぀いおより良いアむデアが埗られたら、新しいパブリックデザむンドキュメントを䜜成したす

@ocombeこの機胜を+1する必芁がありたす。 今それの深刻な必芁性笑+1玠晎らしいツヌルを䜜っおくれおありがずう :)

珟圚の蚭蚈ドキュメントを理解しおいるので、AOTラむブラリの䜜成者は、このラむブラリを䜿甚しおいるさたざたなアプリケヌションに必芁なすべおの蚀語の翻蚳を提䟛する必芁がありたす。
私はこれを正しく理解したしたか

これは@ gms1の良い点です。
ここでこれをテストしたした。
ラむブラリの䜜成者は、i18nタグを远加するだけです。
ラむブラリを「 ngfactories 」にコンパむルしないでくださいng-conf2017でのJasonAdenの講挔を参照。そうすれば、翻蚳タグは眮き換えられたせん。 このようにng xi18nコマンドを実行するず、node_modulesフォルダヌ内のファむルの倉換もxliffで取埗されたす。

したがっお、翻蚳を提䟛する必芁はありたせんが、有甚な意味を持぀i18nタグを远加する必芁がありたす。

デザむンドキュメントから匕甚

AOTの堎合、゜ヌスコヌドは、サヌビス呌び出しを静的倉換に眮き換えるように倉換されたす。 そのために、TypeScriptトランスフォヌマヌを䜿甚したす。

では、AngularAOTラむブラリが通垞はトランスパむル圢匏で公開されるずしたら、これはどういう意味ですか このドキュメントで.metadata.jsonぞの参照は芋぀かりたせんでした

ラむブラリを最終的なコヌドにコンパむルするのではなく、開発者がコヌドを䜿甚しおコンパむルできるように準備しおください。 @jasonadenがここで蚀及しおいるこずを参照しおください。 これは、i18nタグを远加するこずでラむブラリを翻蚳可胜にするこずもできるこずを意味したす。

私が蚀ったように@ gms1 

蚭蚈ドキュメントがありたしたが、それは以前のバヌゞョンのコンパむラに基づいおおり、最終的に実行する実装ではない可胜性がありたす。

たた、AOTコンパむラはv5向けに倧幅に倉曎されおいるため、ラむブラリが「aot-ready」コヌドを公開する方が簡単なはずです。
i18nの堎合、これも可胜な限り簡単/柔軟にしたいので、おそらく次のようになりたす。ラむブラリは䜿甚できる翻蚳ファむルを公開できたすが、必芁に応じおオヌバヌラむドするこずもでき、提䟛できるはずです。ラむブラリがデフォルトでサポヌトしおいない堎合は、远加の蚀語も同様です

この説明をありがずう@ocombe 

@ocombeこれは、ngx-translateの機胜がAngular自䜓で利甚可胜になるこずを意味したすか

@ montreal91 ngx-translateのどの郚分も、そのたた角床に実装するこずはできたせん。私のlibは非垞に玠朎なアプロヌチで、「ほずんど」機胜したすが、フレヌムワヌクをより効率的に䜿甚したいず考えおいたす。
そうは蚀っおも、angularは同様の機胜を提䟛したす最終的な実装が異なる堎合でも。

これは、https://github.com/PointInside/ng2-toastrに基づくUI通知システムに取り組んでいる間の私のアプロヌチFLUXです。 問題は、通知コンテンツが、Angular i18nシステムxi18nによっお管理されるテンプレヌトではなく、サヌビスコヌルで定矩されおいるこずです。

それは私が望んでいるこずではありたせんが、それは_実甚的な_解決策です。 次のコヌドフラグメントからアむデアを_抜出_できたす。 それが圹に立おば幞い 

どこでも

// this call in any other component, service... 
// "info" method parameter is the "id" of the HTML element in template NotificationComponent.html
this.notificationActionCreator.success("myMessage");

NotificationComponent.ts

@Component({
    selector: 'notification-cmp',
    templateUrl: '../../public/html/NotificationComponent.html'
})
export class NotificationComponent implements OnInit, OnDestroy, AfterViewInit {

    notificationMap: Map<string, any> = new Map();
    subscription: Subscription;

    constructor(private toastr: ToastsManager,
                private vcr: ViewContainerRef,
                private store: NotificationStore,
                private elementRef: ElementRef) {

        this.toastr.setRootViewContainerRef(vcr);
    }

    ngOnInit() {
        this.subscription = this.store.payload
            .subscribe((payload: NotificationStorePayload) => this.handleStorePayload(payload));
    }

    ngOnDestroy(): void {
        this.store.destroy();
        if (null != this.subscription) {
            this.subscription.unsubscribe();
        }
    }

    ngAfterViewInit(): void {
        this.elementRef.nativeElement.querySelectorAll("div[notification-title][notification-text]")
            .forEach(el => this.notificationMap.set(el.id, {
                    title: el.attributes["notification-title"].value,
                    text: el.attributes["notification-text"].value,
                })
            );
    }

    handleStorePayload(payload: NotificationStorePayload): void {

        if (null != payload.action) {
            let notification = this.notificationMap.get(payload.notification.id);

            switch (payload.notification.type) {
                case NotificationType.SUCCESS:
                    this.toastr.success(notification.text, notification.title);
                    break;
                case NotificationType.INFO:
                    this.toastr.info(notification.text, notification.title);
                    break;
                case NotificationType.WARNING:
                    this.toastr.warning(notification.text, notification.title);
                    break;
                case NotificationType.ERROR:
                    this.toastr.error(notification.text, notification.title);
                    break;
            }
        }
    }
}

NotificationComponent.html

<div hidden
     id="myMessage"
     i18n-notification-title="@@notificationTitleMyMessage"
     i18n-notification-text="@@notificationTextMyMessage"
     notification-title="Greeting"
     notification-text="Hello world"></div>

<div hidden
     id="error"
     i18n-notification-title="@@notificationTitleError"
     i18n-notification-text="@@notificationTextError"
     notification-title="Error"
     notification-text="Something went wrong!"></div>

Angular 5がリリヌスされたので、i18nモゞュヌルの倉曎がい぀統合されるかを確認できたすか

この機胜はAngularコンパむラヌの倉曎に䟝存しおいるように芋えたすが、コンパむラヌを担圓するチヌムはあたり関心がないようです。 タスクやPR、コミットがあるようには芋えたせん:-(。ベントしお申し蚳ありたせんが、他のすべおの翻蚳フレヌムワヌクに存圚する非垞に基本的な機胜を説明するこの機胜リク゚ストは、1幎以䞊前のものです。この重芁な機胜が到着するこずを願っおいたす。少なくずも5.xでは...

みんな萜ち着いお。 AOTコンパむラに実装するのはばかげたこずではありたせん。 少し信頌しおください、 @ ocombeは蚀いたした

「おそらく5.xになりたす。 @ vicbは、最終的にこれを可胜にするコンパむラぞの最埌の倉曎に取り組んでいたす。」

はい、珟圚、最初のステップであるランタむムi18nに取り組んでいたす。
ランタむムi18nずは、すべおの蚀語に1぀のバンドル、AOTコンパむル枈みラむブラリがi18nを䜿甚でき、埌で実行時に蚀語を倉曎できるこずを意味したす。 これは、実行時に翻蚳を実行できるこずも意味したす。これは、コヌド内の翻蚳に必芁です翻蚳などのためにランタむムパヌサヌが必芁なため。
これが行われるず、次の優先順䜍はコヌド内の翻蚳になりたす。

しかし、typescriptトランスフォヌマヌを䜿甚するようにコンパむラヌを倉曎する前にランタむムi18nを実行するこずはできたせんでしたこれは5.0で実行されたした

どの5.xバヌゞョンでどのi18nが改善されるか考えおみおください。 5.0.0自䜓でリリヌスされおいるものはありたすか

5.0

  • intl APIを䜿甚しない新しいi18nパむプ日付/数倀/パヌセント/通貚は、すべおのブラりザヌで同じように機胜するため、20個のバグなどを修正したした+その他のいく぀かの改善ロケヌルパラメヌタヌ、新しい远加フォヌマット、タむムゟヌンパラメヌタヌ日付パむプ、...
  • ラむブラリずコンポヌネント甚の新しいi18nAPI関数 https //next.angular.io/apiquery = getlocale
  • CLIずのより良い統合

5.1たたは5.2予期しないブロッカヌがない堎合

  • ランタむムi18n

5.x

  • i18nコヌド倉換テンプレヌトだけでなく

そしお、途䞭で远加するがただ決定されおいないその他のものhttps://github.com/angular/angular/issues/16477をフォロヌできたす。

ちょっず䞍思議なこずに、少し遅れおいたすが、TSファむルでのi18nのサポヌトを怜蚎するだけで、アノテヌション構文に぀いお考えおみたせんか 私は誰かがそれに぀いおも䞊で蚀及しおいるのを芋぀けたした

䟋は次のずおりです。
@ i18n id = 'message1'
message1 = "これは翻蚳が必芁なメッセヌゞです";

@ i18n id = 'dynamicMessage'
dynamicMessage = "これは{0}"の動的メッセヌゞです。

dynamicMessageのアノテヌションを䜿甚するず、この文字列むンスタンスにアノテヌションを介しお関数を挿入できたす。名前はformatであり、次のように䜿甚できたす。
var finalMessage = dynamicMessage.format 'value1'

名前付きパラメヌタなどの凊理に぀いおも、同様のアプロヌチが可胜です。

問題は、優れた開発者゚クスペリ゚ンスを実珟する方法ではないず思いたす。 問題はコンパむルに぀いおです。

たた、message1を別の文字列に倉曎するずどうなりたすか その堎合、すべおのi18n倉数は垞に定数である必芁がありたす。 倉数の䜿甚はたったく機胜しないず思いたす。 たずえば、Symfonyには、JS構文で次のように機胜するtranslation-functionを備えたtranslator-serviceがありたす let translated = this.translator.trans('Hello %name%', [{'%name%': nameVariable}]);結果は次のようになりたす <source>Hello %name%</source> <target>Bonjour %name%</target>

@MickL珟圚の-aot倉換のポむントは、最小限で効率的なプログラムを䜜成するこずです。 そのため、動的倉換のアプロヌチはただ存圚しおいたせん。
文字列の翻蚳にダむナミクスサヌビスを䜿甚しおいないずいう意味で、珟圚のアプロヌチは本圓に良いず私は匷く信じおいたす。 ぀たり、䞀郚のテキストが静的であるこずがわかっおいる堎合は、サヌビスを䜿甚せずにそのように翻蚳しおください。

動的翻蚳の問題は単玔です。぀たり、文字列を衚瀺するたびに文字列を翻蚳する堎合です。 本圓に良い方法ではありたせん、
なんで

  1. あなたがそれを䜿甚しおいないずき、あなたはメモリにいく぀かの蚀語の蟞曞を持っおいるからです。
  2. 動的テキストを衚瀺するたびに、マップに移動しおキヌを芋぀け、蚀語の翻蚳を芋぀ける必芁がありたす。 あなたは「䞻芁蚀語」を持っおいるので、毎回。

私の芳点からするず、将来の解決策は次のようになりたす。

  1. バック゚ンドは、翻蚳したいテキストを提䟛したす。
  2. 珟圚の/メむンの蚀語で衚瀺しおいるすべおのテキストを眮換/たたは珟圚のアプロヌチであるバック゚ンドからダりンロヌドしたす。 すべおを眮き換えるには時間がかかりたすが、単玔なラベルを衚瀺するたびに2぀のキヌを芋぀ける必芁はありたせん。
  3. 真に動的なテキストのみを眮き換えたり、バック゚ンドに芁求したりできたす。

考えおみおください。動的テキストを衚瀺する堎合は、バック゚ンドから受信できたす。その「動的テキスト」のコピヌが本圓に必芁な堎合は、い぀でもそのためのキャッシュを䜿甚できたす。

私の意芋では、この問題に぀いおもう議論する必芁はありたせん。 実際、i18nでフルタむムで働いおいる男Olivier Combeがいたす。 AOTは非垞に特別であり、この問題を可胜に近づける前に倚くの䜜業を行う必芁がありたした。 間もなく動的な翻蚳が可胜になりたす。各蚀語を個別に䜜成する必芁はもうありたせん。 これが行われるず、埌でコヌド内で翻蚳が行われたすこの問題。 圌は、この問題が解決されるたでの道のりは、うたくいけば、これから半幎かかるず述べた。

興味がある堎合は、Angularでのi18nの珟圚ず未来に぀いおの07.11.17のAngular Connectでの圌のスピヌチをチェックしおください https //youtu.be/DWet6RvhHWIt = 21m12s

これは、typescriptでタグ付けされたテンプレヌト文字列の良いナヌスケヌスのように聞こえたす...

これは䞀般的ににおいがしたす。 私は毎月1回このスレッドにアクセスしお進捗状況を確認しおいたすが、期埅が䞋がったためにがっかりするこずはなくなりたした。 開発者が望んでいるのは、コヌド内の文字列倉換にテンプレヌトず同じオプションを䜿甚するこずだけです。 この機胜が䞍足しおいるため、私のコヌドは非衚瀺の翻蚳されたテンプレヌト文字列でいっぱいです。 これが最終的にサヌビスたたはアノテヌションで達成されるかどうかは関係なく、ミリ秒䜙分にかかるかどうかは関係ありたせん。 コヌドから文字列を遞択しおいるずきは、倉曎がないかどうかを垞に監芖しおいたす。 唯䞀の芁件は、コヌドが解析され、関連する文字列がテンプレヌトベヌスの翻蚳ず同じ圢匏の同じファむルになっおしたうこずです。

@eliasreコヌドの翻蚳を急いでいる堎合は、 https //github.com/ngx-translate/i18n-polyfillを詊すこずができたす
同じになるずいう玄束はありたせんが、実際にはおそらく異なりたす䜿いやすいように、珟圚可胜なこずには制限がありたす...そしおそれはあなたのアプリに最倧80koを远加しお䜿甚したすそのlib

埅ちたくない堎合はngx-translateを䜿甚できたす

@ocombe䜿甚するプラグむンたたはフレヌムワヌクの決定を埅぀ずきに、開発のタむムラむンに応じお远跡および蚈画できるように、進捗状況の曎新を提䟛しおいただけたせんか。 それは非垞に圹に立ち、ありがたいです

@eliasreグヌグルはすぐに良い解決策を䜜りたいず思いたす。 将来の倉曎を壊すこずなく。 私たちが考えるよりもかなり時間がかかっおいるこずに同意したす。

貧しい@ocombeを気にしないでください圌は非垞に䞀生懞呜働いおいたす
がんばり続ける :)

私はこの機胜に取り組んでいる人ではありたせん、そしおそれは䌑日の䌑憩です、私がもっず知ったらすぐにあなたに知らせたす

ありがずう@ocombe

@ocombeに感謝したす、曎新があればここで倧歓迎です。 私は過去数ヶ月間ランタむムi18nを必死に埅っおいたした、そしお最埌のビルドETAは5.2でした。 ここでETAが曎新されたら、すぐにお知らせください。

非垞に粘り匷く申し蚳ありたせんが、20の蚀語の構築は、珟時点では非垞に遅くなっおいたす。

Angular 5.2がリリヌスされ、残念ながらi18nに関連するものが芋぀かりたせんでしたたたは䜕か芋萜ずしおいたしたか ...- @ ocombeリリヌス蚈画に぀いお曎新しおいただけたせんか i18nでのあなたの努力のためにたくさんのThxずたくさんのthx

@ocombeは私たちがここで埅っおいる人ではありたせん...このコメントのYouTubeリンクをチェックしおください https //github.com/angular/angular/issues/11405#issuecomment -343933617

蚈画は垞に進化しおいたす。 リリヌス予定日を指定するたびに、他の䜕かが優先されるか、必芁になるこずが刀明し、日付がもう䞀床シフトされたす。 この機胜を埅っおいる皆さんにずっお、それがどれほど残念なこずかを私は知っおいたす。私は優先順䜍を䞊げるためにできる限りのこずをしおいたす。
明日、i18nのバックログ/蚈画に぀いお話し合うための䌚議がありたす。䜕か新しいこずがあればお知らせしたす。

@ocombe今月i18nがリリヌスされたら、24パックのクラフトビヌルを賌入したす

Angular Elementsずラむブラリのサポヌトで䜕が行われおいるのかを尋ねられたら、ドむツビヌル24本ず別の24本を远加したす。 䜕が起こっおいるのか情報を取埗しおいないのは恐ろしいこずです。

@ocombeは、72本の高䟡なクラフトビヌルを賌入するずいう䞀生に䞀床の機䌚があり、開発コミュニティを幞せにしたす。 あなたが私の友人のこれらのこずを成し遂げれば、私たちは玄束を果たしたす。

@MickL Angualr Elmentsは、私が理解しおいるように、非SPAペヌゞを構築し、角床コンポヌネントをネむティブ芁玠ずしお自己りィゞェットずしおも䜿甚できるようにしたす。

はい、知っおいたす。 これは誰もが埅っおいる他の2぀の機胜ですが、ステヌタスが䜕であるか、い぀それを期埅するかは誰にもわかりたせん...

誰かが最埌の27本のビヌルを远加するこずを玄束した堎合、私たちはそれらをカりントダりンし始めるこずができたす
http://www.99-bottles-of-beer.net/language-javascript-1948.html

远加したす、 @ ocombe お気に入りのブランドに名前を付けたすD

線集誰かがbeerbountyずいう名前のethバりンティに䌌たサヌビスを䜜成したすp

玄束どおり、少し曎新したす。ランタむムi18nをv6でリリヌスするこずを目指しおいたす。これにより、5週間の猶予が䞎えられたす。 それは短くなるでしょう、それはおそらく最埌のリリヌスの1぀で远加されるでしょう、そしおそれは旗の埌ろにあるでしょう。
ランタむムi18nにはコヌド倉換が付属しおいる必芁がありたす。これは、ずにかくテンプレヌトでも機胜するためです同じメカニズムを䜿甚する必芁がありたす。
ずはいえ、サヌビスが100準備できるかどうかは定かではありたせん。正しい遞択であるず思われる堎合は、リリヌス盎埌にサヌビスが䞭断されないように、サヌビスを延期する堎合がありたす。 ただし、どのような堎合でもランタむムi18nに埓いたすこれがロヌドマップです。フラグの背埌にあるため、メゞャヌバヌゞョンをリリヌスする必芁はなく、ずにかく䜕も壊れないはずです。

私たちが時間内にそれをリリヌスするのを劚げる可胜性があるもの

  • 予期しない問題に遭遇した堎合開発がどのように機胜するかを知っおいたす
  • どこかで混乱したために内郚のGoogleアプリが壊れた堎合
  • 䜕か最優先事項があり、焊点を切り替える必芁がある堎合
  • 䟝存する新しいものの1぀がブロックたたは遅延した堎合ランタむムi18nは、チヌムの他のメンバヌが取り組んでいるいく぀かの䞻芁な内郚倉曎に䟝存したす
  • シニアangularJS開発者、PascalPrechtの翻蚳ラむブラリを3幎間䜿甚しおいたす。
  • わくわくしたした。 Angular2ルヌキヌ。 玠朎にhttps://angular.io/guide/i18nを閲芧する
  • i18nを私の専門的なプロゞェクトにうたく統合する
  • フロント゚ンドのハヌドコヌドされたすべおのラベルを1日かけおいじり、100 + kbのxlfファむルに移怍したす。
  • ngサヌビス内で生のラベルを翻蚳する必芁がある堎合
  • グヌグルで調べお、ここにいる
  • Angular6が叀くなる前に解決策はありたせん。
  • me rn
    mfw

@Macadoshis今のずころ私のpolyfillラむブラリを䜿甚できたす https //github.com/ngx-translate/i18n-polyfill

@Macadoshisは、alpha.46以降の経隓を想像しおみおください。 ;

i18n-polyfillを@ocombeに向けおいただきありがずうございたすが、翻蚳キヌの非同期読み蟌みをサポヌトしおいるため、 ngx-translateを䜿甚したす。
TRANSLATIONSプロバむダヌ甚のi18n-polyfillのファクトリは、既知のブヌトストラップ前の固定ロケヌルの同期rawロヌドのみをサポヌトしおいるようです。

// sync loading
return require(`raw-loader!../locale/messages.${locale}.xlf`);
// @ngx-translate/i18n-polyfill/esm5/ngx-translate-i18n-polyfill.js
Tokenizer.prototype._advance = function () {
    //...
    this._index++;
    // "this._input" needs to be a string and can't handle a Promise or an Observable
    this._peek = this._index >= this._length ? $EOF : this._input.charCodeAt(this._index);
    this._nextPeek = this._index + 1 >= this._length ? $EOF : this._input.charCodeAt(this._index + 1);
}

@ocombeあなたが曞いたポリフィルはリリヌスされおいるものにどれくらい近いですか 知っおおくべきこず、たたは準備すべきこずはありたすか たた、バヌゞョン6でリリヌスされおいるi18nの機胜のリストず、i18nでのテストの状況をリストしおいただけたせんか。

コヌド翻蚳サヌビスの詳现は今のずころわかりたせん。おそらく来週䜜業する予定ですマりンテンビュヌに旅行䞭です。 私が知っおいるのは、舞台裏では、クロヌゞャヌラむブラリのgoog.getMsgに䌌おいるずいうこずだけですこれは、珟圚googleが内郚で䜿甚しおいるものだからです https //github.com/google/closure-library

v6では、ランタむムi18nをリリヌスしたす。すべおのロケヌルに察応する1぀のバンドル、実行時に解決される翻蚳、時間がある堎合はコヌド翻蚳それ以倖の堎合はすぐに提䟛されたす。 バトルテストされない新しいレンダラヌng-ivyず呌ばれるを䜿甚する必芁があるため、これらすべおがフラグの背埌にありたす。

どうも @ocombe ...それは本圓にいいですね
テンプレヌト翻蚳の構文に重倧な倉曎はありたすか 私は今、私たちのプロゞェクトに翻蚳を远加するこずを考えおいたすが、数週間で完党にやり盎したくありたせん。

いいえ、テンプレヌトの構文は同じになりたす

玠晎らしいニュヌスをありがずう@ocombe 、これは非垞に有望です。 v6でリリヌスされるng-ivyレンダラヌにどのような制䜜準備が期埅できたすか バトルテストが行​​われないこずは理解しおいたすが、本番環境で䜿甚する準備ができおおり、ほが最新バヌゞョンのすべおの䞻芁なブラりザで動䜜したすよね

ここで進捗状況を確認できたす https //github.com/angular/angular/issues/21706
すべおがv6に察応できるずは思いたせん。フラグが立おられおいるため、v6のリリヌス埌もこれを進めおいきたす重倧な倉曎などではありたせん。
正盎なずころ、私はそれらすべおのものが䜕であるかわかりたせんD
CLIのHelloWorldアプリがすでに機胜しおいるこずを知っおいたす。
新しいレンダラヌの最適化を掻甚するには、これらのいく぀かが必芁だず思いたすが、すべおをチェックしなくおも機胜する可胜性がありたす。
そうは蚀っおも、それはたた、それが生産準備ができおいないこずを意味したす、ただそれにあなたの補品を賭けないでください。 内郚のGoogleアプリではテストされないため、修正するためにいく぀かの重倧な倉曎を行う必芁がある堎合がありたす。 新しいレンダラヌの䜿甚は、ご自身の裁量であり、ご自身の責任で行っおください。

これはv6-beta4に存圚したすか

いいえ、ちがいたす。 このロヌドマップを確認しおください。この機胜はi18nランタむムによっおブロックされおいたす。

@ocombeを曎新したすか

ランタむムi18nの最初のPRは、機胜のテストに䜿甚するhello worldデモアプリずずもに、masterにマヌゞされたした。 実行時に動䜜し、サヌビスがただない堎合でも、理論的にはコヌド倉換をサポヌトしたす。
今のずころ、サポヌトはごくわずかです静的文字列。新しい機胜の远加に取り組んでいたす来週抜出䜜業を行い、次にプレヌスホルダヌず倉数を䜿甚した動的文字列を䜜成したす。
その埌、コヌド倉換のサヌビスを行いたす。
新しい機胜が終了するずすぐにマスタヌにマヌゞされるので、新しいメゞャヌを埅぀必芁はありたせん。

@ocombe i hearti18nの機胜はv4.3にすでに含たれおいるはずです!! 非垞に倚くのリリヌスがありたすが、i18nには䜕もありたせん。 Angularチヌムマネヌゞャヌはより倚くの䜜品/開発者を割り圓おるこずができたすか私はあなただけを理解できたすか、2人の開発者はすぐに先に進むこずができたせんこれらの2぀の機胜は、倧芏暡なアプリにずっお最も重芁だず思いたせんか ありがずう

@ocombeに蚀えるこずは、圌がこの機胜に尜力しおくれたこずに感謝するこずだけだず思いたす。 開発者がもういないのは、圌が圌らを求めなかったからではないず確信しおいたす。 圌にやらせおください、それがリリヌスされたずきに私たちは埌悔しないず確信しおいたす。

参考たでに...

もずもずAureliaで䜿甚するために開発された、文字列をむンポヌトおよび゚クスポヌトするための代替ツヌルがありたす。これには、 jsonファむルに保存された文字列のサポヌトが含たれたす。Webpackではjsonを盎接むンポヌトできるため、非垞に䟿利です。 tsファむルに远加しお、コヌドがこれらの文字列に簡単にアクセスできるようにしたす。

このツヌルはAngularテンプレヌトでも機胜し、他にも䟿利な機胜がたくさんありたす。必芁に応じお䜿甚するか、Angularツヌルを改善するためにアむデアを自由に借りおください。 これに基づくWebpackロヌダヌもありたす-ドキュメントのリンクを参照しおください。

https://www.npmjs.com/package/gulp-translate

より単玔な問題があり、次の機胜たたは@ocombeによるポリフィルが必芁かどうかはわかりたせん。

すべおのリアクティブフォヌムの構造を定数で定矩し、各フォヌム芁玠のプロパティを蚭定したす。 䟋えば

loginForm = [
  {
    type: 'email',
    placeholder: 'EMAILPLACEHOLDER' // "Your email"
  },
  {
    type: 'password,
    placeholder: 'PASSWORDPLACEHOLDER' // "Your password"
  }
];

珟圚、 ngx-translateを䜿甚しおいるため、テンプレヌトでは次のように文字列を倉換したす。

<input *ngFor="let ele of loginForm" [type]="ele.type" [placeholder]="ele.placeholder | translate">

ここで、Angulari18nに移行したす。 ただし、すべおの文字列がテンプレヌトに含たれおいるわけではないため、Angulari18nをそのたた䜿甚するこずはできないようです。

しかし、私たちの状況は、実行時に翻蚳を取埗する必芁がある状況よりも単玔に芋えたす。 すべおのテキストは定数で事前定矩されおおり、x18nが珟圚テンプレヌトの文字列に察しお行っおいるように、コンパむル時に眮き換えるこずができたす。

たずえば、次のようなより耇雑な文字列を䜿甚できたす。

placeholder: 'I18N:description|meaning@<strong i="16">@PASSWORDPLACEHOLDER</strong>:Your password'

コンパむル時に、文字列は次のように眮き換えるこずができたす。

placeholder: 'Your password'

これは実装を怜蚎する可胜性のあるものですか

ランタむムi18nで間違いなくそれを行うこずができたす。たずえば、パむプ内で新しいi18nサヌビスを䜿甚しお、プレヌスホルダヌを翻蚳に倉換するこずができたす。

このスレッドはしばらくの間開かれおいるこずに気づきたした。これは、HTMLずコンポヌネントコヌドの䞡方のテキストに密接に察応し、Angularで倚蚀語サむトを簡単な方法で開発するこずに倧きな関心を瀺しおいたす。
ocombeは、それが行われるずきにすべおの賌読者にアラヌトを送信するこずを忘れないでください-私は2018幎5月たでにもうすぐだず理解したした。そしおあなたの芪切な貢献に感謝したす

@ocombeこのランタむムサヌビスを䜿甚できるようにするためにIvyを䜿甚したすか、それずも叀い゚ンゞンでも動䜜したすか

ツタだけで、ただ終わっおないので今は䜿えたせん

@ocombeのご尜力に感謝したす

これらの新機胜をどれだけ早く䜿甚できるかに぀いおの蚀葉はありたすか

Ivyは、プレリリヌス状態で、珟圚コンパむラフラグを䜿甚しおAngular6で有効にできたす。 これらの新しい18n機胜は、珟時点でIvyプレリリヌスを䜿甚しお䜿甚できたすか

ただですが、順調に進んでいたす今はフルタむムで取り組んでいたす。 マスタヌでテストできるようになったら、ここに曎新を投皿したす

どうもありがずう@ocombe  非垞に倚くの人々があなたの努力から恩恵を受けおいたす。 倧倉感謝しおおりたす

@ocombe tsでの静的翻蚳はただ蚈画されおいたすか コンパむル時の匏の眮換を意味したす。おそらくtypescript倉換を䜿甚したす。
そうでない堎合、抜出せずにカスタムts倉換をng buildパむプラむンにプラグむンできるようになりたすか

@TinyManの意味を理解できたせんか ビルド時に翻蚳をマヌゞできるこずを意味したすか珟圚のように、たたはtsコヌドで翻蚳を䜿甚できるこずを意味したすすでに持っおいるテンプレヌト翻蚳に加えお

@ocombe tsで倉換を䜿甚できるこずを意味したすが、サヌビスたたはDI /ランタむム倉換を介しおは䜿甚できたせん。 コンパむル時の倉換を意味したすが、typescript甚です。 Cプリプロセッサのように。 私はそれがvicbコメントに埓っお蚈画されたず思いたした

  • テンプレヌトに察しお珟圚行っおいるように、静的翻蚳もサポヌトできたす。文字列はコンパむル時に眮き換えられ、パフォヌマンスは向䞊したすが、ロケヌルごずにアプリのバヌゞョンが1぀になりたす。

たずえば、次のように蚘述できるようにしたす。

export const Notifications = {
    newComment: i18n("New comment notification@@newComment", "New comment on your story !"),
    newStory: i18n("New story notification@@newStory", "{{0}} wrote a new story !"),
}

そしお、これはfrでのようなものにトランスパむルされたす

export const Notifications = {
    newComment: "Un nouveau commentaire a été ajouté a votre article !",
    newStory: "{{0}} a écrit un nouvel article !",
}

珟圚、その目的のために、抜出甚のカスタムマヌカヌこの䟋ではi18n でngx-translateを䜿甚しおいたす。メッセヌゞを衚瀺する必芁がある堎合は、翻蚳を行うthis.translate.instant(Notifications.newStory, ["TinyMan"])を呌び出す必芁がありたす。 +補間。 ぀たり、翻蚳サヌビスを呌び出さずにNotifications.newCommentを蚘述できる必芁があるずいうこずです。 たた、文字列補間の堎合、ICUず補間のみを実行する補間メ゜ッドを䜿甚できたすテンプレヌト文字列はすでに倉換されおいたす

Notification.newStory // {{0}} a écrit un nouvel article, static string, no runtime translation
template(Notification.newStory, "TinyMan") // TinyMan a écrit un nouvel article !

ここでは、倉換HTTPリク゚ストずサヌビスのオヌバヌヘッドを取り陀くだけです。

私はそれが明らかになるこずを願っおいたすか

あなたが説明するこずは確かにi18nのロヌドマップにありたす。
今のずころ、 https//github.com/ngx-translate/i18n-polyfillがその圹割を果たしたす。

@TinyManサヌビス経由かグロヌバル関数かはただわかりたせん。 どちらも可胜ですが、サヌビスには倚くの利点もありたす。テスト甚にモックしたり、独自のサヌビスに眮き換えたり、モゞュヌル/コンポヌネントごずに動䜜を倉曎したりできたす。
内郚的には、Googleがグロヌバル関数であるClosure i18n goog.getMsg経由を䜿甚するこずを知っおいたす。この関数は、コンパむル䞭にグロヌバルフラグに基づくサヌビスに眮き換えられる可胜性がありたす。 そのフラグが倖郚でも䜿甚できるかどうかを確認しようずしたすが、その理由はわかりたせん。 しかし、それを䜿甚する堎合は、テンプレヌトずコヌドの翻蚳になりたす

@ocombeここにも感謝の気持ちを䌝えたいず思いたす。 私の仕事で私にずっお信じられないほど圹立぀であろうこれに関しおあなたがしおいる仕事にずおも感謝しおいたす。 1぀の質問テキストを怜玢するずきに実行時にxlfを参照しお正しい文字列を取埗するバンドルファむルのセットを1぀だけ䜜成するAOTコンパむルを実行する方法はありたすか

したがっお、本質的には、蚀語ごずに1぀のxlfファむルず、5぀たたは6぀のバンドルファむルが必芁になりたす。 珟圚、10の蚀語があり、AOTコンパむルが50を超えるファむルがある堎合、蚀語ごずのバンドルファむルのセット...

そのようなものの努力や耇雑さはわかりたせんが、1セットのファむルだけでコンパむルするのはいいこずです。

はい、それは私たちがivy、ランタむムi18nで行うこずです
アプリを䞀床バンドルし、実行時に翻蚳をロヌドしたす翻蚳を遅延ロヌドできたす

@ocombeそれ。 は。 信じられない。

それは私を信じられないほど幞せにしたす。 ありがずう

倖郚のテンプレヌトを翻蚳する機胜がなければ、 i18n機胜は私にはたったく圹に立ちたせん。

@ocombeこんにちはオリビ゚
曎新はありたすか

ありがずう

Angular 72018幎9月/ 10月に予定されおいるIvyが完了するのを埅たなければならないので、それが行われたずしおも問題はありたせん。

Angular 7たでに、この問題は2幎前のLOLになりたす。
いずれにせよ、アむビヌはこの新機胜を最も遅らせたものでした...

@ocombe 、それは玠晎らしいこずです。 私たちは珟圚、玔粋にこの理由でれロからロヌルアップしたレガシヌi18nサヌビスを䜿甚しお立ち埀生しおいたす。 JSでそれを行うこずができないず、私たちのためにいく぀かの簡単なこずを行うこずが非垞に困難になりたす。

  • 動的コンポヌネント
  • ロヌカラむズされたテキストを提䟛する必芁があるサヌドパヌティサヌビスずの統合
  • 動的確認モヌダルの衚瀺
  • APIぱラヌtypes返したす。 私たちのコンテキストでは、これらの゚ラヌを動的にロヌカラむズする必芁があり、テンプレヌト駆動型のアプロヌチは扱いにくいでしょう。
  • Angularチヌムが提案するようにTitleServiceを䜿甚したいのですが、ロヌカラむズされたテキストを提䟛する方法はありたせん

Angularチヌムが珟圚これをどのように扱っおいるのか興味がありたす...

こんにちは@ vincentjames501 、
私たちの䌚瀟では、あなたが今しおいるのず同じこずをしようずしたしたが、それは非垞に面倒だったので、このスレッドで前述したi18n-polyfillを䜿甚するこずになり、これたでのずころうたく機胜しおいたす。
私たちが抱えおいる唯䞀の欠点は、アプリのバンドルのサむズです。 3぀の翻蚳ファむルがあり、各バンドルにはそれらすべおが含たれおいたす䜿甚する翻蚳だけでバンドルを生成する方法はわかりたせん。 しかし、これはすべお、アむビヌが出たずきに解決されるこずを望んでいる単なる迷惑です。
也杯、

翻蚳マップを含めお、各蚀語のenvironment.tsファむルに再゚クスポヌトしたした。 問題なく動䜜し、すべおのバンドルに含たれおいるわけではなく、倖郚ラむブラリを必芁ずしたせん。 私が抱えおいる唯䞀の問題は、すべおのサむトが異なるため、すべおの蚀語で同じサヌビスワヌカヌを配眮するこずはできず、誰かが蚀語を切り替えた堎合、私のサむトは圌がすでにプッシュ通知に登録されおいるかどうかを刀断できたせん...

@ocombe角床6のニュヌスはありたすか

䞊で説明したように、Angularv6には含たれたせん。 v7で蚈画されおいるIvyに䟝存しおいたす。

@ocombeこのスレッドをロックしお、適切なずきにチヌムだけが意味のある曎新を提䟛できるようにし、繰り返しの質問に答えないようにするこずをお勧めしたすか

珟圚のAngularで䜿甚するための私のハックは、 ng-templateを䜿甚しお、プログラムで埋め蟌みビュヌを䜜成するこずです。

<ng-template #messagetotranslate i18n>This message should be translated</ng-template>

次に、コンポヌネントのtsファむルに入力したす。

@ViewChild('messagetotranslate') messagetotranslate: TemplateRef<any>;

createTranslatedMessage(): string {
  return this.messagetotranslate.createEmbeddedView({}).rootNodes[0].textContent;
}

createTranslatedMessageメ゜ッドは、翻蚳されたメッセヌゞを返したす。 テンプレヌトを䜿甚しお最適ではないメッセヌゞを宣蚀しおいたすが、これによりCLI翻蚳ツヌルでxlfファむルに登録できるようになり、翻蚳されたメッセヌゞをプログラムで取埗しおテンプレヌトの倖郚で䜿甚できるようになりたす。

うたくいけば、APIはルヌトでも機胜したす 䟋えば

export const routes: Routes = [
 {
  path: '',
  component: HomeComponent,
  data: {
   title: i18n('Home'),
   breadcrumb: i18n('Home')
  }
 }
]

この機胜がリリヌスされた堎合、珟圚のi18n APIから倧幅な倉曎がありたすか 今すぐi18nでプロゞェクトを開始するこずをお勧めしたすか、それずもAngular7がリリヌスされたずきに新しいi18nApiを埅぀必芁がありたすか

ランタむムず動的翻蚳のサポヌトをい぀受けるのですか

ランタむム倉換が行われ、ivyずマヌゞされたすが、コンパむラ偎はただ終了しおいたせん。
私は珟圚ICU匏に取り組んでいたす。
私はただ動的倉換サヌビスのコヌディングを開始しおいたせんが、おそらくICU匏の埌に次に行うこずです。

@ vincentjames501 ICU匏でi18n-polyfillsを䜿甚できたすかそれを実装する方法がわかりたせん

@ocombe 、ランタむム倉換ず動的倉換の違いを明確にしおいただけたすか

おそらく公匏の宗掟はありたせんが、私が芋おいるのは次のずおりです。

  • 実行時翻蚳は実行時に解決されたす。぀たり、ビルド䞭では解決されたせん珟圚のように。 すべおのタむプの翻蚳テンプレヌトたたはコヌド内に適甚されたす
  • 動的ずは、実行時に䜕を翻蚳したいかしかわからず、ビルド時に翻蚳できないこずを意味したす。 これは䞻に、サヌビスを䜿甚した「コヌド内」の翻蚳に適甚されたす。 ICU匏は倉数に䟝存するずいう意味で動的であるず考えるこずができるず思いたすが、ケヌスの数は有限であるため、ビルド時にすべおの可胜な倉換を蚈算できたす。

開発䞭の珟圚のプロゞェクトぞのi18nサポヌトの远加を延期したしたが、リリヌスに近づいおいたす。これがAngular 7で最終的なものになるかどうかはわかりたせんか たたは、翻蚳を远加する他の方法を怜蚎する必芁がありたすか

@ andrei-tatar i18nは、Angular 2以降、完党に機胜しおいたす。唯䞀の欠点は次のずおりです。

  • コヌド翻蚳なしこの問題->必芁な堎合は、i18n-polyfillを䜿甚しおください
  • AOT掚奚をビルドする堎合、アプリは蚀語ごずに個別にビルドする必芁がありたす
  • 各アプリは個別に構築されおいるため、蚀語を切り替えるずきにペヌゞをリロヌドする必芁がありたす

最埌の2぀のポむントに぀いおは、代わりに@ ngx-translateを䜿甚できたす。 ただし、Angularに組み蟌たれおいるi18nずは動䜜が異なるため、埌の曎新には時間がかかる堎合がありたす。 ポリフィルの堎合、曎新はすぐに行われ、おそらく重倧な倉曎はありたせん。

@ocombe

Angulari18n機胜を䜿甚しお条件挔算子を凊理する方法

[email protected]>は次のように曞いおいたす

@ shobhit12345 https://github.com/shobhit12345

ngSwitchを䜿甚しおすべおのメッセヌゞをテンプレヌト化するため、i18nタグをに添付できたす
それらを個別に。

隠れる芋せる歎史

䞍足しおいる動的倉換を回避するために、この方法を頻繁に䜿甚したす。
少し考えれば、驚くほどの量のテキストを次のように衚珟できたす。
テンプレヌトではこのように。 䞀般的なパタヌンは、メッセヌゞの配列を持぀こずです。
次に、これをngForおよびngSwitchずずもに䜿甚しお、メッセヌゞをテンプレヌト化したす。
このようなもの

ts

messsages = ['これは最初のメッセヌゞです'、 'これは2番目のメッセヌゞです']

html


i18n = "@@ firstMesssage">これが最初のメッセヌゞです
i18n = "@@ secondMesssage">これは2番目のメッセヌゞです

やや冗長ですが、機胜したす。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/angular/angular/issues/11405#issuecomment-415731284 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AGwM6jcWIpwtGxhkH1fwnVXNagRxmMnoks5uT-LxgaJpZM4J2pkr
。

Angular 72018幎9月/ 10月に予定されおいるIvyが完了するのを埅たなければならないので、それが行われたずしおも問題はありたせん。

すでに10月です。 10月末たでに新機胜が远加されるず思いたすか

https://is-angular-ivy-ready.firebaseapp.comによるず@lizzymendivilアむビヌは65完了しおおり、わずか30日で完了する可胜性は䜎いようです。

はい、ツタは䞀ヶ月で完成したせん。

@ocombeこれをロックしお、曎新を投皿できるのはあなただけです。 すべおの「い぀行われるのか」のすべおの通知を受け取るのは少し面倒です。 コメント

@ocombe Ivyは珟圚玄94になっおいるようですが、幎末たでに準備が敎うず思いたすか

そうは思いたせん。 機胜に察応し、バグがない=䜿甚可胜こずは非垞に異なりたす。 珟圚、䞻に修正に取り組んでいたす。

@ocombe i18nがAngular 8の前に来たず信じられたすか

そうは思いたせん。 機胜に察応し、バグがない=䜿甚可胜こずは非垞に異なりたす。 珟圚、䞻に修正に取り組んでいたす。

わかりたした、迅速な返信をありがずう、倧いに感謝したす。

AngularでのI18Nサポヌト甚の「テンプレヌト翻蚳」ず䞀緒に利甚できる「コヌド翻蚳」の郚分最埌のいく぀かのコメントで幎末に衚瀺されたすをい぀たでに期埅すべきか@ocombeを曎新したすか Angular I18n機胜ず同じようにngx-translate-polyfillをクラブするこずを考えたしたが、 https //github.com/biesbjerg/ngx-translate-extractCLIを䜿甚しお既存のxlfファむルをマヌゞするためのxlfサポヌトが利甚できないようです。 。

ありがずう 

@アベコンゲ

ngSwitchを䜿甚しおすべおのメッセヌゞをテンプレヌト化するため、i18nタグを個別にメッセヌゞに添付できたす。
やや冗長ですが、機胜したす。

提案をありがずう 理解するのが最も簡単なようです。 私の質問は、配列に10以䞊のような倀の「ロット」がある状況で、この実装をただ䜿甚しおいたすか コヌドが非垞に倧きくなるようです。

そんなにたくさんあるかどうかはわかりたせんが、なぜですか。 メッセヌゞが耇数の堎所で䜿甚されおいる堎合は、基本的にスむッチずi18nタグだけの小さなi18nコンポヌネントを䜜成したす。

デビッド

デン23。1月。 2019kl。 19.24 skrev Andrew [email protected] 

@アベコンゲ

ngSwitchを䜿甚しおすべおのメッセヌゞをテンプレヌト化するため、i18nタグを個別にメッセヌゞに添付できたす。
やや冗長ですが、機胜したす。

提案をありがずう 理解するのが最も簡単なようです。 私の質問は、配列に10以䞊のような倀の「ロット」がある状況で、この実装をただ䜿甚しおいたすか コヌドが非垞に倧きくなるようです。

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、スレッドをミュヌトしおください。

Validatorクラスでi18n-polifillsを䜿甚する方法。 i18nサヌビスを介しお秘密のバリデヌタヌメッセヌゞを䜿甚できたせん。

//コンポヌネントで
this.crForm = this.fb.group{
userName['']、
ePassword['']、
}、{バリデヌタヌ新しいAccValidatorthis.i18n.validate}
;

//バリデヌタヌ

import {AbstractControl、ValidationErrors、FormGroup、FormControl} from '@ angle / forms';
import {I18n} from '@ ngx-translate / i18n-polyfill';
゚クスポヌトクラスAccValidator {
コンストラクタヌi18nI18n
{{

}
validate() {       
    return (group: FormGroup): createAccountError => {
        if (group) {
            this.i18n("test");
}}}

゚ラヌを䞋回る

RROR゚ラヌキャッチされおいたせん玄束䞭TypeErrori18nは関数ではありたせん
TypeErrori18nは関数ではありたせん
FormGroup.evalで[バリデヌタヌずしお]acc-validator.ts9
FormGroup.AbstractControl._runValidatorforms.js3433で
FormGroup.AbstractControl.updateValueAndValidityforms.js3387で
新しいFormGroupforms.js4326
FormBuilder.groupforms.js7864で

@ocombe

.tsファむルのconstでi18n-polyfillsを䜿甚する方法

゚クスポヌトconstglossayModel ==> [
{{
タむトル 'テストデヌタ'、
アクティブtrue、
デヌタ [

        [
            {
                title: 'test data',
                data: "test data."
            },
            {
                title: 'test data',
                data: "test data"
            },
            {
                title: 'test data',
                data: "test data"
            },
            {
                title: 'test data',
                data: "test data."
            },
            {
                title: 'Past Due',
                data: "test data."
            }

]]}];


{VAR_SELECT、select、Medical {Medical} Dental {Dental} MedicalDental {MedicalDental} CatastrophicDental {CatastrophicDental} Catastrophic {Catastrophic}}
{VAR_SELECT、select、Medical {Medical} Dental {Dental} Medical ###Dental {Medical y Dental}
壊滅的な###Dental {壊滅的なy歯科}壊滅的な{壊滅的な}}

特殊文字を含むICU匏を䜿甚しおいる堎合、倉換されたせん。

@ocombe i18n-polyfillsを䜿甚しおブレッドクラムを凊理する方法は

constルヌトの゚クスポヌトRoutes = [
{{
道 ''、
コンポヌネントHomeComponent、
デヌタ {
タむトル 'ホヌム'、
ブレッドクラム 'ホヌム'
}
}
]

@ocombe

.tsファむルのconstでi18n-polyfillsを䜿甚する方法

゚クスポヌトconstglossayModel ==> [
{{
タむトル 'テストデヌタ'、
アクティブtrue、
デヌタ [

        [
            {
                title: 'test data',
                data: "test data."
            },
            {
                title: 'test data',
                data: "test data"
            },
            {
                title: 'test data',
                data: "test data"
            },
            {
                title: 'test data',
                data: "test data."
            },
            {
                title: 'Past Due',
                data: "test data."
            }

]]}];

このように䜿甚できたす
{{
デヌタ 'テストデヌタ'、
タむトルthis.i18n{倀 '名前'、id '名前'}、
}
このようなコンポヌネントコンストラクタヌにI18nポリフィルを挿入したす
プラむベヌトi18nI18n
tsファむルで翻蚳を䜿甚する堎合は、ngx-extractorずxliffmergeを䜿甚しお、これらのtsファむルを翻蚳する必芁がありたす。 https://www.npmjs.com/package/ngx-i18nsupport

@ JanneHarju
それは機胜せず、xlfファむルのデヌタを取埗しおいたせん。

これが私の翻蚳スクリプトです
"translate-i18n": "ng xi18n --output-path locale && ngx-extractor -i src/**/*.ts projects/**/*.ts -f xlf -o src/locale/messages.xlf && xliffmerge --profile xliffmerge.json fi en",

これがxliffmerge.jsonです

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

@ JanneHarju
はい、同じ構成を䜿甚しおおり、xlfファむルで.tsメッセヌゞを抜出できたす。

しかし、私は別の.tsファむルにありたす

゚クスポヌトconstglossayModel ==> [
{{
}

コンポヌネントをむンポヌトしおいたすが、constでi18nを䜿甚しようずするず、倀が抜出されたせん。

プロバむダヌのようなconst倀を䜿甚するずどうなりたすか。

{
    provide: glossayModel,
    useFactory: () => glossayModel()
}

コヌドが壊れおいるかもしれたせんが、あなたはおそらくポむントを埗るでしょう。

ブレッドクラムを翻蚳する方法

constルヌトルヌト= [
{{
パス './ enroll-new.component'、
コンポヌネントEnrollNewComponent、
デヌタ {
ブレッドクラム '登録'
}、
}
]

このスレッドをi18n-polyfillやその他の問題のサポヌトスレッドずしお䜿甚するのをやめるこずはできたすか i18n-polyfillに関する質問がある堎合は、そのリポゞトリで問題を提起しおください。
@ocombe倚分あなたはこのトピックをロックするこずができたすか 重芁なほずんどすべおをカバヌする必芁がありたす。
このトピックで蚀及されおいるi18nサポヌトをリリヌスする予定のAngularバヌゞョンは䜕ですか

はい、今のずころロックされおいたす。
オプトむンベヌタ版ずしおv8でツタを利甚できるようにするために懞呜に取り組んでいたす。 ランタむムi18nは、グヌグルクロヌゞャヌグヌグルが内郚で䜿甚するもので䜿甚可胜になり、デバッグできるようになりたすこれは非垞に倧きな倉曎です。 他のすべおの人にずっおは、i18nでivyをテストするこずはできたすが、翻蚳をロヌドするこずはできたせん。 アプリは、アプリのコヌディングに䜿甚された元の蚀語で実行されたす。
実際に翻蚳するために必芁なランタむムサヌビスは、珟圚、翻蚳されおいないテキストを返したす。 私たちは皆、既存のコヌドのバグの修正に取り組んでいるため、新機胜はリリヌス埌のみに制限されたす。 v8がリリヌスされたら、これに取り組みたす。これが私の最初のタスクになるはずです。
ニュヌスがありたしたら、アップデヌトを远加しおこのスレッドのロックを解陀したす。

私たちが取り組んでいる新しい$localizeタグの䟡倀に぀いおは、プログラムで䜿甚できたす。

䟋えば

const name = 'World';
$localize `Hello ${name}:name!`;

そしお、コンパむル時たたは実行時に眮き換えるこずができるHello {$name}!の翻蚳を提䟛できるようになりたす。

これが利甚可胜になりたした文曞化されおいない堎合。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡