Files
zulip/zerver/lib/i18n.py
Anders Kaseorg 365fe0b3d5 python: Sort imports with isort.
Fixes #2665.

Regenerated by tabbott with `lint --fix` after a rebase and change in
parameters.

Note from tabbott: In a few cases, this converts technical debt in the
form of unsorted imports into different technical debt in the form of
our largest files having very long, ugly import sequences at the
start.  I expect this change will increase pressure for us to split
those files, which isn't a bad thing.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2020-06-11 16:45:32 -07:00

96 lines
3.1 KiB
Python

import logging
import operator
import os
from itertools import zip_longest
from typing import Any, Dict, List
import ujson
from django.conf import settings
from django.utils import translation
from django.utils.lru_cache import lru_cache
from django.utils.translation import ugettext as _
def with_language(string: str, language: str) -> str:
"""
This is an expensive function. If you are using it in a loop, it will
make your code slow.
"""
old_language = translation.get_language()
translation.activate(language)
result = _(string)
translation.activate(old_language)
return result
@lru_cache()
def get_language_list() -> List[Dict[str, Any]]:
path = os.path.join(settings.DEPLOY_ROOT, 'locale', 'language_name_map.json')
with open(path) as reader:
languages = ujson.load(reader)
return languages['name_map']
def get_language_list_for_templates(default_language: str) -> List[Dict[str, Dict[str, str]]]:
language_list = [lang for lang in get_language_list()
if 'percent_translated' not in lang or
lang['percent_translated'] >= 5.]
formatted_list = []
lang_len = len(language_list)
firsts_end = (lang_len // 2) + operator.mod(lang_len, 2)
firsts = list(range(0, firsts_end))
seconds = list(range(firsts_end, lang_len))
assert len(firsts) + len(seconds) == lang_len
for row in zip_longest(firsts, seconds):
item = {}
for position, ind in zip(['first', 'second'], row):
if ind is None:
continue
lang = language_list[ind]
percent = name = lang['name']
if 'percent_translated' in lang:
percent = "{} ({}%)".format(name, lang['percent_translated'])
selected = False
if default_language in (lang['code'], lang['locale']):
selected = True
item[position] = {
'name': name,
'code': lang['code'],
'percent': percent,
'selected': selected,
}
formatted_list.append(item)
return formatted_list
def get_language_name(code: str) -> str:
for lang in get_language_list():
if code in (lang['code'], lang['locale']):
return lang['name']
# Log problem, but still return a name
logging.error("Unknown language code '%s'", code)
return "Unknown"
def get_available_language_codes() -> List[str]:
language_list = get_language_list()
codes = [language['code'] for language in language_list]
return codes
def get_language_translation_data(language: str) -> Dict[str, str]:
if language == 'zh-hans':
language = 'zh_Hans'
elif language == 'zh-hant':
language = 'zh_Hant'
elif language == 'id-id':
language = 'id_ID'
path = os.path.join(settings.DEPLOY_ROOT, 'locale', language, 'translations.json')
try:
with open(path) as reader:
return ujson.load(reader)
except FileNotFoundError:
print(f'Translation for {language} not found at {path}')
return {}