I18n with Angular JS (jlg-i18n) - 日期和货币过滤器不起作用(动态更改 $Locale)

I18n with Angular JS (jlg-i18n) - Date and currency filters aren't working ( changing $Locale Dynamically)

我正在尝试使用 jlg-i18n 来国际化我的 code.The 问题是字符串已翻译但日期和货币没有!

{{date | date}} 和 {{price | currency}} 似乎有效。

它保持默认语言环境(最先加载的语言环境)

有什么想法吗?有人遇到过这个错误吗?

这是 Github

上的模块

还有我的代码:

<html ng-app="ShoppingList">
<head>
<meta charset="utf-8">
<title>Shopping List</title>
<link rel="stylesheet" type="text/css" href="lib/bootstrap/bootstrap.css">
<style>
    .jumbotron {
        width: 400px;
        text-align: center;
        margin-top: 20px;
        margin-left: auto;
        margin-right: auto;
    }
    .table {
        margin-top: 20px;
    }
    .form-control {
        margin-bottom: 5px;
    }
    .selecionado {
        background-color: yellow;
    }
    .negrito {
        font-weight: bold;
    }
</style>
<script src="lib/angular/angular.js"></script>

<!-- Arquivo de localização referente ao país -->
<script id="locale" src="lib/angular/angular-locale_pt-br.js"></script>

<!--<script src="lib/angular/angular-locale_en-us.js"></script>-->

<!--<script src="lib/angular/angular-locale_fr-fr.js"></script>-->

<!--Caminho do módulo jlg-i18n-->
<script src="bower_components/jlg-i18n/jlg-i18n.min.js"></script>

<script src="bower_components/jquery/dist/jquery.min.js"></script>





<script>
    //Adiciona o módulo ['jlgI18n'] ao módulo Shopping list
    var app = angular.module("ShoppingList",['jlgI18n']);

    //É necessário adicionar ao controlador os serviços '$locale', 'jlgI18nService',
    app.controller("shoppingListCtrl", ['$scope', '$locale', 'jlgI18nService',
        function ($scope, $locale, i18nService) {

            $scope.date = new Date();
        $scope.app = "Shopping list";
        $scope.list = [
            {name: "Chocolate", price: 4.50, date: new Date()},
            {name: "Cookies", price: 3.00, date: new Date()},
            {name: "Potatoes", price: 5.00, date: new Date()}
        ];

        $scope.adicionarContato = function (contato) {
            $scope.contatos.push(angular.copy(contato));
            delete $scope.contato;
        };
        $scope.apagarContatos = function (contatos) {
            $scope.contatos = contatos.filter(function (contato) {
                if (!contato.selecionado) return contato;
            });
        };
        $scope.isContatoSelecionado = function (contatos) {
            return contatos.some(function (contato) {
                return contato.selecionado;
            });
        };

        //Variável que define a localização
        $scope.locale = $locale;

        //Função que altera a localização de acordo com o usuário
        $scope.changeLocale = i18nService.changeLocale;

    }]);

    //Configura o módulo
    app.config(['jlgI18nServiceProvider', function(jlgI18nServiceProvider) {
        jlgI18nServiceProvider.localeDir('../locale');

    }]);


</script>

<div class="jumbotron">

    <h2>{{app | i18n}}</h2>

    <table ng-show="list.length > 0" class="table">
        <tr>
            <th>{{'Name' | i18n}}</th>
            <th>{{'Price' | i18n}}</th>
            <th>{{'Date' | i18n}}</th>
        </tr>

        <tr ng-repeat="product in list">
            <td>{{product.name | i18n}}</td>
            <td>{{product.price | currency}}</td>
            <td>{{product.date | date }} </td>
        </tr>


        {{date | date:'fullDate'}}

    <p>{{'Locale' | i18n}}: {{locale.id}}</p>
    <div>

        <label ng-repeat="id in ['en-us', 'pt-br', 'fr-fr']">
                <input name="locale_id" type="radio"
                ng-click="changeLocale(id)"
                ng-checked="{{locale.id == id}}"/>
                {{id}}
        </label>
    </div>




</div>

我的代码是一段非常简单的代码,所以我几乎可以肯定问题出在它身上 感谢您的帮助和建议!

我对这个问题很失望,因为从 angular 的 i18n 模块来看,这是最简单的一个!!

更新

我已经知道出了什么问题,我没有在这里更新语言环境的目录

    app.config(['jlgI18nServiceProvider', function(jlgI18nServiceProvider) {
        jlgI18nServiceProvider.localeDir('../locale');

    }]);

但奇怪的是,它只解决了日期问题,货币仍然不起作用:/

更新 2

我弄明白了为什么 jlg-i18n 不适用于货币或数字过滤器!这不是模块的问题,而是 angular 本身的问题。发生的事情是货币和数字的功能是从加载的第一个区域设置缓存的,因此当您更改区域设置时它不会生效。日期有效,因为此功能未存储在缓存中! angular js development 中有注释,用于在未来的版本中修复此问题!我找到了一个动态更改语言环境的模块,但这对我来说不是正确的解决方案。

建议的方法之一,我选择的方法是重写货币和数字的 angular 函数!

希望对大家有所帮助! :)

Link到AngularJS上的问题github的问题:https://github.com/angular/angular.js/issues/9159

解决方案

我明白了为什么 JS-i18n 不适用于货币或数字过滤器!这不是模块的问题,而是 angular 本身的问题。发生的事情是货币和数字的功能是从加载的第一个区域设置缓存的,因此当您更改区域设置时它不会生效。日期有效,因为此功能未存储在缓存中! angular js development 上有注释,用于在未来的版本中修复此问题!我找到了一个用于动态更改语言环境的模块,它也解决了这个问题,但对我来说不是正确的解决方案。

建议的方法之一,我选择的方法是重写货币和数字的 angular 函数!

我知道这是一个临时修复,而 Angular 的团队没有解决这个问题,你也应该

希望对大家有所帮助! :)

如果有人想使用我的解决方案,我可以在 github 上找到它(这对学校来说是一个非常简单的项目,所以很容易理解正在做什么): https://github.com/michellebionico/i18n-with-Angular-JS

Link关于AngularJS github问题的问题:https://github.com/angular/angular.js/issues/9159