def METHOD_NAME(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