éä¿¡ããŠããŸã... ïŒã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);
ãã®ä»ã®äŸïŒ
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', '');
}
}
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')
};
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();
});
}
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')
]
}
});
}
è¡åãå€ããåæ©/ãŠãŒã¹ã±ãŒã¹ã¯äœã§ããïŒ
ãã³ãã¬ãŒãã®å€ã§æååã翻蚳ã§ããããã«ãªããŸãã
ããªãã®ç°å¢ã«ã€ããŠæããŠãã ããïŒ
@vicb
ããã¯æ¬åœã®ã·ã§ãŒããããŒã ãšæããŸãããããå®è£
ããããŸã§ã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?});
}
__(...)
ããµããŒãã§ããå¯èœæ§ããããŸãã/ 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ã§ããè¯ãèŠããããã¥ã¡ã³ãã¯æ¹åãåæ ããã§ãããã ããããšãã
ç³ãèš³ãããŸããããETAã¯ãããŸããïŒ Coz ng4.0.0ãªãªãŒã¹ã§å©çšå¯èœã«ãªããšèããŸããããå©çšã§ããŸããã ããããšã
Cc @ocombe
ç§ãã¡ã¯ãŸã èšèšã«åãçµãã§ããŸããèæ
®ãã¹ãäºæããªãããšããããããããŸãïŒå³æžé€šãç¬èªã®ç¿»èš³ãåºè·ããæ¹æ³ãªã©ïŒã...
4.2ã§ã¯ãããæåŸ
ããŸãããä¿èšŒãããŠããŸããã
@ocombeã«æè¬ããŸãã2ã€ã®è³ªåããããŸãã
<span i18n>This is {{myValue}}</span>
Could not mark an element as translatable inside a translatable section
@istiti
<div i18n><span i18n>my text</span></div>
-ããã¯è¯ããããŸãã<div><span i18n>my text</span></div>
-ããã¯è¯ãããšã§ã@royiHalp
ããããšã
@istiti
<span i18n>This is {{myValue}}</span>
<source>This is <x id="INTERPOLATION"/></source>
<x id="INTERPOLATION"/>
ãæã®æ£ããå Žæã«é
眮ããŠãä»ã®äººãããªãã®æå³ãç解ã§ããããã«ããå¿
èŠããããŸãã次ã®ããã«i18nãã£ã¬ã¯ãã£ãã«èª¬æãè¿œå ã§ããŸãã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ïŒ
5.1ãŸãã¯5.2ïŒäºæããªããããã«ãŒããªãå ŽåïŒïŒ
5.xïŒ
ãããŠãéäžã§è¿œå ããããŸã 決å®ãããŠããªããã®ä»ã®ãã®ïŒ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å€æã®ãã€ã³ãã¯ãæå°éã§å¹ççãªããã°ã©ã ãäœæããããšã§ãã ãã®ãããåçå€æã®ã¢ãããŒãã¯ãŸã ååšããŠããŸããã
æååã®ç¿»èš³ã«ãã€ããã¯ã¹ãµãŒãã¹ã䜿çšããŠããªããšããæå³ã§ãçŸåšã®ã¢ãããŒãã¯æ¬åœã«è¯ããšç§ã¯åŒ·ãä¿¡ããŠããŸãã ã€ãŸããäžéšã®ããã¹ããéçã§ããããšãããã£ãŠããå Žåã¯ããµãŒãã¹ã䜿çšããã«ãã®ããã«ç¿»èš³ããŠãã ããã
åç翻蚳ã®åé¡ã¯åçŽã§ããã€ãŸããæååã衚瀺ãããã³ã«æååã翻蚳ããå Žåã§ãã æ¬åœã«è¯ãæ¹æ³ã§ã¯ãããŸããã
ãªãã§ïŒ
ç§ã®èŠ³ç¹ãããããšãå°æ¥ã®è§£æ±ºçã¯æ¬¡ã®ããã«ãªããŸãã
èããŠã¿ãŠãã ãããåçããã¹ãã衚瀺ããå Žåã¯ãããã¯ãšã³ãããåä¿¡ã§ããŸãããã®ãåçããã¹ããã®ã³ããŒãæ¬åœã«å¿ èŠãªå Žåã¯ããã€ã§ããã®ããã®ãã£ãã·ã¥ã䜿çšã§ããŸãã
ç§ã®æèŠã§ã¯ããã®åé¡ã«ã€ããŠããè°è«ããå¿ èŠã¯ãããŸããã å®éã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ã«åŸããŸãïŒãããããŒããããã§ãïŒããã©ã°ã®èåŸã«ãããããã¡ãžã£ãŒããŒãžã§ã³ããªãªãŒã¹ããå¿
èŠã¯ãªãããšã«ããäœãå£ããªãã¯ãã§ãïŒã
ç§ãã¡ãæéå ã«ããããªãªãŒã¹ããã®ã劚ããå¯èœæ§ããããã®ïŒ
- ã·ãã¢angularJSéçºè ãPascalPrechtã®ç¿»èš³ã©ã€ãã©ãªã3幎é䜿çšããŠããŸãã
- ããããããŸããã Angular2ã«ãŒããŒã çŽ æŽã«https://angular.io/guide/i18nãé²èŠ§ãã
- i18nãç§ã®å°éçãªãããžã§ã¯ãã«ããŸãçµ±åãã
- ããã³ããšã³ãã®ããŒãã³ãŒãããããã¹ãŠã®ã©ãã«ã1æ¥ãããŠãããã100 + kbã®xlfãã¡ã€ã«ã«ç§»æ€ããŸãã
- ngãµãŒãã¹å ã§çã®ã©ãã«ã翻蚳ããå¿ èŠãããå Žå
- ã°ãŒã°ã«ã§èª¿ã¹ãŠãããã«ãã
Angular6ãå€ããªãåã«è§£æ±ºçã¯ãããŸããã- me rn
@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ããŒããŒããããŸã-ããã¥ã¡ã³ãã®ãªã³ã¯ãåç §ããŠãã ããã
ããåçŽãªåé¡ãããã次ã®æ©èœïŒãŸãã¯@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ã§ãããè¡ãããšãã§ããªããšãç§ãã¡ã®ããã«ããã€ãã®ç°¡åãªããšãè¡ãããšãéåžžã«å°é£ã«ãªããŸãã
types
è¿ããŸãã ç§ãã¡ã®ã³ã³ããã¹ãã§ã¯ããããã®ãšã©ãŒãåçã«ããŒã«ã©ã€ãºããå¿
èŠãããããã³ãã¬ãŒãé§ååã®ã¢ãããŒãã¯æ±ãã«ããã§ãããã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 ãã©ã³ã¿ã€ã å€æãšåçå€æã®éããæ確ã«ããŠããã ããŸããïŒ
ããããå ¬åŒã®å®æŽŸã¯ãããŸããããç§ãèŠãŠããã®ã¯æ¬¡ã®ãšããã§ãã
éçºäžã®çŸåšã®ãããžã§ã¯ããžã®i18nãµããŒãã®è¿œå ã延æããŸãããããªãªãŒã¹ã«è¿ã¥ããŠããŸãããããAngular 7ã§æçµçãªãã®ã«ãªããã©ããã¯ããããŸãããïŒ ãŸãã¯ã翻蚳ãè¿œå ããä»ã®æ¹æ³ãæ€èšããå¿ èŠããããŸããïŒ
@ andrei-tatar i18nã¯ãAngular 2以éãå®å šã«æ©èœããŠããŸããå¯äžã®æ¬ ç¹ã¯æ¬¡ã®ãšããã§ãã
æåŸã®2ã€ã®ãã€ã³ãã«ã€ããŠã¯ã代ããã«@ ngx-translateã䜿çšã§ããŸãã ãã ããAngularã«çµã¿èŸŒãŸããŠããi18nãšã¯åäœãç°ãªããããåŸã®æŽæ°ã«ã¯æéããããå ŽåããããŸãã ããªãã£ã«ã®å ŽåãæŽæ°ã¯ããã«è¡ãããããããé倧ãªå€æŽã¯ãããŸããã
@ shobhit12345
ngSwitchã䜿çšããŠãã¹ãŠã®ã¡ãã»ãŒãžããã³ãã¬ãŒãåãããããi18nã¿ã°ãåå¥ã«ã¡ãã»ãŒãžã«æ·»ä»ã§ããŸãã
<div>
<ng-container [ngSwitch]="paymentMethod.historyOpned">
<ng-container *ngSwitchCase="true" i18n="@@hide">Hide</ng-container>
<ng-container *ngSwitchCase="false" i18n="@@show">Show</ng-container>
</ng-container>
<ng-container> <ng-container>
<ng-container i18n="@@history">History</ng-container>
</div>
äžè¶³ããŠããåçå€æãåé¿ããããã«ããã®æ¹æ³ãé »ç¹ã«äœ¿çšããŸãã å°ãèããŠã¿ããšãé©ãã¹ãéã®ããã¹ãããã®ããã«ãã³ãã¬ãŒãã§è¡šçŸã§ããŸãã äžè¬çãªãã¿ãŒã³ã¯ãã¡ãã»ãŒãžã®é åãäœæãããããngForããã³ngSwitchãšãšãã«äœ¿çšããŠã次ã®ããã«ã¡ãã»ãŒãžããã³ãã¬ãŒãåããããšã§ãã
ts
messsages = [ 'this is the first message', 'this is the second message' ]
````
html
`` `
ããåé·ã§ãããæ©èœããŸãã
ã©ããããããšããç§ã¯ã¢ã€ãã¢ãåŸãŸããã
2018幎8æ24æ¥éææ¥ã16ïŒ56 David Walther Birk Lauridsenã<
[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."
}
]]}];
å£æ»
çãª###ïŒ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}!
ã®ç¿»èš³ãæäŸã§ããããã«ãªããŸãã
ãããå©çšå¯èœã«ãªããŸããïŒææžåãããŠããªãå ŽåïŒã
æãåèã«ãªãã³ã¡ã³ã
ããã¯æ¬åœã®ã·ã§ãŒããããŒã ãšæããŸãããããå®è£ ããããŸã§ãi18nã¯äœ¿çšããæºåãã§ããŠããŸããã
ããšãã°ãã³ãŒãã§ç¿»èš³ãããæ€èšŒã¡ãã»ãŒãžãèšå®ã§ããŸãã