def process_ui_translation_upload(app, trans_file): workbook = WorkbookJSONReader(trans_file) translations = workbook.get_worksheet(title='translations') commcare_ui_strings = load_translations('en', 2).keys() default_trans = get_default_translations_for_download(app) lang_with_defaults = app.langs[get_index_for_defaults(app.langs)] trans_dict = defaultdict(dict) # Use this to hard fail and not update any translations error_properties = [] # Use this to pass warnings without failing hard warnings = [] for row in translations: if row["property"] not in commcare_ui_strings: # Add a warning for unknown properties, but still add them to the translation dict warnings.append( row["property"] + " is not a known CommCare UI string, but we added it anyway") for lang in app.langs: if row.get(lang): all_parameters = re.findall("\$.*?}", row[lang]) for param in all_parameters: if not re.match("\$\{[0-9]+}", param): error_properties.append(row["property"] + ' - ' + row[lang]) if not (lang_with_defaults == lang and row[lang] == default_trans.get(row["property"], "")): trans_dict[lang].update({row["property"]: row[lang]}) return trans_dict, error_properties, warnings
def process_ui_translation_upload(app, trans_file): workbook = WorkbookJSONReader(trans_file) translations = workbook.get_worksheet(title='translations') commcare_ui_strings = load_translations('en', 2).keys() default_trans = get_default_translations_for_download(app) lang_with_defaults = app.langs[get_index_for_defaults(app.langs)] trans_dict = defaultdict(dict) # Use this to hard fail and not update any translations error_properties = [] # Use this to pass warnings without failing hard warnings = [] for row in translations: if row["property"] not in commcare_ui_strings: # Add a warning for unknown properties, but still add them to the translation dict warnings.append(row["property"] + " is not a known CommCare UI string, but we added it anyway") for lang in app.langs: if row.get(lang): all_parameters = re.findall("\$.*?}", row[lang]) for param in all_parameters: if not re.match("\$\{[0-9]+}", param): error_properties.append(row["property"] + ' - ' + row[lang]) if not (lang_with_defaults == lang and row[lang] == default_trans.get(row["property"], "")): trans_dict[lang].update({row["property"]: row[lang]}) return trans_dict, error_properties, warnings
def create_from_txt(cls, lang, txt=None): """ from corehq.apps.translations.models import * TranslationDoc.create_from_txt("pt") """ if txt: dct = commcare_translations.loads(txt) else: dct = commcare_translations.load_translations(lang) t = cls(translations={lang: dct}) t.save() return t
def process_ui_translation_upload(app, trans_file): trans_dict = defaultdict(dict) # Use this to hard fail and not update any translations error_properties = [] # Use this to pass warnings without failing hard warnings = [] try: workbook = get_workbook(trans_file) except WorkbookJSONError as e: error_properties.append(six.text_type(e)) return trans_dict, error_properties, warnings commcare_version = get_commcare_version_from_workbook(workbook.wb) try: translations = workbook.get_worksheet(title='translations') except WorksheetNotFound: error_properties.append( _('Could not find sheet "translations" in uploaded file.')) return trans_dict, error_properties, warnings commcare_ui_strings = list( load_translations('en', version=2, commcare_version=commcare_version).keys()) default_trans = get_default_translations_for_download( app, commcare_version) lang_with_defaults = app.langs[get_index_for_defaults(app.langs)] for row in translations: if row["property"] not in commcare_ui_strings: # Add a warning for unknown properties, but still add them to the translation dict warnings.append( row["property"] + " is not a known CommCare UI string, but we added it anyway") for lang in app.langs: if row.get(lang): all_parameters = re.findall(r"\$.*?}", row[lang]) for param in all_parameters: if not re.match(r"\$\{[0-9]+}", param): error_properties.append(row["property"] + ' - ' + row[lang]) if not (lang_with_defaults == lang and row[lang] == default_trans.get(row["property"], "")): trans_dict[lang].update({row["property"]: row[lang]}) return trans_dict, error_properties, warnings
def process_ui_translation_upload(app, trans_file): trans_dict = defaultdict(dict) # Use this to hard fail and not update any translations error_properties = [] # Use this to pass warnings without failing hard warnings = [] try: workbook = get_workbook(trans_file) except WorkbookJSONError as e: error_properties.append(six.text_type(e)) return trans_dict, error_properties, warnings commcare_version = get_commcare_version_from_workbook(workbook.wb) try: translations = workbook.get_worksheet(title='translations') except WorksheetNotFound: error_properties.append(_('Could not find sheet "translations" in uploaded file.')) return trans_dict, error_properties, warnings commcare_ui_strings = list(load_translations('en', version=2, commcare_version=commcare_version).keys()) default_trans = get_default_translations_for_download(app, commcare_version) lang_with_defaults = app.langs[get_index_for_defaults(app.langs)] for row in translations: if row["property"] not in commcare_ui_strings: # Add a warning for unknown properties, but still add them to the translation dict warnings.append(row["property"] + " is not a known CommCare UI string, but we added it anyway") for lang in app.langs: if row.get(lang): all_parameters = re.findall(r"\$.*?}", row[lang]) for param in all_parameters: if not re.match(r"\$\{[0-9]+}", param): error_properties.append(row["property"] + ' - ' + row[lang]) if not (lang_with_defaults == lang and row[lang] == default_trans.get(row["property"], "")): trans_dict[lang].update({row["property"]: row[lang]}) return trans_dict, error_properties, warnings
def process_ui_translation_upload(app, trans_file): workbook = WorkbookJSONReader(trans_file) translations = workbook.get_worksheet(title='translations') valid_translatable_strings = load_translations('en', 2) default_trans = get_default_translations_for_download(app) lang_with_defaults = app.langs[get_index_for_defaults(app.langs)] trans_dict = defaultdict(dict) error_properties = [] for row in translations: for lang in app.langs: if row.get(lang): all_parameters = re.findall("\$.*?}", row[lang]) for param in all_parameters: if not re.match("\$\{[0-9]+}", param): error_properties.append(row["property"] + ' - ' + row[lang]) if row["property"] not in valid_translatable_strings: error_properties.append(row["property"] + " is not a known property") if not (lang_with_defaults == lang and row[lang] == default_trans.get(row["property"], "")): trans_dict[lang].update({row["property"]: row[lang]}) return trans_dict, error_properties
def process_ui_translation_upload(app, trans_file): trans_dict = defaultdict(dict) # Use this to hard fail and not update any translations error_properties = [] # Use this to pass warnings without failing hard warnings = [] try: workbook = get_workbook(trans_file) except WorkbookJSONError as e: error_properties.append(str(e)) return trans_dict, error_properties, warnings commcare_version = get_commcare_version_from_workbook(workbook.wb) try: translations = workbook.get_worksheet(title='translations') except WorksheetNotFound: error_properties.append( _('Could not find sheet "translations" in uploaded file.')) return trans_dict, error_properties, warnings commcare_ui_strings = list( load_translations('en', version=2, commcare_version=commcare_version).keys()) default_trans = get_default_translations_for_download( app, commcare_version) lang_with_defaults = app.langs[get_index_for_defaults(app.langs)] # Find all of the ${0}-looking values in a translation. # Returns list like ["${0}", "${1}", ...] def _get_params(translation): if not translation: return [] return re.findall(r"\$.*?}", translation) # Create a string version of all parameters in a translation, suitable both for # comparison and for displaying in an error message. def _get_params_text(params): if not params: return "no parameters" # Reduce parameter list to the numbers alone, a set like {'0', '1', '2'} numbers = {re.sub(r'\D', '', p) for p in params} # Sort numbers, so that re-ordering parameters doesn't trigger error numbers = sorted(numbers) # Re-join numbers into a string for display return ", ".join(["${{{}}}".format(num) for num in numbers]) for row in translations: if row["property"] not in commcare_ui_strings: # Add a warning for unknown properties, but still add them to the translation dict warnings.append("Property '" + row["property"] + "' is not a known CommCare UI string, " "but we added it anyway.") default = default_trans.get(row["property"]) default_params_text = _get_params_text( _get_params(default)) if default else None for lang in app.langs: if row.get(lang): params = _get_params(row[lang]) params_text = _get_params_text(params) for param in params: if not re.match(r"\$\{[0-9]+}", param): error_properties.append( _(""" Could not understand '{param}' in {lang} value of '{prop}'. """).format(param=param, lang=lang, prop=row["property"])) if default_params_text and params_text != default_params_text: warnings.append( _(""" Property '{prop}' should contain {expected} but {lang} value contains {actual}. """).format(prop=row["property"], expected=default_params_text, lang=lang, actual=params_text)) if not (lang_with_defaults == lang and row[lang] == default_trans.get(row["property"], "")): trans_dict[lang].update({row["property"]: row[lang]}) return trans_dict, error_properties, warnings