Skip to content

Instantly share code, notes, and snippets.

@nenkoru
Created October 18, 2021 18:55
Show Gist options
  • Save nenkoru/67c5fec156dff8639ed436f331350a52 to your computer and use it in GitHub Desktop.
Save nenkoru/67c5fec156dff8639ed436f331350a52 to your computer and use it in GitHub Desktop.
Function to convert language list to accept-languages headers
import re
from typing import List
import operator
import decimal
# computers can't do precise operations with floating point, which is causing us to use Decimal
def float_range(start, stop, step=0.1):
comparison_operator = operator.gt if step > 0 else operator.lt
start, step = decimal.Decimal(start), decimal.Decimal(str(step))
while not comparison_operator(start, stop):
yield start
start += step
# example input: en-US, es-US, haw, fr
# example output: en-US, en;q=0.9, es-US;q=0.8, es;q=0.7, haw;q=0.5, fr;0.4
def get_accept_language_header_from_languages(languages: List[str]) -> str:
acc_languages = []
re_language = re.compile(r"([a-z]{1,8})-[A-z]{1,8}")
for language in languages:
acc_languages.append(language)
try:
acc_languages.append(re_language.search(language).group(1))
except AttributeError:
pass
_zip = zip(acc_languages, float_range(1.0, 0.1, -0.1))
language_headers = ",".join("{0};q={1}".format(language, priority) for language, priority in _zip)
return language_headers.replace(";q=1", "")
if __name__ == "__main__":
print(get_accept_language_header_from_languages(["en-US", "es-US", "haw", "fr",]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment