def verify_translation_files(app): """Function to verify translation file syntax in app.""" # Do not remove/rename this, other apps depend on it to test their translations from pathlib import Path translations_dir = Path(frappe.get_app_path(app)) / "translations" for file in translations_dir.glob("*.csv"): lang = file.stem # basename of file = lang get_translation_dict_from_file(file, lang, app, throw=True)
def egd_load_lang(lang, apps=None): """Checks `en` too""" if is_app_for_actual_site(): import os from frappe.translate import get_translation_dict_from_file out = frappe.cache().hget("lang_full_dict", lang, shared=True) if not out: out = {} for app in (apps or frappe.get_all_apps(True)): path = os.path.join(frappe.get_pymodule_path(app), "translations", lang + ".csv") out.update(get_translation_dict_from_file(path, lang, app) or {}) frappe.cache().hset("lang_full_dict", lang, out, shared=True) return out or {} else: return frappe_load_lang(lang, apps)
def get_context(context): site_app = (frappe.get_hooks("multilanguage_app_site_name")[0] if frappe.get_hooks("multilanguage_app_site_name") else "") if not site_app: return context import os import io # from frappe.translate import get_messages_for_app from frappe.translate import deduplicate_messages from frappe.translate import get_all_messages_from_js_files from frappe.translate import get_server_messages from frappe.translate import get_translation_dict_from_file from csv import writer messages = [] # # full app messages # messages.extend(get_messages_for_app(site_app)) # app_include_files messages.extend(get_all_messages_from_js_files(site_app)) # server_messages messages.extend(get_server_messages(site_app)) messages = deduplicate_messages(messages) ctx_lang = frappe._dict({ "translated": frappe._dict(), "segments_as_txt": frappe._dict(), }) languages = frappe.get_hooks("translated_languages_for_website") for lang in languages: path = os.path.join(frappe.get_pymodule_path(site_app), "translations", lang + ".csv") data = get_translation_dict_from_file(path, lang, site_app) ctx_lang["translated"][lang] = data mem_file = io.StringIO() w = writer(mem_file, lineterminator="\n") for p, m in messages: translated = ctx_lang["translated"][lang][m] if m in ctx_lang[ "translated"][lang] else m w.writerow([p if p else '', m, translated]) ctx_lang["segments_as_txt"][lang] = mem_file.getvalue() context["languages_data"] = ctx_lang
def dfp_load_lang(lang, apps=None): """Checks `en` too""" from .hooks import multilanguage_app_site_hosts as multilanguage_site from .hooks import translated_languages_for_website as languages if frappe.local.site in multilanguage_site and languages: import os from frappe.translate import get_translation_dict_from_file out = frappe.cache().hget("lang_full_dict", lang, shared=True) if not out: out = {} for app in (apps or frappe.get_all_apps(True)): path = os.path.join(frappe.get_pymodule_path(app), "translations", lang + ".csv") out.update( get_translation_dict_from_file(path, lang, app) or {}) frappe.cache().hset("lang_full_dict", lang, out, shared=True) return out or {} return frappe_load_lang(lang, apps)
def process_lang(lang): path = os.path.join(frappe.get_pymodule_path(app), "translations", lang + ".csv") data = get_translation_dict_from_file(path, lang, app) ctx_lang["translated"][lang] = data mem_file = io.StringIO() w = writer(mem_file, lineterminator="\n") for p, m in messages: translated = m if (m in ctx_lang["translated"][lang] and ctx_lang["translated"][lang][m] not in [m, ""]): translated = ctx_lang["translated"][lang][m] # Set english as default language and use it for empty translation segments in other langs elif lang != "en" and m in ctx_lang["translated"]["en"]: translated = ctx_lang["translated"]["en"][m] w.writerow([p if p else '', m, translated]) raw = mem_file.getvalue() ctx_lang["segments_as_txt"][lang] = raw.replace("<", "<").replace( ">", ">")