From b698124ae86ba9924160293b7f5b5209b4ec7aeb Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 2 Mar 2016 15:44:36 +0530 Subject: [PATCH] [fix] multi-lingual print formats --- .../doctype/system_settings/system_settings.js | 3 +-- .../doctype/system_settings/system_settings.py | 6 +----- .../core/doctype/translation/translation.json | 6 +++--- frappe/core/doctype/translation/translation.py | 3 +++ frappe/core/doctype/user/user.js | 4 +++- frappe/desk/page/setup_wizard/setup_wizard.js | 12 ++++++------ .../en/guides/portal-development/generators.md | 7 +++++++ .../en/guides/portal-development/index.txt | 1 + frappe/patches.txt | 1 + frappe/patches/v6_24/__init__.py | 0 frappe/patches/v6_24/set_language_as_code.py | 17 +++++++++++++++++ frappe/public/js/frappe/form/print.js | 2 +- frappe/public/js/frappe/translate.js | 18 ++++++++++-------- frappe/public/js/frappe/views/communication.js | 2 +- frappe/translate.py | 4 ++-- 15 files changed, 57 insertions(+), 29 deletions(-) create mode 100644 frappe/patches/v6_24/__init__.py create mode 100644 frappe/patches/v6_24/set_language_as_code.py diff --git a/frappe/core/doctype/system_settings/system_settings.js b/frappe/core/doctype/system_settings/system_settings.js index c5c48cfe05..d6d11130a9 100644 --- a/frappe/core/doctype/system_settings/system_settings.js +++ b/frappe/core/doctype/system_settings/system_settings.js @@ -1,11 +1,10 @@ frappe.ui.form.on("System Settings", "refresh", function(frm) { + frappe.setup_language_field(frm); frappe.call({ method: "frappe.core.doctype.system_settings.system_settings.load", callback: function(data) { frappe.all_timezones = data.message.timezones; - frappe.languages = data.message.languages; frm.set_df_property("time_zone", "options", frappe.all_timezones); - frm.set_df_property("language", "options", frappe.languages); $.each(data.message.defaults, function(key, val) { frm.set_value(key, val); diff --git a/frappe/core/doctype/system_settings/system_settings.py b/frappe/core/doctype/system_settings/system_settings.py index 443b820104..8209c28bd1 100644 --- a/frappe/core/doctype/system_settings/system_settings.py +++ b/frappe/core/doctype/system_settings/system_settings.py @@ -6,7 +6,7 @@ import frappe from frappe import _ from frappe.model.document import Document from frappe.model import no_value_fields -from frappe.translate import get_lang_dict, set_default_language +from frappe.translate import set_default_language from frappe.utils import cint from frappe.utils.momentjs import get_all_timezones @@ -38,11 +38,7 @@ def load(): if df.fieldtype in ("Select", "Data"): defaults[df.fieldname] = all_defaults.get(df.fieldname) - languages = get_lang_dict().keys() - languages.sort() - return { "timezones": get_all_timezones(), - "languages": [""] + languages, "defaults": defaults } diff --git a/frappe/core/doctype/translation/translation.json b/frappe/core/doctype/translation/translation.json index e557a4cdf6..146e4e5d57 100644 --- a/frappe/core/doctype/translation/translation.json +++ b/frappe/core/doctype/translation/translation.json @@ -13,7 +13,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "default": "english", + "default": "", "fieldname": "language", "fieldtype": "Select", "hidden": 0, @@ -24,7 +24,7 @@ "label": "Language", "length": 0, "no_copy": 0, - "options": "english", + "options": "", "permlevel": 0, "precision": "", "print_hide": 0, @@ -195,7 +195,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-03-02 03:51:08.447550", + "modified": "2016-03-02 05:13:29.290875", "modified_by": "Administrator", "module": "Core", "name": "Translation", diff --git a/frappe/core/doctype/translation/translation.py b/frappe/core/doctype/translation/translation.py index 0c4a50f6cd..d88242c718 100644 --- a/frappe/core/doctype/translation/translation.py +++ b/frappe/core/doctype/translation/translation.py @@ -9,3 +9,6 @@ from frappe.model.document import Document class Translation(Document): def on_update(self): frappe.cache().hdel('lang_user_translations', self.language_code) + + def on_trash(self): + frappe.cache().hdel('lang_user_translations', self.language_code) diff --git a/frappe/core/doctype/user/user.js b/frappe/core/doctype/user/user.js index 6e16856320..eb33ab2de4 100644 --- a/frappe/core/doctype/user/user.js +++ b/frappe/core/doctype/user/user.js @@ -37,7 +37,9 @@ frappe.ui.form.on('User', { refresh: function(frm) { var doc = frm.doc; - if(doc.name===user && !doc.__unsaved && frappe.languages && (doc.language || frappe.boot.user.language) + if(doc.name===user && !doc.__unsaved + && frappe.all_timezones + && (doc.language || frappe.boot.user.language) && doc.language !== frappe.boot.user.language) { msgprint(__("Refreshing...")); window.location.reload(); diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index bd649c7762..17b9192659 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -14,7 +14,7 @@ frappe.wiz = { add_slide: function(slide) { frappe.wiz.slides.push(slide); }, - + run_event: function(event) { $.each(frappe.wiz.events[event] || [], function(i, fn) { fn(frappe.wiz.wizard); @@ -34,7 +34,7 @@ frappe.pages['setup-wizard'].on_page_load = function(wrapper) { }); frappe.wiz.run_event("before_load"); - + var wizard_settings = { page_name: "setup-wizard", parent: wrapper, @@ -302,7 +302,7 @@ function load_frappe_slides() { // reset all slides so that labels are translated frappe.wiz.slides = []; frappe.wiz.run_event("before_load"); - + // remove slides listed in remove_app_slides for (var app in frappe.wiz.remove_app_slides) { var new_slides = [] @@ -313,7 +313,7 @@ function load_frappe_slides() { } frappe.wiz.slides = new_slides; } - + frappe.wiz.wizard.slides = frappe.wiz.slides; frappe.wiz.run_event("after_load"); @@ -421,8 +421,8 @@ function load_frappe_slides() { }); } }, - - + + frappe.wiz.user= { app_name: "frappe", title: __("The First User: You"), diff --git a/frappe/docs/user/en/guides/portal-development/generators.md b/frappe/docs/user/en/guides/portal-development/generators.md index eb83ab7803..85d21c6718 100644 --- a/frappe/docs/user/en/guides/portal-development/generators.md +++ b/frappe/docs/user/en/guides/portal-development/generators.md @@ -79,3 +79,10 @@ Add the template in `erpnext/templates/generators/job_opening.html` {% endblock %}{% endraw %} +#### 5. Customizing List View + +If you add a method `get_list_view` in the controller file (job_opening.py), you can set properties for the listview + + def get_list_context(context): + context.title = _("Jobs") + context.introduction = _('Current Job Openings') diff --git a/frappe/docs/user/en/guides/portal-development/index.txt b/frappe/docs/user/en/guides/portal-development/index.txt index 3eeece6502..875325806e 100755 --- a/frappe/docs/user/en/guides/portal-development/index.txt +++ b/frappe/docs/user/en/guides/portal-development/index.txt @@ -3,3 +3,4 @@ ordering contents context building +generators diff --git a/frappe/patches.txt b/frappe/patches.txt index 1d78506bc3..77e0b5b877 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -115,3 +115,4 @@ frappe.patches.v6_15.set_username execute:frappe.permissions.reset_perms("Error Snapshot") frappe.patches.v6_16.feed_doc_owner frappe.patches.v6_21.print_settings_repeat_header_footer +frappe.patches.v6_24.set_language_as_code diff --git a/frappe/patches/v6_24/__init__.py b/frappe/patches/v6_24/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/patches/v6_24/set_language_as_code.py b/frappe/patches/v6_24/set_language_as_code.py new file mode 100644 index 0000000000..d584beff42 --- /dev/null +++ b/frappe/patches/v6_24/set_language_as_code.py @@ -0,0 +1,17 @@ +import frappe + +from frappe.translate import get_lang_dict + +# migrate language from name to code +def execute(): + language = frappe.db.get_value('System Settings', None, 'language') + if language: + system_settings = frappe.get_doc('System Settings', 'System Settings') + if get_lang_dict().get(language, language) != system_settings.language: + system_settings.language = get_lang_dict().get(language, language) + system_settings.save() + + for user in frappe.get_all('User', fields=['name', 'language']): + if user.language: + frappe.db.set_value('User', user.name, 'language', + get_lang_dict().get(user.language, user.language), update_modified=False) diff --git a/frappe/public/js/frappe/form/print.js b/frappe/public/js/frappe/form/print.js index 3aac8b31f6..24c0cefd47 100644 --- a/frappe/public/js/frappe/form/print.js +++ b/frappe/public/js/frappe/form/print.js @@ -103,7 +103,7 @@ frappe.ui.form.PrintPreview = Class.extend({ this.lang_code = this.frm.doc.language; // Load all languages in the field this.language_sel.empty() - .add_options(frappe.get_languages_dict()) + .add_options(frappe.get_languages()) .val(this.lang_code); this.preview(); }, diff --git a/frappe/public/js/frappe/translate.js b/frappe/public/js/frappe/translate.js index 6eb168db34..e123f65250 100644 --- a/frappe/public/js/frappe/translate.js +++ b/frappe/public/js/frappe/translate.js @@ -16,17 +16,19 @@ frappe._ = function(txt, replace) { }; window.__ = frappe._ -frappe.get_languages_dict = function() { - var lang_dict = [] - $.each(frappe.boot.lang_dict, function(lang, val){ - lang_dict.push({'label': lang, 'value': val}) - }) - return lang_dict +frappe.get_languages = function() { + if(!frappe.languages) { + frappe.languages = [] + $.each(frappe.boot.lang_dict, function(lang, value){ + frappe.languages.push({'label': lang, 'value': value}) + }); + frappe.languages = frappe.languages.sort(function(a, b) { return (a.value < b.value) ? -1 : 1 }); + } + return frappe.languages; }; frappe.setup_language_field = function(frm, fieldname) { if (!fieldname) fieldname = 'language'; - if(!frappe.languages) frappe.languages = frappe.get_languages_dict(); - frm.set_df_property(fieldname, "options", [''].concat(frappe.languages) || ["", "english"]); + frm.set_df_property(fieldname, "options", [''].concat(frappe.get_languages()) || ["", "english"]); frm.get_field(fieldname).set_input(frm.doc[fieldname] || ''); } diff --git a/frappe/public/js/frappe/views/communication.js b/frappe/public/js/frappe/views/communication.js index 8c1bd83234..29520652da 100644 --- a/frappe/public/js/frappe/views/communication.js +++ b/frappe/public/js/frappe/views/communication.js @@ -234,7 +234,7 @@ frappe.views.CommunicationComposer = Class.extend({ // Load all languages in the select field language_sel $(fields.language_sel.input) .empty() - .add_options(frappe.get_languages_dict()) + .add_options(frappe.get_languages()) .val(doc.language) }, diff --git a/frappe/translate.py b/frappe/translate.py index bd52c78199..e14521d271 100644 --- a/frappe/translate.py +++ b/frappe/translate.py @@ -54,7 +54,7 @@ def get_user_lang(user=None): # if defined in user profile user_lang = frappe.db.get_value("User", user, "language") if user_lang and user_lang!="Loading...": - lang = get_lang_dict().get(user_lang) or frappe.local.lang + lang = get_lang_dict().get(user_lang, user_lang) or frappe.local.lang else: default_lang = frappe.db.get_default("lang") lang = default_lang or frappe.local.lang @@ -65,7 +65,7 @@ def get_user_lang(user=None): def set_default_language(language): """Set Global default language""" - lang = get_lang_dict()[language] + lang = get_lang_dict().get(language, language) frappe.db.set_default("lang", lang) frappe.local.lang = lang