Skip to content

Commit

Permalink
Add language setting and translation function
Browse files Browse the repository at this point in the history
  • Loading branch information
janezd committed Apr 22, 2024
1 parent 8b47de1 commit 4fbb727
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 0 deletions.
12 changes: 12 additions & 0 deletions orangecanvas/application/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
Signal)

from .. import config
from ..utils.localization import get_languages
from ..utils.settings import SettingChangedEvent
from ..utils.propertybindings import (
AbstractBoundProperty, PropertyBinding, BindingManager
Expand Down Expand Up @@ -274,6 +275,17 @@ def __setupUi(self):
form = FormLayout()
tab.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)

languages = get_languages()
if languages:
cm_lang = QComboBox(
objectName="combo-language",
toolTip=self.tr("Select the application language.")
)
cm_lang.addItems(languages)
self.bind(cm_lang, "currentText", "application/language")

form.addRow(self.tr("Language"), cm_lang)

nodes = QWidget(self, objectName="nodes")
nodes.setLayout(QVBoxLayout())
nodes.layout().setContentsMargins(0, 0, 0, 0)
Expand Down
3 changes: 3 additions & 0 deletions orangecanvas/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,9 @@ def init():
("startup/load-crashed-workflows", bool, True,
"Load crashed scratch workflows on startup"),

("application/language", str, "English",
"Application language"),

("stylesheet", str, "orange",
"QSS stylesheet to use"),

Expand Down
39 changes: 39 additions & 0 deletions orangecanvas/utils/localization/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
import os
import json
import importlib

from AnyQt.QtCore import QSettings

def pl(n: int, forms: str) -> str: # pylint: disable=invalid-name
"""
Choose a singular/plural form for English - or create one, for regular nouns
Expand Down Expand Up @@ -29,3 +35,36 @@ def pl(n: int, forms: str) -> str: # pylint: disable=invalid-name
if forms.isupper():
word = word.upper()
return word


def get_languages(package=None):
if package is None:
package = "orangecanvas"
package_path = os.path.dirname(importlib.import_module(package).__file__)
msgs_path = os.path.join(package_path, "i18n")
if not os.path.exists(msgs_path):
return None
return [name
for name, ext in map(os.path.splitext, os.listdir(msgs_path))
if ext == ".json"]


class Translator:
e = eval

def __init__(self, package, organization="biolab.si",
application="Orange Canvas"):
s = QSettings(QSettings.IniFormat, QSettings.UserScope,
organization, application)
lang = s.value("application/language", "English")
# For testing purposes (and potential fallback)
# lang = os.environ.get("ORANGE_LANG", "English")
package_path = os.path.dirname(importlib.import_module(package).__file__)
path = os.path.join(package_path, "i18n", f"{lang}.json")
if not os.path.exists(path):
path = os.path.join(package_path, "English.json")
assert os.path.exists(path)
self.m = json.load(open(path))

def c(self, idx):
return compile(self.m[idx], '<string>', 'eval')

0 comments on commit 4fbb727

Please sign in to comment.