mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	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>
		
			
				
	
	
		
			96 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			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 {}
 |