|
1 | | -from importlib import import_module |
2 | | -from typing import Callable |
3 | | -import json |
4 | | - |
5 | | -from flaskpp.app.data import commit, _package, delete_model |
6 | | -from flaskpp.app.data.babel import add_entry, get_entries |
7 | 1 | from flaskpp.babel import valid_state |
8 | 2 | from flaskpp.utils import enabled |
9 | | -from flaskpp.utils.debugger import log |
| 3 | +from flaskpp.app.utils.i18n import update_translations |
10 | 4 | from flaskpp.exceptions import I18nError |
11 | 5 |
|
| 6 | + |
| 7 | +translations: dict[str, dict[str, str]] = {} |
| 8 | + |
12 | 9 | _msg_keys = [ |
13 | 10 | "NAV_BRAND", |
14 | 11 | "NOT_FOUND_TITLE", |
|
27 | 24 |
|
28 | 25 | ] |
29 | 26 |
|
30 | | -_translations_en = { |
| 27 | +translations["en"] = { |
31 | 28 | _msg_keys[0]: "My Flask++ App", |
32 | 29 | _msg_keys[1]: "Not Found", |
33 | 30 | _msg_keys[2]: "We are sorry, but the requested page doesn't exist.", |
|
45 | 42 |
|
46 | 43 | } |
47 | 44 |
|
48 | | -_translations_de = { |
| 45 | +translations["de"] = { |
49 | 46 | _msg_keys[0]: "Meine Flask++ App", |
50 | 47 | _msg_keys[1]: "Nicht Gefunden", |
51 | 48 | _msg_keys[2]: "Wir konnten die angefragte Seite leider nicht finden.", |
|
64 | 61 | } |
65 | 62 |
|
66 | 63 |
|
67 | | -def _add_entries(key: str, domain: str): |
68 | | - add_entry("en", key, _translations_en[key], domain, False) |
69 | | - add_entry("de", key, _translations_de[key], domain, False) |
70 | | - |
71 | | - |
72 | 64 | def setup_db(domain: str = "flaskpp"): |
73 | 65 | if not (enabled("EXT_BABEL") and enabled("EXT_SQLALCHEMY")): |
74 | 66 | raise I18nError("To setup Flask++ base translations, you must enable EXT_BABEL and EXT_SQLALCHEMY.") |
75 | 67 |
|
76 | 68 | state = valid_state() |
77 | 69 | state.fpp_fallback_domain = domain |
78 | | - entries = get_entries(domain=domain, locale="en") |
79 | | - |
80 | | - if entries: |
81 | | - log("info", f"Updating Flask++ base translations...") |
82 | | - |
83 | | - keys = [e.key for e in entries] |
84 | | - for key in _msg_keys: |
85 | | - if key not in keys: |
86 | | - _add_entries(key, domain) |
87 | | - |
88 | | - from .. import data |
89 | | - for entry in entries: |
90 | | - key = entry.key |
91 | | - translations = getattr(data.noinit_translations, f"_translations_{entry.locale}", _translations_en) |
92 | | - try: |
93 | | - if translations[key] != entry.text: |
94 | | - entry.text = translations[key] |
95 | | - except KeyError: |
96 | | - delete_model(entry, False) |
97 | | - else: |
98 | | - log("info", f"Setting up Flask++ translations...") |
99 | | - |
100 | | - for key in _msg_keys: |
101 | | - _add_entries(key, domain) |
102 | | - |
103 | | - commit() |
104 | | - |
105 | | - |
106 | | -def get_locale_data(locale: str) -> tuple[str, str]: |
107 | | - if len(locale) != 2 and len(locale) != 5 or len(locale) == 5 and "_" not in locale: |
108 | | - raise I18nError(f"Invalid locale code: {locale}") |
109 | | - |
110 | | - if "_" in locale: |
111 | | - locale = locale.split("_")[0] |
112 | | - |
113 | | - try: |
114 | | - locale_data = json.loads( |
115 | | - (_package / "locales.json").read_text(encoding="utf-8") |
116 | | - ) |
117 | | - except json.JSONDecodeError: |
118 | | - raise I18nError("Failed to parse locales.json") |
119 | | - |
120 | | - flags = locale_data.get("flags", {}) |
121 | | - names = locale_data.get("names", {}) |
122 | | - return flags.get(locale, "🇬🇧"), names.get(locale, "English") |
123 | | - |
124 | | - |
125 | | -def update_translations(executor: str, msg_keys: list[str], add_entries_fn: Callable, translations_import_name: str, domain: str = None): |
126 | | - default_domain = valid_state().domain.domain |
127 | | - if not domain: |
128 | | - domain = default_domain |
129 | | - entries = get_entries(domain=domain) |
130 | | - |
131 | | - if entries: |
132 | | - log("info", f"[{executor}] Updating translations...") |
133 | | - |
134 | | - keys = [e.key for e in entries] |
135 | | - for key in msg_keys: |
136 | | - if key not in keys: |
137 | | - add_entries_fn(key, domain) |
138 | | - |
139 | | - translations_module = import_module(translations_import_name) |
140 | | - for entry in entries: |
141 | | - key = entry.key |
142 | | - translations = getattr(translations_module, f"_translations_{entry.locale}", _translations_en) |
143 | | - try: |
144 | | - if translations[key] != entry.text: |
145 | | - entry.text = translations[key] |
146 | | - except KeyError: |
147 | | - if domain == default_domain: |
148 | | - continue |
149 | | - delete_model(entry, False) |
150 | | - else: |
151 | | - log("info", f"[{executor}] Setting up translations...") |
152 | | - |
153 | | - for key in msg_keys: |
154 | | - add_entries_fn(key, domain) |
155 | | - |
156 | | - commit() |
| 70 | + update_translations("Flask++", __name__, domain) |
0 commit comments