2017-01-21 8 views
2

최근 Babel을 GAE/webapp2 사이트에 추가했는데 작동하지만, 로캘을 가져 오는 올바른 방법에 대해 혼란스러워합니다.Babel 및 webapp2 로케일 결정

answer에서 그는 self.request.get('locale', 'es_ES')으로 로케일을 가져 오지만 이것은 URL에 ?locale=fr_FR과 같은 것이 있으면 작동하는 것 같습니다. 나는 누구도 URL에 로케일을 설정하는 것을 본 적이 없다. URL에서 로케일을 가져올만한 이유가 있습니까? 헤더에서 로케일을 얻기

더 이해하게 해주는 것 같다

self.request.headers.get('Accept-Language').split(",") 

하나의 특질은 브라우저 하이픈와 소문자 ("FR-FR")로 로케일을 제공하지만 바벨은 밑줄 및 혼합을 기대하고 있다는 것입니다 케이스 (fr_FR). 브라우저는 "FR-FR"의 로케일 헤더를 제공하는 경우, 다음

locale = self.request.headers.get('Accept-Language').split(",")[0] 
i18n.get_i18n().set_locale(locale) 

바벨은 "fr_FR의"를 찾고 있기 때문에 오히려 프랑스어보다 기본 언어를 사용하여 종료됩니다. 헤더에서 로케일을 가져와 하이픈을 밑줄로 변환하고 소문자를 대소 문자로 변환해야합니까? 바벨이 나를 위해 그렇게해야한다고 봅니다.

는 (I 헤더가 여러 로케일을 가지고 있고 그들 모두를 확인해야한다고 수 있다는 것을 알고 있지만, 나는 아직도 각각의 변환을 수행해야 할 것입니다.)

답변

0

나는 이런 식으로 내 코드에서 로케일을 설정합니다.

def dispatch(self): 
    # Get a session store for this request. 
    self.session_store = sessions.get_store(request=self.request) 
    if self.request.host.find('.br') > 0: 
     i18n.get_i18n().set_locale('pt-br') 
    elif self.request.host.find('klok') > 0: 
     i18n.get_i18n().set_locale('sv') 
    elif self.request.host.find('business') > 0: 
     i18n.get_i18n().set_locale('en') 
    else: 
     lang_code_get = self.request.get('hl', None) 
     if lang_code_get is None: 
      lang_code = self.session.get('HTTP_ACCEPT_LANGUAGE', None) 
      lang_code_browser = os.environ.get('HTTP_ACCEPT_LANGUAGE') 
      if lang_code: 
       i18n.get_i18n().set_locale(lang_code) 
      if lang_code_browser and lang_code is None: 
       self.session['HTTP_ACCEPT_LANGUAGE'] = lang_code_browser 
       i18n.get_i18n().set_locale(lang_code_browser) 
     else: 
      i18n.get_i18n().set_locale(lang_code_get) 
    try: 
     # Dispatch the request. 
     #logging.info('trying to dispatch') 
     webapp2.RequestHandler.dispatch(self) 
    except Exception, ex: 
     logging.error(ex) 
     self.error(404) 
    finally: 
     # Save all sessions. 
     self.session_store.save_sessions(self.response) 
1

나는 질문을 한 이래로 내가 한 연구를 바탕으로 답을 제공 할 것입니다.

사용자가 언어를 변경하도록 허용하는 링크를 제공하는 경우 URL에 로케트를 넣는 것이 좋은 해결책 인 것 같습니다. 필자의 경우 로케일 자동 감지에만 관심이 있으므로 URL에서 로케일을 가져 오지 않도록 구현할 것입니다.

다양한 로캘 형식 (브라우저와 바벨)에 대해서는 사용자가 직접 변환해야하는 것으로 보입니다. 이 answer에는 좋은 제안이 있습니다.

필자가 다른 언어로 여러 언어를 구현할 가능성은 거의 없습니다 (예 : fr_FR을 구현하지만 다른 어떤 fr_은 구현하지 않음). 로케일의 처음 두 글자를 가져다가 나머지를 버리면 옵션이 훨씬 간단 해집니다.

+0

작동 했습니까? '.po'와'.mo' 파일을 사용하면 보통 로케일 이름에 해당하는 파일 이름으로로드됩니다. 당분간 나는 생성 된 컨텐트와 같은 지역화를 달성하기위한 트릭을해야만한다. (따라서 나는 http 헤더를 따르기보다는 그것을 설정한다.) 바벨 지역화가 언어를 상속 할 수 있으므로 현지화하지 않은 방언이 조상을 사용합니다 (예 : en-gb 현지화가 en으로 기본 설정 될 수 있음). 그러면 언어 (en)로 시작한 다음 특정 방언으로 조상과 방언 (또는 국가 변종)이 다른 것만 다릅니다. –

+1

@DacSaunders, 네, 작동합니다. 예를 들어,'locale/fr_FR/LC_MESSAGES/messages.po'가 있는데, HTTP 헤더에서 로케일을 추출하면 처음 두 글자 (예 :'fr') 만 추출하고'set_locale ("fr")' fr_FR' 디렉토리 아래에 "po"파일을 가져옵니다. –

+1

@DacSaunders이 답변을 작성한 이후로 로케일 감지를 구현하는 방법을 더 잘 이해하고 나중에 더 나은 대답을 작성하겠습니다. –