├── .gitignore ├── MANIFEST.in ├── README.md ├── language_translator ├── Readme.md ├── __init__.py ├── config │ ├── __init__.py │ ├── desktop.py │ └── docs.py ├── hooks.py ├── language_translator │ └── __init__.py ├── modules.txt ├── patches.txt ├── public │ └── js │ │ ├── desk.js │ │ └── webpage.js └── templates │ ├── __init__.py │ └── pages │ └── __init__.py ├── license.txt ├── requirements.txt ├── setup.py └── src ├── 1.png ├── 2.png └── 3.png /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | *.egg-info 4 | *.swp 5 | tags 6 | language_translator/docs/current -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include MANIFEST.in 2 | include requirements.txt 3 | include *.json 4 | include *.md 5 | include *.py 6 | include *.txt 7 | recursive-include language_translator *.css 8 | recursive-include language_translator *.csv 9 | recursive-include language_translator *.html 10 | recursive-include language_translator *.ico 11 | recursive-include language_translator *.js 12 | recursive-include language_translator *.json 13 | recursive-include language_translator *.md 14 | recursive-include language_translator *.png 15 | recursive-include language_translator *.py 16 | recursive-include language_translator *.svg 17 | recursive-include language_translator *.txt 18 | recursive-exclude language_translator *.pyc -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Frappe ERPNExt automatic language translator. 2 | This custom app add a language translator to the top navbar of Frappe Desk/Web portal. 3 | 4 | ## How to setup 5 | - bench get-app --branch=master https://github.com/mymi14s/language_translator 6 | - bench --site sitename install-app language_translator 7 | - bench migrate 8 | - bench clear-cache && bench clear-website-cache 9 | - bench restart 10 | 11 | ## Screenshot 12 | ![First screen](https://github.com/mymi14s/language_translator/blob/master/src/1.png "First screen") 13 | ![Select language](https://github.com/mymi14s/language_translator/blob/master/src/2.png "Select language") 14 | ![Language changed](https://github.com/mymi14s/language_translator/blob/master/src/3.png "Language changed") 15 | -------------------------------------------------------------------------------- /language_translator/Readme.md: -------------------------------------------------------------------------------- 1 | Frappe ERPNExt automatic language translator. 2 | This custom app add a language translator to the top navbar of Frappe Desk/Web portal. 3 | 4 | ## How to setup 5 | - bench get-app --branch=master https://github.com/mymi14s/language_translator 6 | - bench --site sitename install-app language_translator 7 | - bench migrate 8 | - bench clear-cache && bench clear-website-cache 9 | - bench restart 10 | 11 | ## Screenshot 12 | ![First screen](https://github.com/mymi14s/language_translator/blob/master/src/1.png "First screen") 13 | - 14 | ![Select language](https://github.com/mymi14s/language_translator/blob/master/src/2.png "Select language") 15 | - 16 | ![Language changed](https://github.com/mymi14s/language_translator/blob/master/src/3.png "Language changed") 17 | -------------------------------------------------------------------------------- /language_translator/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | __version__ = '0.0.1' 3 | 4 | -------------------------------------------------------------------------------- /language_translator/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymi14s/language_translator/2aaebdf3eeeea99aabd7a7ba017e829c95f9a27c/language_translator/config/__init__.py -------------------------------------------------------------------------------- /language_translator/config/desktop.py: -------------------------------------------------------------------------------- 1 | from frappe import _ 2 | 3 | def get_data(): 4 | return [ 5 | { 6 | "module_name": "Language Translator", 7 | "color": "grey", 8 | "icon": "octicon octicon-file-directory", 9 | "type": "module", 10 | "label": _("Language Translator") 11 | } 12 | ] 13 | -------------------------------------------------------------------------------- /language_translator/config/docs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Configuration for docs 3 | """ 4 | 5 | # source_link = "https://github.com/[org_name]/language_translator" 6 | # docs_base_url = "https://[org_name].github.io/language_translator" 7 | # headline = "App that does everything" 8 | # sub_heading = "Yes, you got that right the first time, everything" 9 | 10 | def get_context(context): 11 | context.brand_html = "Language Translator" 12 | -------------------------------------------------------------------------------- /language_translator/hooks.py: -------------------------------------------------------------------------------- 1 | from . import __version__ as app_version 2 | 3 | app_name = "language_translator" 4 | app_title = "Language Translator" 5 | app_publisher = "Anthony Emmanuel C." 6 | app_description = "Automatic language translator for Frappe ERPNext" 7 | app_icon = "octicon octicon-file-directory" 8 | app_color = "grey" 9 | app_email = "mymi14s@hotmail.com" 10 | app_license = "MIT" 11 | 12 | # Includes in 13 | # ------------------ 14 | 15 | # include js, css files in header of desk.html 16 | # app_include_css = "/assets/language_translator/css/language_translator.css" 17 | app_include_js = "/assets/language_translator/js/desk.js" 18 | # include js, css files in header of web template 19 | # web_include_css = "/assets/language_translator/css/language_translator.css" 20 | web_include_js = "/assets/language_translator/js/webpage.js" 21 | 22 | # include custom scss in every website theme (without file extension ".scss") 23 | # website_theme_scss = "language_translator/public/scss/website" 24 | 25 | # include js, css files in header of web form 26 | # webform_include_js = {"doctype": "public/js/doctype.js"} 27 | # webform_include_css = {"doctype": "public/css/doctype.css"} 28 | 29 | # include js in page 30 | # page_js = {"page" : "public/js/file.js"} 31 | 32 | # include js in doctype views 33 | # doctype_js = {"doctype" : "public/js/doctype.js"} 34 | # doctype_list_js = {"doctype" : "public/js/doctype_list.js"} 35 | # doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"} 36 | # doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"} 37 | 38 | # Home Pages 39 | # ---------- 40 | 41 | # application home page (will override Website Settings) 42 | # home_page = "login" 43 | 44 | # website user home page (by Role) 45 | # role_home_page = { 46 | # "Role": "home_page" 47 | # } 48 | 49 | # Generators 50 | # ---------- 51 | 52 | # automatically create page for each record of this doctype 53 | # website_generators = ["Web Page"] 54 | 55 | # Installation 56 | # ------------ 57 | 58 | # before_install = "language_translator.install.before_install" 59 | # after_install = "language_translator.install.after_install" 60 | 61 | # Desk Notifications 62 | # ------------------ 63 | # See frappe.core.notifications.get_notification_config 64 | 65 | # notification_config = "language_translator.notifications.get_notification_config" 66 | 67 | # Permissions 68 | # ----------- 69 | # Permissions evaluated in scripted ways 70 | 71 | # permission_query_conditions = { 72 | # "Event": "frappe.desk.doctype.event.event.get_permission_query_conditions", 73 | # } 74 | # 75 | # has_permission = { 76 | # "Event": "frappe.desk.doctype.event.event.has_permission", 77 | # } 78 | 79 | # DocType Class 80 | # --------------- 81 | # Override standard doctype classes 82 | 83 | # override_doctype_class = { 84 | # "ToDo": "custom_app.overrides.CustomToDo" 85 | # } 86 | 87 | # Document Events 88 | # --------------- 89 | # Hook on document methods and events 90 | 91 | # doc_events = { 92 | # "*": { 93 | # "on_update": "method", 94 | # "on_cancel": "method", 95 | # "on_trash": "method" 96 | # } 97 | # } 98 | 99 | # Scheduled Tasks 100 | # --------------- 101 | 102 | # scheduler_events = { 103 | # "all": [ 104 | # "language_translator.tasks.all" 105 | # ], 106 | # "daily": [ 107 | # "language_translator.tasks.daily" 108 | # ], 109 | # "hourly": [ 110 | # "language_translator.tasks.hourly" 111 | # ], 112 | # "weekly": [ 113 | # "language_translator.tasks.weekly" 114 | # ] 115 | # "monthly": [ 116 | # "language_translator.tasks.monthly" 117 | # ] 118 | # } 119 | 120 | # Testing 121 | # ------- 122 | 123 | # before_tests = "language_translator.install.before_tests" 124 | 125 | # Overriding Methods 126 | # ------------------------------ 127 | # 128 | # override_whitelisted_methods = { 129 | # "frappe.desk.doctype.event.event.get_events": "language_translator.event.get_events" 130 | # } 131 | # 132 | # each overriding function accepts a `data` argument; 133 | # generated from the base implementation of the doctype dashboard, 134 | # along with any modifications made in other Frappe apps 135 | # override_doctype_dashboards = { 136 | # "Task": "language_translator.task.get_dashboard_data" 137 | # } 138 | 139 | # exempt linked doctypes from being automatically cancelled 140 | # 141 | # auto_cancel_exempted_doctypes = ["Auto Repeat"] 142 | 143 | 144 | # User Data Protection 145 | # -------------------- 146 | 147 | user_data_fields = [ 148 | { 149 | "doctype": "{doctype_1}", 150 | "filter_by": "{filter_by}", 151 | "redact_fields": ["{field_1}", "{field_2}"], 152 | "partial": 1, 153 | }, 154 | { 155 | "doctype": "{doctype_2}", 156 | "filter_by": "{filter_by}", 157 | "partial": 1, 158 | }, 159 | { 160 | "doctype": "{doctype_3}", 161 | "strict": False, 162 | }, 163 | { 164 | "doctype": "{doctype_4}" 165 | } 166 | ] 167 | 168 | # Authentication and authorization 169 | # -------------------------------- 170 | 171 | # auth_hooks = [ 172 | # "language_translator.auth.validate" 173 | # ] 174 | -------------------------------------------------------------------------------- /language_translator/language_translator/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymi14s/language_translator/2aaebdf3eeeea99aabd7a7ba017e829c95f9a27c/language_translator/language_translator/__init__.py -------------------------------------------------------------------------------- /language_translator/modules.txt: -------------------------------------------------------------------------------- 1 | Language Translator -------------------------------------------------------------------------------- /language_translator/patches.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymi14s/language_translator/2aaebdf3eeeea99aabd7a7ba017e829c95f9a27c/language_translator/patches.txt -------------------------------------------------------------------------------- /language_translator/public/js/desk.js: -------------------------------------------------------------------------------- 1 | // console.log("HELLO DESK") 2 | 3 | // dom ready 4 | document.addEventListener("DOMContentLoaded", (event)=>{ 5 | // navbar and anchor element 6 | let navbar = document.querySelector(".navbar-collapse"); 7 | let anc = document.createElement('a'); 8 | anc.id="ytWidget"; 9 | navbar.prepend(anc); 10 | // script tag 11 | let scrtag = document.createElement('script'); 12 | scrtag.src = "https://translate.yandex.net/website-widget/v1/widget.js?widgetId=ytWidget&pageLang=en&widgetTheme=dark&autoMode=true" 13 | scrtag.type = "text/javascript"; 14 | // append script tage to page 15 | document.head.appendChild(scrtag); 16 | 17 | }) 18 | -------------------------------------------------------------------------------- /language_translator/public/js/webpage.js: -------------------------------------------------------------------------------- 1 | // dom ready 2 | document.addEventListener("DOMContentLoaded", (event)=>{ 3 | // navbar and anchor element 4 | let navbar = document.querySelector("ul.navbar-nav"); 5 | let anc = document.createElement('li'); 6 | anc.id="ytWidget"; 7 | anc.className="nav-link"; 8 | navbar.append(anc); 9 | // script tag 10 | let scrtag = document.createElement('script'); 11 | scrtag.src = "https://translate.yandex.net/website-widget/v1/widget.js?widgetId=ytWidget&pageLang=en&widgetTheme=dark&autoMode=true" 12 | scrtag.type = "text/javascript"; 13 | // append script tage to page 14 | document.head.appendChild(scrtag); 15 | 16 | }) 17 | -------------------------------------------------------------------------------- /language_translator/templates/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymi14s/language_translator/2aaebdf3eeeea99aabd7a7ba017e829c95f9a27c/language_translator/templates/__init__.py -------------------------------------------------------------------------------- /language_translator/templates/pages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymi14s/language_translator/2aaebdf3eeeea99aabd7a7ba017e829c95f9a27c/language_translator/templates/pages/__init__.py -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | License: MIT -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # frappe -- https://github.com/frappe/frappe is installed via 'bench init' -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | with open("requirements.txt") as f: 4 | install_requires = f.read().strip().split("\n") 5 | 6 | # get version from __version__ variable in language_translator/__init__.py 7 | from language_translator import __version__ as version 8 | 9 | setup( 10 | name="language_translator", 11 | version=version, 12 | description="Automatic language translator for Frappe ERPNext", 13 | author="Anthony Emmanuel C.", 14 | author_email="mymi14s@hotmail.com", 15 | packages=find_packages(), 16 | zip_safe=False, 17 | include_package_data=True, 18 | install_requires=install_requires 19 | ) 20 | -------------------------------------------------------------------------------- /src/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymi14s/language_translator/2aaebdf3eeeea99aabd7a7ba017e829c95f9a27c/src/1.png -------------------------------------------------------------------------------- /src/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymi14s/language_translator/2aaebdf3eeeea99aabd7a7ba017e829c95f9a27c/src/2.png -------------------------------------------------------------------------------- /src/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymi14s/language_translator/2aaebdf3eeeea99aabd7a7ba017e829c95f9a27c/src/3.png --------------------------------------------------------------------------------