5757 'bind_textdomain_codeset' ,
5858 'dgettext' , 'dngettext' , 'gettext' , 'lgettext' , 'ldgettext' ,
5959 'ldngettext' , 'lngettext' , 'ngettext' ,
60+ 'pgettext' , 'dpgettext' , 'npgettext' , 'dnpgettext' ,
61+ 'lpgettext' , 'ldpgettext' , 'lnpgettext' , 'ldnpgettext' ,
6062 ]
6163
6264_default_localedir = os .path .join (sys .base_prefix , 'share' , 'locale' )
@@ -299,6 +301,37 @@ def lngettext(self, msgid1, msgid2, n):
299301 return tmsg .encode (self ._output_charset )
300302 return tmsg .encode (locale .getpreferredencoding ())
301303
304+ def pgettext (self , context , message ):
305+ if self ._fallback :
306+ return self ._fallback .pgettext (context , message )
307+ return message
308+
309+ def lpgettext (self , context , message ):
310+ if self ._fallback :
311+ return self ._fallback .lpgettext (context , message )
312+ if self ._output_charset :
313+ return message .encode (self ._output_charset )
314+ return message .encode (locale .getpreferredencoding ())
315+
316+ def npgettext (self , context , msgid1 , msgid2 , n ):
317+ if self ._fallback :
318+ return self ._fallback .npgettext (context , msgid1 , msgid2 , n )
319+ if n == 1 :
320+ return msgid1
321+ else :
322+ return msgid2
323+
324+ def lnpgettext (self , context , msgid1 , msgid2 , n ):
325+ if self ._fallback :
326+ return self ._fallback .lnpgettext (context , msgid1 , msgid2 , n )
327+ if n == 1 :
328+ tmsg = msgid1
329+ else :
330+ tmsg = msgid2
331+ if self ._output_charset :
332+ return tmsg .encode (self ._output_charset )
333+ return tmsg .encode (locale .getpreferredencoding ())
334+
302335 def info (self ):
303336 return self ._info
304337
@@ -314,22 +347,22 @@ def set_output_charset(self, charset):
314347 def install (self , names = None ):
315348 import builtins
316349 builtins .__dict__ ['_' ] = self .gettext
317- if hasattr (names , "__contains__" ):
318- if "gettext" in names :
319- builtins .__dict__ ['gettext' ] = builtins .__dict__ ['_' ]
320- if "ngettext" in names :
321- builtins .__dict__ ['ngettext' ] = self .ngettext
322- if "lgettext" in names :
323- builtins .__dict__ ['lgettext' ] = self .lgettext
324- if "lngettext" in names :
325- builtins .__dict__ ['lngettext' ] = self .lngettext
350+ if names is not None :
351+ allowed = {'gettext' , 'lgettext' , 'lngettext' , 'lnpgettext' ,
352+ 'lpgettext' , 'ngettext' , 'npgettext' , 'pgettext' }
353+ for name in allowed & set (names ):
354+ builtins .__dict__ [name ] = getattr (self , name )
326355
327356
328357class GNUTranslations (NullTranslations ):
329358 # Magic number of .mo files
330359 LE_MAGIC = 0x950412de
331360 BE_MAGIC = 0xde120495
332361
362+ # The encoding of a msgctxt and a msgid in a .mo file is
363+ # msgctxt + "\x04" + msgid (gettext version >= 0.15)
364+ CONTEXT = "%s\x04 %s"
365+
333366 # Acceptable .mo versions
334367 VERSIONS = (0 , 1 )
335368
@@ -469,6 +502,56 @@ def ngettext(self, msgid1, msgid2, n):
469502 tmsg = msgid2
470503 return tmsg
471504
505+ def pgettext (self , context , message ):
506+ ctxt_msg_id = self .CONTEXT % (context , message )
507+ missing = object ()
508+ tmsg = self ._catalog .get (ctxt_msg_id , missing )
509+ if tmsg is missing :
510+ if self ._fallback :
511+ return self ._fallback .pgettext (context , message )
512+ return message
513+ return tmsg
514+
515+ def npgettext (self , context , msgid1 , msgid2 , n ):
516+ ctxt_msg_id = self .CONTEXT % (context , msgid1 )
517+ try :
518+ tmsg = self ._catalog [(ctxt_msg_id , self .plural (n ))]
519+ except KeyError :
520+ if self ._fallback :
521+ return self ._fallback .npgettext (context , msgid1 , msgid2 , n )
522+ if n == 1 :
523+ tmsg = msgid1
524+ else :
525+ tmsg = msgid2
526+ return tmsg
527+
528+ def lpgettext (self , context , message ):
529+ ctxt_msg_id = self .CONTEXT % (context , message )
530+ missing = object ()
531+ tmsg = self ._catalog .get (ctxt_msg_id , missing )
532+ if tmsg is missing :
533+ if self ._fallback :
534+ return self ._fallback .lpgettext (context , message )
535+ tmsg = message
536+ if self ._output_charset :
537+ return tmsg .encode (self ._output_charset )
538+ return tmsg .encode (locale .getpreferredencoding ())
539+
540+ def lnpgettext (self , context , msgid1 , msgid2 , n ):
541+ ctxt_msg_id = self .CONTEXT % (context , msgid1 )
542+ try :
543+ tmsg = self ._catalog [(ctxt_msg_id , self .plural (n ))]
544+ except KeyError :
545+ if self ._fallback :
546+ return self ._fallback .lnpgettext (context , msgid1 , msgid2 , n )
547+ if n == 1 :
548+ tmsg = msgid1
549+ else :
550+ tmsg = msgid2
551+ if self ._output_charset :
552+ return tmsg .encode (self ._output_charset )
553+ return tmsg .encode (locale .getpreferredencoding ())
554+
472555
473556# Locate a .mo file using the gettext strategy
474557def find (domain , localedir = None , languages = None , all = False ):
@@ -590,6 +673,7 @@ def dgettext(domain, message):
590673 return message
591674 return t .gettext (message )
592675
676+
593677def ldgettext (domain , message ):
594678 codeset = _localecodesets .get (domain )
595679 try :
@@ -598,6 +682,7 @@ def ldgettext(domain, message):
598682 return message .encode (codeset or locale .getpreferredencoding ())
599683 return t .lgettext (message )
600684
685+
601686def dngettext (domain , msgid1 , msgid2 , n ):
602687 try :
603688 t = translation (domain , _localedirs .get (domain , None ),
@@ -609,6 +694,7 @@ def dngettext(domain, msgid1, msgid2, n):
609694 return msgid2
610695 return t .ngettext (msgid1 , msgid2 , n )
611696
697+
612698def ldngettext (domain , msgid1 , msgid2 , n ):
613699 codeset = _localecodesets .get (domain )
614700 try :
@@ -621,18 +707,82 @@ def ldngettext(domain, msgid1, msgid2, n):
621707 return tmsg .encode (codeset or locale .getpreferredencoding ())
622708 return t .lngettext (msgid1 , msgid2 , n )
623709
710+
711+ def dpgettext (domain , context , message ):
712+ try :
713+ t = translation (domain , _localedirs .get (domain , None ),
714+ codeset = _localecodesets .get (domain ))
715+ except OSError :
716+ return message
717+ return t .pgettext (context , message )
718+
719+
720+ def ldpgettext (domain , context , message ):
721+ codeset = _localecodesets .get (domain )
722+ try :
723+ t = translation (domain , _localedirs .get (domain , None ), codeset = codeset )
724+ except OSError :
725+ return message .encode (codeset or locale .getpreferredencoding ())
726+ return t .lpgettext (context , message )
727+
728+
729+ def dnpgettext (domain , context , msgid1 , msgid2 , n ):
730+ try :
731+ t = translation (domain , _localedirs .get (domain , None ),
732+ codeset = _localecodesets .get (domain ))
733+ except OSError :
734+ if n == 1 :
735+ return msgid1
736+ else :
737+ return msgid2
738+ return t .npgettext (context , msgid1 , msgid2 , n )
739+
740+
741+ def ldnpgettext (domain , context , msgid1 , msgid2 , n ):
742+ codeset = _localecodesets .get (domain )
743+ try :
744+ t = translation (domain , _localedirs .get (domain , None ), codeset = codeset )
745+ except OSError :
746+ if n == 1 :
747+ tmsg = msgid1
748+ else :
749+ tmsg = msgid2
750+ return tmsg .encode (codeset or locale .getpreferredencoding ())
751+ return t .lnpgettext (context , msgid1 , msgid2 , n )
752+
753+
624754def gettext (message ):
625755 return dgettext (_current_domain , message )
626756
757+
627758def lgettext (message ):
628759 return ldgettext (_current_domain , message )
629760
761+
630762def ngettext (msgid1 , msgid2 , n ):
631763 return dngettext (_current_domain , msgid1 , msgid2 , n )
632764
765+
633766def lngettext (msgid1 , msgid2 , n ):
634767 return ldngettext (_current_domain , msgid1 , msgid2 , n )
635768
769+
770+ def pgettext (context , message ):
771+ return dpgettext (_current_domain , context , message )
772+
773+
774+ def lpgettext (context , message ):
775+ return ldpgettext (_current_domain , context , message )
776+
777+
778+ def npgettext (context , msgid1 , msgid2 , n ):
779+ return dnpgettext (_current_domain , context , msgid1 , msgid2 , n )
780+
781+
782+ def lnpgettext (context , msgid1 , msgid2 , n ):
783+ return ldnpgettext (_current_domain , context , msgid1 , msgid2 , n )
784+
785+
636786# dcgettext() has been deemed unnecessary and is not implemented.
637787
638788# James Henstridge's Catalog constructor from GNOME gettext. Documented usage
0 commit comments