2014-11-04 5 views
0

장고는 서버 측에서 템플릿을 렌더링한다는 것을 알고 있습니다. 브라우저는 HTML 컨텐트를 수신하고 JavaScript를 사용하여 조작 할 수 있습니다.장고 템플릿 - 서버 측 장고 태그의 클라이언트 측 조작

Django 언어 태그를 조작하기위한 JavaScript 코드가 현재 양식에서 유지하기가 어려우므로 더 좋은 방법으로 코드를 작성하려고하지만 이러한 방식과 필요성을 생각할 수 없습니다. 도움. 코드는 동적 언어를 변경해야합니다

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 %}"; 

    } 
} 

EN, FR, BG, RU, ES 등 :

dynamic_language_code은 2 개 문자 코드는 예입니다 : 여기

내 코드입니다 month, 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) 장고 측면에서 스위치 언어에 대해 이야기합니다. – ZZY

+0

ZZY, 페이지 새로 고침을 피하기 위해 JavaScript를 사용하고 있습니다. 페이지 새로 고침을 원하지 않습니다. JS는 데이터가 데이터베이스로 보내지기 전에 timspan을 동적으로 표시하는 데 사용됩니다. – user3354539

답변

1

짧은 대답은 할 수 없다는 것입니다.

클라이언트 측/서버 측 관계로 인해.

프로젝트에 include를 사용하면 코드가 여러 번 호출되지만 프로젝트의 코드에 대한 참조는 하나만 있습니다. 당신을 도와줍니다

희망.

+0

실제로 사실이 아니기 때문에 아래에 설명 된 지침에 따라 목표를 달성 할 수 있었지만 시도를하기 위해 노력한 것조차 의심 스럽습니다. – andrean

-1

는 자바 스크립트 코드를 단순화하기 위해, 당신은 간단한 문자열 교체, 같은 것을 할 수있는 :

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); 
} 

을하지만 더 문제는, 당신은 어떻게이 일을 기대합니까? 자바 스크립트는 사용자 브라우저 내에서 실행되지만 Django 템플릿 엔진은 서버 측에서 이러한 태그를 처리합니다. 따라서 HTML이 브라우저에 도착할 때까지 모든 템플릿 구문이 이미 적절한 내용으로 바뀌고 javascript로 삽입하는 추가 태그는 일반 문자열처럼 취급됩니다.

EDIT : 기본 영어 대소 문자를 처리하는 코드가 업데이트되었습니다.

EDIT2는 :

  1. 나는 이미 당신을 생각하여 settings.py이에있다 : 좋아, 난 당신이 작동하도록 구성하는 방법, 내가 지금 여기있다, 이해하지 못했다 거 같아요 튜플, 그렇지 않으면 것은 추가 :

    LANGUAGES = (
        ('en', 'English'), 
        ('de', 'German'), 
        ('es', 'Spanish'), 
        ... 
        ... 
    ) 
    
  2. 하는 MIDDLEWARE_CLASSES 포함하여 확인 'django.middleware.locale.LocaleMiddleware'

  3. RequestContext을 템플릿 컨텍스트로 전달하는 함수로 템플릿을 렌더링하십시오. 예를 들어 django.shortcuts.render이 작업을 확실하게 수행합니다.여기에 어떻게됩니까

    {% 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> 
    

은 서버 측에, 우리는 가능한 언어 코드 등과 자바 스크립트 객체를 미리 채우는 것을 : 여기

  • 내가 어떻게 작동하는지 설명하는 데 사용되는 샘플 템플릿입니다 키 및 다른 개체를 값으로 사용합니다. 여기에는 4 개의 하위 키가 포함됩니다 (월, 월, 년 및 년). 이들 각각의 키는 이미 번역 된 단어를 포함 할 것이므로 객체 내부에서 조회를 수행하고 결과를 얻습니다. (I 수동 dateCalculation('es')를 호출하기 때문에)
    <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> 
    

    그리고 내 자바 스크립트 콘솔에서

    , 나는이 출력을 가지고 : 이것은 그것에서 렌더링 된 HTML 출력입니다 상쾌한 페이지를 방지하기 위해

    mes 
    meses 
    año 
    años 
    
  • +0

    나는 user3354539가 html로 js 코드를 삽입했다고 생각한다. 그의 서버는 코드에서 모든 언어의 번역을 렌더링합니다. 그런 다음 클라이언트 측에서 js 함수는 사용할 텍스트를 선택합니다. – ZZY

    +0

    andrean,이 코드를 바꿀 수 없습니다! 질문에서 제공 한 예제 자바 스크립트가 작동하고 변경된 언어로 날짜 시간대를 동적으로 표시하도록 트리거됩니다. 하지만 코드를 현재보다 더 maintanable해야합니다. – user3354539

    +0

    @ user3354539 : 변수를'console.log' 할 때 여기에 붙여 넣기 때문에 코드를 테스트했습니다. 올바른 결과를 얻었습니다. 제대로 복사했는지 확인하거나 추가로 수정 한 경우 다른 문제가 있는지 확인하십시오. – andrean

    0

    , 당신은 번역을 넣을 수 있습니다 {"en":{"month":"xxx","months":"xxx"}, "ar":{}}과 같은 JSON 파일에서 AJAX를 사용하여 즉시 파일을 가져올 수 있습니다. 또는 전용 JS 파일에 번역을 넣으십시오. 또는 장고 의사 https://docs.djangoproject.com/en/dev/topics/i18n/translation/#internationalization-in-javascript-code을 확인하십시오.

    +0

    ZZY,이 코드는 여전히 유지 관리가 어려운 코드로 표시됩니다. 프로젝트에 언어를 추가하면 제안 된 코드에 추가해야합니다. – user3354539

    관련 문제