Accept-Languageに応じてユーザに提供する言語を変えることがあったので、Accept-Languageの重みづけを見て優先順位でソートされた言語リストを返す関数を作った。
汎用性がありそうなので備忘録がてらブログに書いておく。
こちらのサイトを参考にしました。
def sort_accept_language(accept_language):
languages = accept_language.split(",")
locale_q_pairs = []
for language in languages:
if language.split(";")[0] == language:
# no q => q = 1
locale_q_pairs.append({"locale": language.strip(), "q": 1})
else:
locale = language.split(";")[0].strip()
q = float(language.split(";")[1].split("=")[1])
locale_q_pairs.append({"locale": locale, "q": q})
sorted_locale_q_pairs = sorted(locale_q_pairs, key=lambda x: (x['q'],), reverse=True)
print(sorted_locale_q_pairs)
sorted_locale = [l["locale"] for l in sorted_locale_q_pairs]
print(sorted_locale)
return sorted_locale
実行結果
関数の引数を”ja,en-US;q=0.7,en;q=0.3″にした場合
[{'locale': 'ja', 'q': 1}, {'locale': 'en-US', 'q': 0.7}, {'locale': 'en', 'q': 0.3}]
['ja', 'en-US', 'en']