2014-11-04 115 views
0

我知道Django在服务器端呈现模板。浏览器接收HTML内容,然后可以使用JavaScript来操作。Django模板 - 服务器端django标签的客户端操纵

我有一些JavaScript代码来操纵Django语言标记,这将难以维持其目前的形式,所以我想用更好的方式来编码它,但我想不出这样的方式和需要一些帮助。

这里是我的代码:

的dynamic_language_code是两个字母组成的代码,即:英语,法语,BG,RU,ES等

function dateCalculation(dynamic_language_code) { 

    var c = dynamic_language_code; 

    //arabic 
    if (dynamic_language_code == 'ar'){ 

     var_month = "{% language 'ar' %}{% trans 'month' %}{% endlanguage %}"; 
     var_months = "{% language 'ar' %}{% trans 'months' %}{% endlanguage %}"; 
     var_year = "{% language 'ar' %}{% trans 'year' %}{% endlanguage %}"; 
     var_years = "{% language 'ar' %}{% trans 'years' %}{% endlanguage %}"; 

    //bulgarian. 
    } else if (dynamic_language_code == 'bg'){ 

     var_month = "{% language 'bg' %}{% trans 'month' %}{% endlanguage %}"; 
     var_months = "{% language 'bg' %}{% trans 'months' %}{% endlanguage %}"; 
     var_year = "{% language 'bg' %}{% trans 'year' %}{% endlanguage %}"; 
     var_years = "{% language 'bg' %}{% trans 'years' %}{% endlanguage %}"; 

    } 
    ........ 
    many more else if conditions 
    ........ 
    //default value of English. 
    } else { 

     var_month = "{% language 'en' %}{% trans 'month' %}{% endlanguage %}"; 
     var_months = "{% language 'en' %}{% trans 'months' %}{% endlanguage %}"; 
     var_year = "{% language 'en' %}{% trans 'year' %}{% endlanguage %}"; 
     var_years = "{% language 'en' %}{% trans 'years' %}{% endlanguage %}"; 

    } 
} 

代码应该动态改变的语言月,年份根据传入的dynamic_language_code值。实际上应该不需要if else语句,只需使用传入的dynamic_language_code值来分配var_month,var_months,var_year和var_years值即可。

如何构造上面的代码以摆脱if else条件,并仍然使用传入的dynamic_language_code返回正确的语言版本?

编辑

我想摆脱的,如果其他条件,只是分配使用动态语言标签的变量的语言代码。不知道我该怎么做,或者即使这可以做到。例如:

var_month = "{% language dynamic_language_code %}{% trans 'month' %}{% endlanguage %}"; 
var_months = "{% language dynamic_language_code %}{% trans 'months' %}{% endlanguage %}"; 
var_year = "{% language dynamic_language_code %}{% trans 'year' %}{% endlanguage %}"; 
var_years = "{% language dynamic_language_code %}{% trans 'years' %}{% endlanguage %}"; 
+0

是否有任何理由必须使用JS来翻译单个文本?我认为一个好的设计是将实际的翻译工作留给模板系统,而​​JS或服务器视图只决定使用哪种语言。例如,在用户切换语言后,您可以刷新页面并通过请求标头将首选语言发送到服务器。服务器仅渲染首选语言的翻译文本。这[线程](http://stackoverflow.com/questions/2336785/set-language-within-a-django-view)谈到在Django方面的切换语言。 – ZZY 2014-11-04 08:19:37

+0

ZZY,我正在使用JavaScript来避免页面刷新。我肯定不希望刷新页面。在数据发送到数据库之前,JS用于动态显示timspan。 – user3354539 2014-11-04 08:26:32

回答

1

简短的回答是你不能那样做。

由于客户端/服务器端的关系。

尝试在您的项目中使用include,这种方式多次调用代码,但是在项目中只有一个代码引用。

希望能帮到你。

+0

实际上这不是真的,我能够通过我下面描述的指示来实现他的目标,但是我怀疑他甚至会努力去尝试。 – andrean 2014-12-27 07:11:00

-1

为了简化的JavaScript代码,你可以做简单的字符串替换,这样的:

function dateCalculation(dynamic_language_code) { 
    var lang = dynamic_language_code || 'en'; //handle default case 
    var_month = "{% language '<<lang>>' %}{% trans 'month' %}{% endlanguage %}".replace("<<lang>>", lang); 
    var_months = "{% language '<<lang>>' %}{% trans 'months' %}{% endlanguage %}".replace("<<lang>>", lang); 
    var_year = "{% language '<<lang>>' %}{% trans 'year' %}{% endlanguage %}".replace("<<lang>>", lang); 
    var_years = "{% language '<<lang>>' %}{% trans 'years' %}{% endlanguage %}".replace("<<lang>>", lang); 
} 

但是一个更好的问题是,你怎么能指望这个工作? Javascript是在用户浏览器内执行的,而Django模板引擎正在处理服务器端的这些标签。因此,当您的HTML到达浏览器时,您的所有模板语法已被替换为适当的内容,并且您使用JavaScript插入的任何其他标记将被视为常规字符串。

编辑:更新的代码来处理默认的英文情况。

EDIT2:好吧,我想我得到了它,我不明白你打算如何它的工作,所以在这里它是:

  1. 我想你已经在你的settings.py这个元组,如果不添加:

    LANGUAGES = (
        ('en', 'English'), 
        ('de', 'German'), 
        ('es', 'Spanish'), 
        ... 
        ... 
    ) 
    
  2. 确保您MIDDLEWARE_CLASSES包括'django.middleware.locale.LocaleMiddleware'

  3. 用一个函数来渲染你的模板,该函数会将RequestContext传递到你的模板上下文中,例如​​将会确实地完成这项工作。

  4. 这里是我用来展示它是如何工作的样本模板:

    {% load i18n %} 
    <html> 
        <head></head> 
        <body> 
         <script type="text/javascript"> 
         var languages = {% templatetag openbrace %}{% for lang in LANGUAGES %} 
          "{{ lang.0 }}": {% templatetag openbrace %} 
           "month": "{% language lang.0 %}{% trans 'month' %}{% endlanguage %}", 
           "months": "{% language lang.0 %}{% trans 'months' %}{% endlanguage %}", 
           "year": "{% language lang.0 %}{% trans 'year' %}{% endlanguage %}", 
           "years": "{% language lang.0 %}{% trans 'years' %}{% endlanguage %}", 
          {% templatetag closebrace %}{% if not forloop.last %},{% endif %} 
         {% endfor %}{% templatetag closebrace %}; 
    
         function dateCalculation(dynamic_language_code) { 
          var_month = languages[dynamic_language_code].month; 
          var_months = languages[dynamic_language_code].months; 
          var_year = languages[dynamic_language_code].year; 
          var_years = languages[dynamic_language_code].years; 
          console.log(var_month); 
          console.log(var_months); 
          console.log(var_year); 
          console.log(var_years); 
         } 
         dateCalculation('en'); 
         </script> 
        </body> 
    </html> 
    

这里会发生什么事是,在服务器端,我们预填充一个JavaScript对象与可用的语言代码为键和另一个对象,因为它的值包括4个子键:月,月,年和年。这些键中的每一个都将包含已经翻译过的单词,因此我们只需在对象内部进行查找,然后获取输出。这是由它输出呈现的HTML:

<html> 
     <head></head> 
     <body> 
      <script type="text/javascript"> 
      var languages = { 
       "en": { 
        "month": "month", 
        "months": "months", 
        "year": "year", 
        "years": "years", 
       }, 

       "de": { 
        "month": "Monat", 
        "months": "Monate", 
        "year": "Jahr", 
        "years": "Jahre", 
       }, 

       "es": { 
        "month": "mes", 
        "months": "meses", 
        "year": "año", 
        "years": "años", 
       }    
      }; 

      function dateCalculation(dynamic_language_code) { 
       var_month = languages[dynamic_language_code].month; 
       var_months = languages[dynamic_language_code].months; 
       var_year = languages[dynamic_language_code].year; 
       var_years = languages[dynamic_language_code].years; 
       console.log(var_month); 
       console.log(var_months); 
       console.log(var_year); 
       console.log(var_years); 
      } 
      dateCalculation('es'); 
      </script> 
     </body> 
    </html> 

而且在我的JavaScript控制台,我得到这个输出(因为我手动调用dateCalculation('es')):

mes 
meses 
año 
años 
+0

我认为user3354539将js代码嵌入到html中。他的服务器渲染代码中所有语言的翻译。然后在客户端,js函数选择使用哪个文本 – ZZY 2014-11-04 08:22:25

+0

andrean,我无法让这个替换代码工作!我在问题中提供的示例javascript确实有效,并且被触发以动态显示更改的语言中的日期时间范围。但是我需要让代码比现在更可靠。 – user3354539 2014-11-04 08:24:43

+0

@ user3354539:我测试了代码,因为它粘贴在这里,当我'console.log'变量时,我得到正确的输出。检查你是否正确复制了它,或者如果你另外修改了它,请确保你没有引入其他问题。 – andrean 2014-11-04 08:43:31

0

为了避免页面清爽,你可以把译文在JSON文件中,如{"en":{"month":"xxx","months":"xxx"}, "ar":{}}。使用AJAX即时获取文件。或者把翻译放在一个专用的JS文件中。或者检出Django文档https://docs.djangoproject.com/en/dev/topics/i18n/translation/#internationalization-in-javascript-code

+0

ZZY,这仍然会给我提供难以维护的代码。如果我在我的项目中添加语言,我将不得不添加到您的建议代码中。 – user3354539 2014-11-04 22:14:22