Я использую Dart для создания приложения Polymer. Поскольку я использую возможности интернационализации Дарта в составе элементов Polymer, я хочу инициализировать сообщения о интернационализации до создания элемента Polymer и отображать соответствующие сообщения для данного языка в элементе Polymer.Как инициализировать интернационализацию для полимерного элемента перед его загрузкой Page
Как это можно сделать? Кто-нибудь успешно использовал Полимер с интернационализацией?
ps. Я последовал за this example, чтобы настроить интернационализацию
Ниже приведено по умолчанию приложение Polymer от Dart Editor плюс добавленный мной код.
messages_en.dart
library messages_en;
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
class MessageLookup extends MessageLookupByLibrary {
get localeName => 'en';
final messages = {
"myMsg" :() => Intl.message("MY MESSAGE")
};
}
messages_all.dart
library messages_all;
import'dart:async';
import 'package:intl/message_lookup_by_library.dart';
import 'package:intl/src/intl_helpers.dart';
import 'package:intl/intl.dart';
import 'messages_en.dart' as en;
MessageLookupByLibrary _findExact(localeName) {
switch (localeName) {
case 'en': return en.messages;
default: return null;
}
}
initializeMessages(localeName) {
initializeInternalMessageLookup(() => new CompositeMessageLookup());
messageLookup.addLocale(localeName, _findGeneratedMessagesFor);
return new Future.value();
}
MessageLookupByLibrary _findGeneratedMessagesFor(locale) {
var actualLocale = Intl.verifiedLocale(locale, (x) => _findExact(x) != null);
if (actualLocale == null) return null;
return _findExact(actualLocale);
}
clickcounter.dart
import 'package:polymer/polymer.dart';
import 'package:intl/intl.dart';
import 'dart:async';
import 'messages_all.dart';
import 'messages_en.dart' as en;
/**
* A Polymer click counter element.
*/
@CustomTag('click-counter')
class ClickCounter extends PolymerElement {
@published int count = 0;
@observable var messagesLoaded = false;
ClickCounter.created() : super.created() {
var enMessagesFuture = initializeMessages('en');
Future.wait([enMessagesFuture]).then((_) => messagesLoaded = true);
}
void increment() {
count++;
}
}
clickcounter.html
<polymer-element name="click-counter" attributes="count">
<template>
<style>
div {
font-size: 24pt;
text-align: center;
margin-top: 140px;
}
button {
font-size: 24pt;
margin-bottom: 20px;
}
</style>
<div>
<button on-click="{{increment}}">Click me</button><br>
<span>(click count: {{count}})</span>
<br>
<br>
<span>current locale: {{Intl.getCurrentLocale()}}</span>
<br>
<br>
<template if="{{messagesLoaded}}">
<span>intl message: {{How can I extract myMsg here?}}</span>
</template>
</div>
</template>
<script type="application/dart" src="clickcounter.dart"></script>
</polymer-element>
Привет, Алан, я добавил свой код выше. У меня есть пара вопросов: 1) 'Intl.getCurrentLocale()' ничего не печатает; нужна ли интернационализация дополнительной инициализации? 2) Как напечатать интернационализированную строку 'myMsg' в' clickcounter.html'? – Peter
Intl.getCurrentLocale() и Intl.defaultLocal return 'en_US' для меня, используя предоставленный вами код. В отладчике, а не в HTML, мне еще нужно это попробовать. –
@Alan Knight Надеюсь, вы не возражаете, что я добавлю ссылку для примера интернационализации/локализации, представленную здесь в группе Dart: https://codereview.chromium.org/105073003 –