我正在开发基于 Angular JS 的 Phonegap 应用程序。我在 Angular JS 中找到了 I18N 的 2 个选项:
1) https://github.com/gertn/ng-i18n
2) http://angularjs.de/artikel/angularjs-i18n-ng-translate
它们都非常“相似”:有将被翻译的占位符(表达式)。
所以我的问题是:如何在角度服务(而不是表达式/占位符)内的通知警报中翻译纯文本?
我正在开发基于 Angular JS 的 Phonegap 应用程序。我在 Angular JS 中找到了 I18N 的 2 个选项:
1) https://github.com/gertn/ng-i18n
2) http://angularjs.de/artikel/angularjs-i18n-ng-translate
它们都非常“相似”:有将被翻译的占位符(表达式)。
所以我的问题是:如何在角度服务(而不是表达式/占位符)内的通知警报中翻译纯文本?
angular-translate让您可以直接使用他们的$translate 服务。以下是他们文档中的示例代码。
var translations = {
HEADLINE: 'What an awesome module!',
PARAGRAPH: 'Srsly!',
NAMESPACE: {
PARAGRAPH: 'And it comes with awesome features!'
}
};
var app = angular.module('myApp', ['pascalprecht.translate']);
app.config(['$translateProvider', function ($translateProvider) {
// add translation table
$translateProvider.translations(translations);
}]);
app.controller('Ctrl', ['$scope', '$translate', function ($scope, $translate) {
// expose translation via `$translate` service
$scope.headline = $translate('HEADLINE');
$scope.paragraph = $translate('PARAGRAPH');
$scope.namespaced_paragraph = $translate('NAMESPACE.PARAGRAPH');
}]);
您的“纯”文本始终是具体的翻译。因此,如果您想将 i18n 带到您的通知中,您的通知必须使用可以由翻译服务翻译的翻译 ID(如果您使用angular-translate
例如)。
特别是,当使用 angular-translate 时,您实际上可以简单地将具体文本传递给翻译组件(服务、过滤器指令)。如果您的翻译表中没有看起来像传递的值(在您的情况下为具体文本)的翻译 id,它将返回该字符串,因此这也将起作用。
<ANY translate="{{notificationFromService}}"></ANY>
如果您对角度翻译还有任何疑问,请让我知道!
你可以看看 jlg-i18n github 项目:https ://github.com/jlguenego/jlg-i18n
附加值是:
1)在其他解决方案中没有 UPPERCASE_TAG 。相反,您直接将文本放在原始语言中。因此,如果没有找到翻译,则打印原始字符串并且降级不是全部。i18n
带过滤器的角度表达式示例:
{{'How are you doing?' | i18n}}
2)有一个插值/复数功能。
{{'You have [[nbr]] message(s) and [[err]] error(s)' | i18n:4:0 }}
输出:
You have 4 messages and no error.
您可以查看 ui-i18n https://github.com/angular-ui/ui-utils/pull/173,性能优于 angular-translate 并且重量更轻,语法更简单 imo。
干杯,蒂姆·斯威特
I know @Kevin has already answered ur question, but you can also do something like this using '$filter'.
var translations = {
HEADLINE: 'What an awesome module!',
PARAGRAPH: 'Srsly!',
NAMESPACE: {
PARAGRAPH: 'And it comes with awesome features!'
}
};
var app = angular.module('myApp', ['pascalprecht.translate']);
app.config(['$translateProvider', function ($translateProvider) {
// add translation table
$translateProvider.translations(translations);
}]);
app.controller('Ctrl', ['$scope', '$filter', function ($scope, $filter) {
$scope.headline = $filter('translate')("HEADLINE");
$scope.paragraph = $filter('translate')("PARAGRAPH");
$scope.namespaced_paragraph = $filter('translate')("NAMESPACE.PARAGRAPH");
}]);
and pass the scope variables to the alert you want to show.
and i think with this approach you don't have to pass your each and every filter(if at all more than one) to the controller and achieve the same result.