import os
import base64
import gettext


def test_api_1(localedir, mofile):
    print 'test api 1'

    # Test basic interface
    os.environ['LANGUAGE'] = 'xx'

    print 'installing gettext'
    gettext.install('gettext', localedir)

    # test some translations
    print _('albatross')
    print _(u'mullusk')
    print _(r'Raymond Luxury Yach-t')
    print _(ur'nudge nudge')

    # double quotes
    print _("albatross")
    print _(u"mullusk")
    print _(r"Raymond Luxury Yach-t")
    print _(ur"nudge nudge")

    # triple single quotes
    print _('''albatross''')
    print _(u'''mullusk''')
    print _(r'''Raymond Luxury Yach-t''')
    print _(ur'''nudge nudge''')

    # triple double quotes
    print _("""albatross""")
    print _(u"""mullusk""")
    print _(r"""Raymond Luxury Yach-t""")
    print _(ur"""nudge nudge""")

    # multiline strings
    print _('''This module provides internationalization and localization
support for your Python programs by providing an interface to the GNU
gettext message catalog library.''')

    # test the alternative interface
    fp = open(os.path.join(mofile), 'rb')
    t = gettext.GNUTranslations(fp)
    fp.close()

    t.install()

    print _('nudge nudge')

    # try unicode return type
    t.install(unicode=1)

    print _('mullusk')



def test_api_2(localedir, mofile):
    print 'test api 2'

    gettext.bindtextdomain('gettext', localedir)
    print gettext.bindtextdomain('gettext') == localedir

    gettext.textdomain('gettext')
    # should return 'gettext'
    print gettext.textdomain()

    # local function override builtin
    _ = gettext.gettext

    # test some translations
    print _('albatross')
    print _(u'mullusk')
    print _(r'Raymond Luxury Yach-t')
    print _(ur'nudge nudge')

    # double quotes
    print _("albatross")
    print _(u"mullusk")
    print _(r"Raymond Luxury Yach-t")
    print _(ur"nudge nudge")

    # triple single quotes
    print _('''albatross''')
    print _(u'''mullusk''')
    print _(r'''Raymond Luxury Yach-t''')
    print _(ur'''nudge nudge''')

    # triple double quotes
    print _("""albatross""")
    print _(u"""mullusk""")
    print _(r"""Raymond Luxury Yach-t""")
    print _(ur"""nudge nudge""")

    # multiline strings
    print _('''This module provides internationalization and localization
support for your Python programs by providing an interface to the GNU
gettext message catalog library.''')

    # Now test dgettext()
    def _(message):
        return gettext.dgettext('gettext')



GNU_MO_DATA = '''\
3hIElQAAAAAFAAAAHAAAAEQAAAAHAAAAbAAAAAAAAACIAAAAFQAAAIkAAAChAAAAnwAAAAcAAABB
AQAACwAAAEkBAAAbAQAAVQEAABYAAABxAgAAoQAAAIgCAAAFAAAAKgMAAAkAAAAwAwAAAQAAAAQA
AAACAAAAAAAAAAUAAAAAAAAAAwAAAABSYXltb25kIEx1eHVyeSBZYWNoLXQAVGhpcyBtb2R1bGUg
cHJvdmlkZXMgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIGxvY2FsaXphdGlvbgpzdXBwb3J0IGZv
ciB5b3VyIFB5dGhvbiBwcm9ncmFtcyBieSBwcm92aWRpbmcgYW4gaW50ZXJmYWNlIHRvIHRoZSBH
TlUKZ2V0dGV4dCBtZXNzYWdlIGNhdGFsb2cgbGlicmFyeS4AbXVsbHVzawBudWRnZSBudWRnZQBQ
cm9qZWN0LUlkLVZlcnNpb246IDIuMApQTy1SZXZpc2lvbi1EYXRlOiAyMDAwLTA4LTI5IDEyOjE5
LTA0OjAwCkxhc3QtVHJhbnNsYXRvcjogQmFycnkgQS4gV2Fyc2F3IDxid2Fyc2F3QGJlb3Blbi5j
b20+Ckxhbmd1YWdlLVRlYW06IFhYIDxweXRob24tZGV2QHB5dGhvbi5vcmc+Ck1JTUUtVmVyc2lv
bjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1rb2k4X3IKQ29udGVudC1U
cmFuc2Zlci1FbmNvZGluZzogbm9uZQpHZW5lcmF0ZWQtQnk6IHB5Z2V0dGV4dC5weSAxLjEKAFRo
cm9hdHdvYmJsZXIgTWFuZ3JvdmUAR3V2ZiB6YnFoeXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZt
bmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVnIHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBv
bCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255
YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
'''


LOCALEDIR = os.path.join('xx', 'LC_MESSAGES')
MOFILE = os.path.join(LOCALEDIR, 'gettext.mo')

def setup():
    os.makedirs(LOCALEDIR)
    fp = open(MOFILE, 'wb')
    fp.write(base64.decodestring(GNU_MO_DATA))
    fp.close()

def teardown():
    os.unlink(MOFILE)
    os.removedirs(LOCALEDIR)


try:
    setup()
    test_api_1('.', MOFILE)
    test_api_2('.', MOFILE)
finally:
    teardown()
    pass



# For reference, here's the .po file used to created the .mo data above.

'''
# Dummy translation for Python's test_gettext.py module.
# Copyright (C) 2000 BeOpen.com
# Barry Warsaw <bwarsaw@beopen.com>, 2000.
#
msgid ""
msgstr ""
"Project-Id-Version: 2.0\n"
"PO-Revision-Date: 2000-08-29 12:19-04:00\n"
"Last-Translator: Barry A. Warsaw <bwarsaw@beopen.com>\n"
"Language-Team: XX <python-dev@python.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=koi8_r\n"
"Content-Transfer-Encoding: none\n"
"Generated-By: pygettext.py 1.1\n"

#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
#: test_gettext.py:98
msgid "nudge nudge"
msgstr "wink wink"

#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
msgid "albatross"
msgstr ""

#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
msgid "Raymond Luxury Yach-t"
msgstr "Throatwobbler Mangrove"

#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
#: test_gettext.py:96
msgid "mullusk"
msgstr "bacon"

#: test_gettext.py:40 test_gettext.py:101
msgid ""
"This module provides internationalization and localization\n"
"support for your Python programs by providing an interface to the GNU\n"
"gettext message catalog library."
msgstr ""
"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
"trggrkg zrffntr pngnybt yvoenel."
'''
