Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(translations)!: load translation in installed app order #20648

Merged
merged 2 commits into from Apr 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 0 additions & 8 deletions frappe/core/doctype/translation/test_translation.py
Expand Up @@ -37,20 +37,16 @@ def test_parent_language(self):

frappe.local.lang = "es"

clear_translation_cache()
self.assertTrue(_(data[0][0]), data[0][1])

clear_translation_cache()
self.assertTrue(_(data[1][0]), data[1][1])

frappe.local.lang = "es-MX"

# different translation for es-MX
clear_translation_cache()
self.assertTrue(_(data[2][0]), data[2][1])

# from spanish (general)
clear_translation_cache()
self.assertTrue(_(data[1][0]), data[1][1])

def test_multi_language_translations(self):
Expand Down Expand Up @@ -112,7 +108,3 @@ def create_translation(key, val):
translation.translated_text = val[1]
translation.save()
return translation


def clear_translation_cache():
frappe.cache().delete_key("translations_from_apps", shared=True)
5 changes: 0 additions & 5 deletions frappe/tests/test_translate.py
Expand Up @@ -8,7 +8,6 @@
import frappe
import frappe.translate
from frappe import _
from frappe.core.doctype.translation.test_translation import clear_translation_cache
from frappe.tests.utils import FrappeTestCase
from frappe.translate import (
extract_javascript,
Expand Down Expand Up @@ -39,15 +38,11 @@ def setUp(self):
if self._testMethodName in self.guest_sessions_required:
frappe.set_user("Guest")

clear_translation_cache()

def tearDown(self):
frappe.form_dict.pop("_lang", None)
if self._testMethodName in self.guest_sessions_required:
frappe.set_user("Administrator")

clear_translation_cache()

def test_extract_message_from_file(self):
data = frappe.translate.get_messages_from_file(translation_string_file)
exp_filename = "apps/frappe/frappe/tests/translation_test_file.txt"
Expand Down
33 changes: 14 additions & 19 deletions frappe/translate.py
Expand Up @@ -56,7 +56,6 @@

# Cache keys
MERGED_TRANSLATION_KEY = "merged_translations"
APP_TRANSLATION_KEY = "translations_from_apps"
USER_TRANSLATION_KEY = "lang_user_translations"


Expand Down Expand Up @@ -171,7 +170,7 @@ def get_dict(fortype: str, name: str | None = None) -> dict[str, str]:
fortype = fortype.lower()
cache = frappe.cache()
asset_key = fortype + ":" + (name or "-")
translation_assets = cache.hget("translation_assets", frappe.local.lang, shared=True) or {}
translation_assets = cache.hget("translation_assets", frappe.local.lang) or {}

if asset_key not in translation_assets:
messages = []
Expand Down Expand Up @@ -211,7 +210,7 @@ def get_dict(fortype: str, name: str | None = None) -> dict[str, str]:
# remove untranslated
message_dict = {k: v for k, v in message_dict.items() if k != v}
translation_assets[asset_key] = message_dict
cache.hset("translation_assets", frappe.local.lang, translation_assets, shared=True)
cache.hset("translation_assets", frappe.local.lang, translation_assets)

translation_map: dict = translation_assets[asset_key]

Expand Down Expand Up @@ -308,20 +307,17 @@ def get_translations_from_apps(lang, apps=None):
if lang == "en":
return {}

def _get_from_disk():
translations = {}
for app in apps or frappe.get_all_apps(True):
path = os.path.join(frappe.get_pymodule_path(app), "translations", lang + ".csv")
translations.update(get_translation_dict_from_file(path, lang, app) or {})
if "-" in lang:
parent = lang.split("-", 1)[0]
parent_translations = get_translations_from_apps(parent)
parent_translations.update(translations)
return parent_translations
translations = {}
for app in apps or frappe.get_installed_apps(_ensure_on_bench=True):
path = os.path.join(frappe.get_pymodule_path(app), "translations", lang + ".csv")
translations.update(get_translation_dict_from_file(path, lang, app) or {})
if "-" in lang:
parent = lang.split("-", 1)[0]
parent_translations = get_translations_from_apps(parent)
parent_translations.update(translations)
return parent_translations

return translations

return frappe.cache().hget(APP_TRANSLATION_KEY, lang, shared=True, generator=_get_from_disk)
return translations


def get_translation_dict_from_file(path, lang, app, throw=False) -> dict[str, str]:
Expand Down Expand Up @@ -375,8 +371,7 @@ def clear_cache():

# clear translations saved in boot cache
cache.delete_key("bootinfo")
cache.delete_key("translation_assets", shared=True)
cache.delete_key(APP_TRANSLATION_KEY, shared=True)
cache.delete_key("translation_assets")
cache.delete_key(USER_TRANSLATION_KEY)
cache.delete_key(MERGED_TRANSLATION_KEY)

Expand Down Expand Up @@ -687,7 +682,7 @@ def get_messages_from_include_files(app_name=None):
def get_all_messages_from_js_files(app_name=None):
"""Extracts all translatable strings from app `.js` files"""
messages = []
for app in [app_name] if app_name else frappe.get_installed_apps():
for app in [app_name] if app_name else frappe.get_installed_apps(_ensure_on_bench=True):
if os.path.exists(frappe.get_app_path(app, "public")):
for basepath, folders, files in os.walk(frappe.get_app_path(app, "public")):
if "frappe/public/js/lib" in basepath:
Expand Down