Недавно я добавил 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». Должен ли я взять локаль из заголовка и преобразовать дефис в знак подчеркивания и в нижний регистр в смешанный регистр? Кажется, что Вавилон должен сделать это для меня.
(я знаю, что заголовок может иметь несколько локалей и что я должен проверить их все, но я по-прежнему необходимо выполнить преобразование для каждого из них.)
Это работало? Если вы используете файлы '.po' и' .mo', они обычно загружаются именами файлов, соответствующими именам локалей. На данный момент я тоже должен был сделать некоторые трюки, чтобы добиться локализации, такой же, как и сгенерированный контент (поэтому я установил его, а не следуя заголовкам http). Кажется, что бабелевские локализации могут наследовать язык, так что на диалекте, который вы не локализировали, используется предок (например, локализация en-gb по умолчанию может быть en), так что вы начинаете с языка (en), а затем задаете конкретные диалекты только то, что диалекты (или национальные варианты) расходятся с предком. –
@DacSaunders, да, это действительно работает. Например, у меня есть 'locale/fr_FR/LC_MESSAGES/messages.po', и когда я извлекаю локаль из заголовков HTTP, я извлекаю только первые две буквы (например,' fr') и вызывая 'set_locale (" fr ")' выберет файл «po» в каталоге 'fr_FR'. –
@DacSaunders, хотя, так как я написал этот ответ, у меня есть лучшее понимание того, как реализовать локальное обнаружение, и я напишу лучший ответ позже. –