From 65e511861aae54652e26b5f7559dc67185167319 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 10 Apr 2024 14:36:45 +0530 Subject: [PATCH] feat: setup translation --- crm/api/__init__.py | 12 ++++++++++++ frontend/src/main.js | 2 ++ frontend/src/translation.js | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 crm/api/__init__.py create mode 100644 frontend/src/translation.js diff --git a/crm/api/__init__.py b/crm/api/__init__.py new file mode 100644 index 00000000..0039c426 --- /dev/null +++ b/crm/api/__init__.py @@ -0,0 +1,12 @@ +import frappe +from frappe.translate import get_all_translations + + +@frappe.whitelist(allow_guest=True) +def get_translations(): + if frappe.session.user != "Guest": + language = frappe.db.get_value("User", frappe.session.user, "language") + else: + language = frappe.db.get_single_value("System Settings", "language") + + return get_all_translations(language) \ No newline at end of file diff --git a/frontend/src/main.js b/frontend/src/main.js index 303b2283..414cfbcc 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -19,6 +19,7 @@ import { frappeRequest, FeatherIcon, } from 'frappe-ui' +import translationPlugin from './translation' import { createDialog } from './utils/dialogs' import socket from './socket' import { getCachedListResource } from 'frappe-ui/src/resources/listResource' @@ -45,6 +46,7 @@ setConfig('resourceFetcher', frappeRequest) app.use(FrappeUI) app.use(pinia) app.use(router) +app.use(translationPlugin) for (let key in globalComponents) { app.component(key, globalComponents[key]) } diff --git a/frontend/src/translation.js b/frontend/src/translation.js new file mode 100644 index 00000000..b413146b --- /dev/null +++ b/frontend/src/translation.js @@ -0,0 +1,35 @@ +import { createResource } from 'frappe-ui' + +export default function translationPlugin(app) { + app.config.globalProperties.__ = translate + window.__ = translate + if (!window.translatedMessages) fetchTranslations() +} + +function translate(message) { + let translatedMessages = window.translatedMessages || {} + let translatedMessage = translatedMessages[message] || message + + const hasPlaceholders = /{\d+}/.test(message) + if (!hasPlaceholders) { + return translatedMessage + } + return { + format: function (...args) { + return translatedMessage.replace(/{(\d+)}/g, function (match, number) { + return typeof args[number] != 'undefined' ? args[number] : match + }) + }, + } +} + +function fetchTranslations(lang) { + createResource({ + url: 'crm.api.get_translations', + cache: 'translations', + auto: true, + transform: (data) => { + window.translatedMessages = data + }, + }) +}