46
46
# find this format documented anywhere.
47
47
48
48
49
+ import operator
49
50
import os
50
51
import re
51
52
import sys
@@ -166,14 +167,28 @@ def _parse(tokens, priority=-1):
166
167
167
168
def _as_int (n ):
168
169
try :
169
- i = round (n )
170
+ round (n )
170
171
except TypeError :
171
172
raise TypeError ('Plural value must be an integer, got %s' %
172
173
(n .__class__ .__name__ ,)) from None
174
+ return _as_int2 (n )
175
+
176
+ def _as_int2 (n ):
177
+ try :
178
+ return operator .index (n )
179
+ except TypeError :
180
+ pass
181
+
173
182
import warnings
183
+ frame = sys ._getframe (1 )
184
+ stacklevel = 2
185
+ while frame .f_back is not None and frame .f_globals .get ('__name__' ) == __name__ :
186
+ stacklevel += 1
187
+ frame = frame .f_back
174
188
warnings .warn ('Plural value must be an integer, got %s' %
175
189
(n .__class__ .__name__ ,),
176
- DeprecationWarning , 4 )
190
+ DeprecationWarning ,
191
+ stacklevel )
177
192
return n
178
193
179
194
@@ -200,7 +215,7 @@ def c2py(plural):
200
215
elif c == ')' :
201
216
depth -= 1
202
217
203
- ns = {'_as_int' : _as_int }
218
+ ns = {'_as_int' : _as_int , '__name__' : __name__ }
204
219
exec ('''if True:
205
220
def func(n):
206
221
if not isinstance(n, int):
@@ -280,6 +295,7 @@ def gettext(self, message):
280
295
def ngettext (self , msgid1 , msgid2 , n ):
281
296
if self ._fallback :
282
297
return self ._fallback .ngettext (msgid1 , msgid2 , n )
298
+ n = _as_int2 (n )
283
299
if n == 1 :
284
300
return msgid1
285
301
else :
@@ -293,6 +309,7 @@ def pgettext(self, context, message):
293
309
def npgettext (self , context , msgid1 , msgid2 , n ):
294
310
if self ._fallback :
295
311
return self ._fallback .npgettext (context , msgid1 , msgid2 , n )
312
+ n = _as_int2 (n )
296
313
if n == 1 :
297
314
return msgid1
298
315
else :
@@ -579,6 +596,7 @@ def dngettext(domain, msgid1, msgid2, n):
579
596
try :
580
597
t = translation (domain , _localedirs .get (domain , None ))
581
598
except OSError :
599
+ n = _as_int2 (n )
582
600
if n == 1 :
583
601
return msgid1
584
602
else :
@@ -598,6 +616,7 @@ def dnpgettext(domain, context, msgid1, msgid2, n):
598
616
try :
599
617
t = translation (domain , _localedirs .get (domain , None ))
600
618
except OSError :
619
+ n = _as_int2 (n )
601
620
if n == 1 :
602
621
return msgid1
603
622
else :
0 commit comments