for git v1.5.2 (and below): chdir to the directory of the target file before executin...
[translate_toolkit.git] / lang / factory.py
blob65da4e2fdad9c808c43f4e8535b19bc6bc9c6eb9
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 #
4 # Copyright 2007 Zuza Software Foundation
5 #
6 # This file is part of translate.
8 # translate is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
13 # translate is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with translate; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 """This module provides a factory to instantiate language classes."""
24 from translate.lang import common
25 from translate.lang import data
27 prefix = "code_"
29 def getlanguage(code):
30 """This returns a language class.
32 @param code: The ISO 639 language code
33 """
34 if code:
35 code = code.replace("-", "_")
36 try:
37 try:
38 if code is None:
39 raise ImportError ("Can't determine language code")
40 exec("from translate.lang import %s" % code)
41 exec("langclass = %s.%s" % (code, code))
42 return langclass(code)
43 except SyntaxError, e:
44 # Someone is probably trying to import a language of which the code
45 # is a reserved word in python (like Icelandic (is) / Oriya (or))
46 # The convention to handle these is to have it in a file like
47 # code_is, for example.
48 exec("from translate.lang import %s%s" % (prefix, code))
49 exec("langclass = %s%s.%s%s" % (prefix, code, prefix, code))
50 return langclass(code)
51 except ImportError, e:
52 if code and code.startswith(prefix):
53 code = code[:len(prefix)]
54 simplercode = data.simplercode(code)
55 if simplercode:
56 relatedlanguage = getlanguage(simplercode)
57 if isinstance(relatedlanguage, common.Common):
58 relatedlanguage = relatedlanguage.__class__(code)
59 return relatedlanguage
60 else:
61 return common.Common(code)