Angular JS:翻译包含大量文本的静态 html 页面

Angular JS: Translating static html pages with a lot of text

我目前正在本地化我的 Angular 站点,angular-translate 似乎是较小字符串的不错选择。但是我有一些页面包含很多静态 html 内容,例如 ToS 或关于页面,我真的不想塞进 JSON 文件(与 html 标签混合等)。

那么有没有办法使用 angular-translate(甚至没有那个模块)来保存部分视图中的内容(比如 /partials/tos-en.html)并交换它取决于语言?

您想要一种获取用户语言代码的方法。有了这个,您打算使用语言代码作为名称的一部分呈现部分内容。

Angular translate 模块有 2 个感兴趣的服务方法:

$translate.use() returns 用户的活动语言。不幸的是,如果您在语言加载到页面之前调用服务方法,您可能会得到 null。

$translate.proposedLanguage() returns "intended language" -- 表示您将调用 $translate.use() 的值,但即使语言尚未加载,此调用也会成功。有了这个 language codes 列表,您可以使用它们为您打算支持的语言创建部分。

类似

<div ng-include="about-{{ $translate.proposedLanguage() }}.html">
</div>

我建议沿着您突出显示的部分路径前进。翻译小块文本适用于菜单条目,但最终会笨拙地阅读整个文档。译者需要能够改变句子和段落结构等内容,以使其看起来自然。

为了实现这一点,我将使用 Apache's content negotiation (mod_negotiation)。您的 angular 代码仍然很简单,只需参考 /partials/tos.html。 Apache 然后根据需要提供 tos.html.en、tos.html.fr 或 tos.html.de 等。

设置内容协商确实需要使用 Apache 和编辑配置文件的能力,但学习起来并不复杂。我还建议按照说明启用首选语言 cookie,这允许您提供一种覆盖用户浏览器语言设置的语言选择机制。

为每种语言创建一个 HTML 部分。在您的控制器中收听 $translateChangeSuccess 事件,并在每次语言更改时为部分创建 URL 。比在 ngInclude 指令的视图中使用 URL。

V2 更好的方法

您的控制器

myApp.controller('MyCtrl', ['$rootScope', '$scope', '$translate', function ($rootScope, $scope, $translate) {
    ($scope.setTranslatedPartials = function () {
        $scope.translatedPartials = {
            "partialOne": "/partials/partial_one_" + $translate.use() + ".html",
            "partialTwo": "/partials/partial_two_" + $translate.use() + ".html"
            //...
        };
    })();

    $rootScope.$on("$translateChangeSuccess", function (event, next, current) {
        $scope.setTranslatedPartials();
    });
}]);

您的看法

<div ng-controller="MyCtrl">
    <ng-include src="translatedPartials.partialOne"></ng-include>
    <ng-include src="translatedPartials.partialTwo"></ng-include>
</div>

V1原创做法

您的控制器

myApp.controller('MyCtrl', ['$rootScope', '$scope', '$translate', function ($rootScope, $scope, $translate) {
    /*Initialize first so you have it when coming back to the page without the langugage changing*/
    $scope.partial = "/partials/" + $translate.use() + ".html"

    $rootScope.$on("$translateChangeSuccess", function (event, next, current) {
        $scope.partial = "/partials/" + $translate.use() + ".html"
    });
}]);

您的看法

<div ng-controller="MyCtrl">
    <ng-include src="partial"></ng-include>
</div>