1
1
import sys
2
2
import gettext
3
3
import typing
4
+ import functools
4
5
5
6
import sanic
7
+ import babel
8
+ import babel .dates
9
+ import npf_renderer
6
10
7
11
from .i18n_data import LOCALE_DATA
8
12
9
13
14
+ class NPFRendererGettextFallback (gettext .NullTranslations ):
15
+ def gettext (self , message ):
16
+ return npf_renderer .DEFAULT_LOCALIZATION [message ]
17
+
18
+ def ngettext (self , msgid1 : str , msgid2 : str , n : int ) -> str :
19
+ return npf_renderer .DEFAULT_LOCALIZATION [msgid1 ]
20
+
21
+
22
+ class NPFRendererLocalizer :
23
+ def __init__ (self , language , locale ):
24
+ self .language = language
25
+ self .locale = locale
26
+
27
+ self .format_functions = {
28
+ "format_duration_func" : functools .partial (babel .dates .format_timedelta , threshold = 1.1 , locale = language ),
29
+ "format_datetime_func" : functools .partial (babel .dates .format_datetime , format = f"short" , locale = language ),
30
+ }
31
+
32
+ def __getitem__ (self , key : str ):
33
+ # Starts with format_
34
+ if key [:7 ] == "format_" :
35
+ return self .format_functions [key ]
36
+ # Starts with plural_
37
+ elif key [:7 ] == "plural_" :
38
+ return lambda number : translate (self .language , key [7 :], number , priviblur_translations = False )
39
+
40
+ translate ("en_US" , "poll_remaining_time" , priviblur_translations = False )
41
+
42
+ return translate (self .language , key , priviblur_translations = False )
43
+
44
+
10
45
class Language :
11
46
"""Stores metadata about supported translations"""
12
- def __init__ (self , locale , gettext_instance , ) -> None :
47
+ def __init__ (self , locale , priviblur_gettext , npf_renderer_gettext ) -> None :
13
48
self .locale = locale
14
49
15
- self .priviblur_translations = gettext_instance
50
+ self .babel_locale = babel .Locale .parse (locale )
51
+
52
+ self .priviblur_translations = priviblur_gettext
53
+
54
+ self .npf_renderer_translations = npf_renderer_gettext
55
+ self .npf_renderer_localizer = NPFRendererLocalizer (locale , self .babel_locale )
16
56
17
57
self .name , self .translation_percentage = LOCALE_DATA [locale ]
18
58
@@ -30,8 +70,11 @@ def initialize_locales() -> typing.Mapping[str, Language]:
30
70
31
71
priviblur_english_instance = gettext .translation ("priviblur" , localedir = "locales" , languages = ("en_US" ,))
32
72
73
+ npf_renderer_english_instance = gettext .translation ("npf_renderer" , localedir = "locales" , languages = ("en_US" ,))
74
+ npf_renderer_english_instance .add_fallback (NPFRendererGettextFallback ())
75
+
33
76
languages = {
34
- "en_US" : Language ("en_US" , priviblur_english_instance )
77
+ "en_US" : Language ("en_US" , priviblur_english_instance , npf_renderer_english_instance )
35
78
}
36
79
37
80
for locale in SUPPORTED_LANGUAGES :
@@ -41,7 +84,12 @@ def initialize_locales() -> typing.Mapping[str, Language]:
41
84
instance = gettext .translation ("priviblur" , localedir = "locales" , languages = (locale ,))
42
85
instance .add_fallback (priviblur_english_instance )
43
86
44
- languages [locale ] = Language (locale , instance )
87
+ try :
88
+ npf_renderer_instance = gettext .translation ("npf_renderer" , localedir = "locales" , languages = (locale ,))
89
+ except FileNotFoundError :
90
+ npf_renderer_instance = npf_renderer_english_instance
91
+
92
+ languages [locale ] = Language (locale , instance , npf_renderer_instance )
45
93
except FileNotFoundError as e :
46
94
print (
47
95
'Error: Unable to find locale files. '
@@ -56,10 +104,13 @@ def initialize_locales() -> typing.Mapping[str, Language]:
56
104
57
105
58
106
def translate (language : str , id : str , number : int | float | None = None ,
59
- substitution : str | dict | None = None ) -> str :
107
+ substitution : str | dict | None = None , priviblur_translations : bool = True ) -> str :
60
108
app = sanic .Sanic .get_app ("Priviblur" )
61
109
62
- gettext_instance = app .ctx .LANGUAGES [language ].priviblur_translations
110
+ if priviblur_translations :
111
+ gettext_instance = app .ctx .LANGUAGES [language ].priviblur_translations
112
+ else :
113
+ gettext_instance = app .ctx .LANGUAGES [language ].npf_renderer_translations
63
114
64
115
if number is not None :
65
116
translated = gettext_instance .ngettext (id , f"{ id } _plural" , number )
0 commit comments