2017-01-21 5 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(",") 

Одна особенность в том, что браузеры обеспечивают локаль с дефисом и строчными буквами («фр-фр»), но Бабель ожидает, подчеркивание и смешанные case (fr_FR). В случае, если браузер предоставляет локализованный заголовок только «FR-FR», следующее:

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

будет в конечном итоге, используя язык по умолчанию, а не французской, потому что Бабель ищет «fr_FR». Должен ли я взять локаль из заголовка и преобразовать дефис в знак подчеркивания и в нижний регистр в смешанный регистр? Кажется, что Вавилон должен сделать это для меня.

(я знаю, что заголовок может иметь несколько локалей и что я должен проверить их все, но я по-прежнему необходимо выполнить преобразование для каждого из них.)

ответ

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-адреса.

Что касается разных форматов языка (браузеры против Babel), кажется, вам просто нужно преобразовать себя. У этого 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 ")' выберет файл «po» в каталоге 'fr_FR'. –

+1

@DacSaunders, хотя, так как я написал этот ответ, у меня есть лучшее понимание того, как реализовать локальное обнаружение, и я напишу лучший ответ позже. –

Смежные вопросы