如何处理DjangoCMS i18n网址(/ en / my_page,/ fr / my_page ...)和AngularJS?

时间:2016-02-19 18:39:17

标签: javascript angularjs django internationalization django-cms

我正在尝试学习AngularJS和DjangoCMS,所以我一起创建了一个新项目。

状态

默认情况下,DjangoCMS使用第一个URL段来确定站点的语言(/ en /,/ fr /)。默认情况下,每个不包含语言段的URL都会重定向到/ en /。

这意味着,我的所有AngularJS ajax调用都需要发送到/ en / api /或/ fr / api /。

问题

  1. 我想使用第一段来确定Angular中用于国际化的语言。

  2. 还将全局第一段设置为我的AngularJS应用程序,因此我不需要在每次ajax调用时指定它。

  3. 可能的解决方案

    我找到的一个解决方案是在Django端为每种语言使用不同的模板。

    • 英文模板<base href="/en/">标记中会有<head>
    • 法语模板在<base href="/fr/">标记中会有<head>,我可以使用预先捆绑的规则集,也可以只将本地脚本添加到脚本列表(https://docs.angularjs.org/guide/i18n)。

    我想这对更多语言也有用,但这意味着我必须为每种语言创建一个特定的模板和代码。

    最佳解决方案?

    我认为最好的方法是在Angular应用程序中定义一个逻辑,根据第一个url段加载语言脚本,并在应用程序中全局确定第一个段。我们将避免为每种语言编写代码。 这个解决方案可行吗?我在Angular上动态设置了一个基本网址,但我没有找到任何有趣的结果。

    我不确定问题应该在StackOverflow上,但我真的不知道其他堆栈交换论坛。

    谢谢!

1 个答案:

答案 0 :(得分:0)

我会做这样的事情:

  1. 加载i18n模板标记:{% load i18n %}并设置<base href="">,如下所示: {% get_current_language as LANGUAGE_CODE %} <base href="/{{ LANGUAGE_CODE }}/" />
  2. 当你有如上所述的基础集时,你可以使用$ provide来获取href值并将其公开给服务和指令。例如: angular.module("myapp.services", []) .config(["$provide", function ($provide) { $provide.value("base", $("base").attr("href")); }]); 并将其注入一个进行ajax调用的服务: angular.module("myapp.services").factory("myService", ["base", function (base) { var uri = base + "api/some_url"; ...