Marco Ricci commited on 2024-12-31 18:40:01
Zeige 1 geänderte Dateien mit 60 Einfügungen und 4 Löschungen.
... | ... |
@@ -6,10 +6,13 @@ |
6 | 6 |
|
7 | 7 |
from __future__ import annotations |
8 | 8 |
|
9 |
+import contextlib |
|
9 | 10 |
import datetime |
10 | 11 |
import enum |
11 | 12 |
import gettext |
12 | 13 |
import inspect |
14 |
+import os |
|
15 |
+import sys |
|
13 | 16 |
import textwrap |
14 | 17 |
import types |
15 | 18 |
from typing import TYPE_CHECKING, NamedTuple, TextIO, cast |
... | ... |
@@ -17,7 +20,7 @@ from typing import TYPE_CHECKING, NamedTuple, TextIO, cast |
17 | 20 |
import derivepassphrase as dpp |
18 | 21 |
|
19 | 22 |
if TYPE_CHECKING: |
20 |
- from collections.abc import Iterable, Mapping |
|
23 |
+ from collections.abc import Iterable, Mapping, Sequence |
|
21 | 24 |
|
22 | 25 |
from typing_extensions import Any, Self |
23 | 26 |
|
... | ... |
@@ -27,7 +30,62 @@ __version__ = dpp.__version__ |
27 | 30 |
__all__ = ('PROG_NAME',) |
28 | 31 |
|
29 | 32 |
PROG_NAME = 'derivepassphrase' |
30 |
-translation = gettext.translation(PROG_NAME, fallback=True) |
|
33 |
+ |
|
34 |
+ |
|
35 |
+def load_translations( |
|
36 |
+ localedirs: list[str] | None = None, |
|
37 |
+ languages: Sequence[str] | None = None, |
|
38 |
+ class_: type[gettext.NullTranslations] | None = None, |
|
39 |
+) -> gettext.NullTranslations: |
|
40 |
+ """Load a translation catalog for derivepassphrase. |
|
41 |
+ |
|
42 |
+ Runs [`gettext.translation`][] under the hood for multiple locale |
|
43 |
+ directories. `fallback=True` is implied. |
|
44 |
+ |
|
45 |
+ Args: |
|
46 |
+ localedirs: |
|
47 |
+ A list of directories to run [`gettext.translation`][] |
|
48 |
+ against. Defaults to `$XDG_DATA_HOME/locale` (usually |
|
49 |
+ `~/.local/share/locale`), `{sys.prefix}/share/locale` and |
|
50 |
+ `{sys.base_prefix}/share/locale` if not given. |
|
51 |
+ languages: |
|
52 |
+ Passed directly to [`gettext.translation`][]. |
|
53 |
+ class_: |
|
54 |
+ Passed directly to [`gettext.translation`][]. |
|
55 |
+ |
|
56 |
+ Returns: |
|
57 |
+ A (potentially dummy) translation catalog. |
|
58 |
+ |
|
59 |
+ """ |
|
60 |
+ if localedirs is None: |
|
61 |
+ if sys.platform.startswith('win'): |
|
62 |
+ xdg_data_home = os.environ.get( |
|
63 |
+ 'APPDATA', |
|
64 |
+ os.path.expanduser('~'), |
|
65 |
+ ) |
|
66 |
+ elif os.environ.get('XDG_DATA_HOME'): |
|
67 |
+ xdg_data_home = os.environ['XDG_DATA_HOME'] |
|
68 |
+ else: |
|
69 |
+ xdg_data_home = os.path.join( |
|
70 |
+ os.path.expanduser('~'), '.local', 'share' |
|
71 |
+ ) |
|
72 |
+ localedirs = [ |
|
73 |
+ os.path.join(xdg_data_home, 'locale'), |
|
74 |
+ os.path.join(sys.prefix, 'share', 'locale'), |
|
75 |
+ os.path.join(sys.base_prefix, 'share', 'locale'), |
|
76 |
+ ] |
|
77 |
+ for localedir in localedirs: |
|
78 |
+ with contextlib.suppress(OSError): |
|
79 |
+ return gettext.translation( |
|
80 |
+ PROG_NAME, |
|
81 |
+ localedir=localedir, |
|
82 |
+ languages=languages, |
|
83 |
+ class_=class_, |
|
84 |
+ ) |
|
85 |
+ return gettext.NullTranslations() |
|
86 |
+ |
|
87 |
+ |
|
88 |
+translation = load_translations() |
|
31 | 89 |
|
32 | 90 |
|
33 | 91 |
class TranslatableString(NamedTuple): |
... | ... |
@@ -1172,6 +1230,4 @@ def _cstr(s: str) -> str: |
1172 | 1230 |
|
1173 | 1231 |
|
1174 | 1232 |
if __name__ == '__main__': |
1175 |
- import sys |
|
1176 |
- |
|
1177 | 1233 |
write_pot_file(sys.stdout) |
1178 | 1234 |