File: generate_locale_list.py

package info (click to toggle)
ldm 2:2.18.06-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 1,236 kB
  • sloc: ansic: 4,599; sh: 266; python: 260; makefile: 109; sed: 16
file content (123 lines) | stat: -rwxr-xr-x 4,641 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/python3
# -*- coding: utf-8 -*-

#  Copyright 2009 Ryan Niebur <RyanRyan52@gmail.com>
#
#  Author: Ryan Niebur <RyanRyan52@gmail.com>
#
#  2009, Ryan Niebur <RyanRyan52@gmail.com>
#        Vagrant Cascadian <vagrant@freegeek.org>
#        St├ęphane Graber <stgraber@ubuntu.com>
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License as
#  published by the Free Software Foundation; either version 2 of the
#  License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program.  If not, you can find it on the World Wide
#  Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
#  Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
#  MA 02110-1301, USA.

from subprocess import *
from xml.etree import cElementTree as etree
import locale
import gettext
import re
import os
import sys


def build_language_map():
    map = {}
    for element in etree.parse('/usr/share/xml/iso-codes/iso_639.xml').findall('.//iso_639_entry'):
        if 'iso_639_1_code' in element.attrib:
            map[element.attrib['iso_639_1_code']] = element.attrib['name']
        elif 'iso_639_2B_code' in element.attrib:
            map[element.attrib['iso_639_2B_code']] = element.attrib['name']
        elif 'iso_639_2T_code' in element.attrib:
            map[element.attrib['iso_639_2T_code']] = element.attrib['name']

    return map

def build_territory_map():
    map = {}
    for element in etree.parse('/usr/share/xml/iso-codes/iso_3166.xml').findall('.//iso_3166_entry'):
        if 'alpha_2_code' in element.attrib: map[element.attrib['alpha_2_code']] = element.attrib['name']

    return map

def get_things():
    myarr = []
    if os.path.exists("/etc/debian_version"):
        cmd = ["cat",  "/usr/share/i18n/SUPPORTED"]
    else:
        cmd = ["locale",  "-a"]
    for thing in Popen(cmd, stdout=PIPE).stdout.readlines():
        try:
            thing=str(thing.decode("utf-8").strip())
            myarr.append(thing.split(".")[0].split(" ")[0])
        except UnicodeDecodeError:
            pass
    return myarr

def nice_name(my_locale):
    if my_locale == "":
        return ""
    if not re.search("_", my_locale) and len(my_locale) != 2:
        return ""
    my_locale = my_locale.split("@")[0]
    os.environ["LANGUAGE"] = my_locale
    locale.setlocale(locale.LC_ALL, '')
    split = my_locale.split("_")
    english_name = split[0]
    if len(split) > 1:
        english_territory = split[1]
    else:
        english_territory = ""
    if english_name in langmap:
        english_name = langmap[english_name]
    if english_territory in terrmap:
        english_territory = terrmap[english_territory]
    if len(english_name) > 0:
        try:
            translated_name = gettext.dgettext("iso_639", english_name)
        except:
            sys.stderr.write('error translating language, falling back to english: ' + my_locale + ' ' + english_name + '\n')
            translated_name = english_name
    else:
        translated_name = english_name
    if len(english_territory) > 0:
        try:
            translated_territory = gettext.dgettext("iso_3166", english_territory)
        except:
            sys.stderr.write('error translating territory, falling back to english: ' + my_locale + ' ' + english_territory + '\n')
            translated_territory = english_territory
    else:
        translated_territory = english_territory
    if len(translated_territory) > 0:
        return (translated_name + " (" + translated_territory + ")")
    else:
        return (translated_name)

if __name__ == "__main__":
    if len(sys.argv) > 1:
        sys.stdout = open(sys.argv[1], "w")
    langmap = build_language_map()
    terrmap = build_territory_map()
    my_locales = get_things()
    for my_locale in sorted(list(set(my_locales))):
        try:
            this_nice_name = nice_name(my_locale)
            if len(this_nice_name) > 0 and this_nice_name != my_locale:
                print(my_locale + " " + this_nice_name)
        except UnicodeEncodeError:
            sys.stderr.write('unicode error encountered, skipping locale: ' + my_locale + '\n')
        except UnicodeDecodeError:
            sys.stderr.write('unicode error encountered, skipping locale: ' + my_locale + '\n')