Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
    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
Exemple #4
0
    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
Exemple #7
0
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