I'm a bit concerned about using icu, but really just as a gut reaction, I haven't read the code or researched it much.
It looks like a huge set of libraries, which might be overkill for the use case of listing languages (did we check if/how much it increases memory usage?). It seems to partially overlap glib. It doesn't seem to be used by GNOME for the same functionality which is a bit suspect and might mean it's not very tested (maybe it's used by qt though?). Did you consider using the same code as the GNOME control panel? https://git.gnome.org/browse/gnome-desktop/tree/libgnome-desktop/gnome-languages.c It seems to be pretty self-contained so it could be cut and pasted. Or we could use the library directly. Just an idea. On 27 March 2013 15:57, Manuel Quiñones <ma...@laptop.org> wrote: > Important note: this adds a new dependency: PyICU (yum install pyicu > in Fedora). > > Improvements: > > - The list is now displayed in the actual language of the locale. For > example "Deutsch (Deutschland)" for 'de_DE' or "italiano (Italia)" > for 'it_IT'. The translated text is also accompanied by the text in > the current locale, with a foreground color that makes it less > relevant. > > - Translation issues that were in the previous implementation are gone > SL #4449 and #4327 . > > - Less load time. > http://bugs.sugarlabs.org/ticket/4449#comment:12 > > - Layout: the combo box now has a fixed width (1/3 of the screen) and > the text inside does ellipsize. > > Implementation: switch to PyICU, which is faster and has better > results than the current implementation, based on gettext and parsing > strings from the output of 'locale -av' command. > > Signed-off-by: Manuel Quiñones <ma...@laptop.org> > --- > extensions/cpsection/language/model.py | 81 > ++++++++++++++++++++++------------ > extensions/cpsection/language/view.py | 17 ++++--- > 2 files changed, 61 insertions(+), 37 deletions(-) > > diff --git a/extensions/cpsection/language/model.py > b/extensions/cpsection/language/model.py > index 17de6bb..9386cc7 100644 > --- a/extensions/cpsection/language/model.py > +++ b/extensions/cpsection/language/model.py > @@ -25,34 +25,60 @@ import locale > from gettext import gettext as _ > import subprocess > > +from PyICU import Locale > > _default_lang = '%s.%s' % locale.getdefaultlocale() > _standard_msg = _('Could not access ~/.i18n. Create standard settings.') > > > -def read_all_languages(): > - fdp = subprocess.Popen(['locale', '-av'], stdout=subprocess.PIPE) > +def _read_all_locale_codes(): > + """ > + Return the list of the available locales in the system. > + > + """ > + fdp = subprocess.Popen(['locale', '-a'], stdout=subprocess.PIPE) > lines = fdp.stdout.read().split('\n') > - locales = [] > + codes = [] > > for line in lines: > - if line.find('locale:') != -1: > - locale = line.split()[1] > - elif line.find('language |') != -1: > - lang = line.lstrip('language |') > - elif line.find('territory |') != -1: > - territory = line.lstrip('territory |') > - if locale.endswith('utf8') and len(lang): > - locales.append((lang, territory, locale)) > + if line.endswith('utf8'): > + codes.append(line) > > #FIXME: This is a temporary workaround for locales that are essential to > # OLPC, but are not in Glibc yet. > - locales.append(('Kreyol', 'Haiti', 'ht_HT.utf8')) > - locales.append(('Dari', 'Afghanistan', 'fa_AF.utf8')) > - locales.append(('Pashto', 'Afghanistan', 'ps_AF.utf8')) > + for code in ['ht_HT.utf8', 'fa_AF.utf8', 'ps_AF.utf8']: > + codes.append(code) > + > + return codes > + > +def _get_locale_data(locale_code): > + """ > + Return information about the locale. > + > + - 'language' and 'country' are in English. > > - locales.sort() > - return locales > + - 'description' is the text to be displayed to the user. It is in > + Pango markup with: 1. the locale display name in the locale > + itself (for example "Deutsch (Deutschland)" for 'de_DE.utf8' or > + "italiano (Italia)" for 'it_IT.utf8') and 2. the locale display > + name in the current locale.. > + > + """ > + locale = Locale(locale_code) > + english = Locale.getEnglish() > + description = "%s <span foreground=\"#808080\">%s</span>" % \ > + (locale.getDisplayName(locale), locale.getDisplayName()) > + return {'code': locale_code, > + 'language': locale.getDisplayLanguage(english), > + 'country': locale.getDisplayCountry(english), > + 'description': description} > + > +def read_all_languages(): > + """ > + Return information about each available locale. > + > + """ > + return [_get_locale_data(code) for code in _read_all_locale_codes()] > > > def _initialize(): > @@ -60,11 +86,11 @@ def _initialize(): > # when running under 'python -OO', all __doc__ fields are None, > # so += would fail -- and this function would be unnecessary anyway. > return > - languages = read_all_languages() > set_languages.__doc__ += '\n' > - for lang in languages: > - set_languages.__doc__ += '%s \n' % (lang[0].replace(' ', '_') + '/' + > - lang[1].replace(' ', '_')) > + for lang in read_all_languages(): > + set_languages.__doc__ += '%s \n' % \ > + (lang['language'].replace(' ', '_') + > + '/' + lang['country'].replace(' ', '_')) > > > def _write_i18n(lang_env, language_env): > @@ -120,9 +146,9 @@ def print_languages(): > for code in codes: > found_lang = False > for lang in languages: > - if lang[2].split('.')[0] == code.split('.')[0]: > - print lang[0].replace(' ', '_') + '/' + \ > - lang[1].replace(' ', '_') > + if lang['code'].split('.')[0] == code.split('.')[0]: > + print lang['language'].replace(' ', '_') + '/' + \ > + lang['country'].replace(' ', '_') > found_lang = True > break > if not found_lang: > @@ -142,12 +168,11 @@ def set_languages(languages): > set_languages_list([languages]) > return 1 > else: > - langs = read_all_languages() > - for lang, territory, locale in langs: > - code = lang.replace(' ', '_') + '/' \ > - + territory.replace(' ', '_') > + for lang in read_all_languages(): > + code = lang['language'].replace(' ', '_') + '/' \ > + + lang['country'].replace(' ', '_') > if code == languages: > - set_languages_list([locale]) > + set_languages_list([lang['code']]) > return 1 > print (_("Sorry I do not speak \'%s\'.") % languages) > > diff --git a/extensions/cpsection/language/view.py > b/extensions/cpsection/language/view.py > index 99275d4..77be2a6 100644 > --- a/extensions/cpsection/language/view.py > +++ b/extensions/cpsection/language/view.py > @@ -16,7 +16,9 @@ > # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > from gi.repository import Gtk > +from gi.repository import Gdk > from gi.repository import GObject > +from gi.repository import Pango > import gettext > > from sugar3.graphics import style > @@ -25,9 +27,6 @@ from sugar3.graphics.icon import Icon > from jarabe.controlpanel.sectionview import SectionView > from jarabe.controlpanel.inlinealert import InlineAlert > > -_translate_language = lambda msg: gettext.dgettext('iso_639', msg) > -_translate_country = lambda msg: gettext.dgettext('iso_3166', msg) > - > CLASS = 'Language' > ICON = 'module-language' > TITLE = gettext.gettext('Language') > @@ -99,16 +98,16 @@ class Language(SectionView): > self._attach_to_table(label, 0, 1, padding=1) > label.show() > > - store = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING) > - for language, country, code in self._available_locales: > - description = '%s (%s)' % (_translate_language(language), \ > - _translate_country(country)) > - store.append([code, description]) > + store = Gtk.ListStore(str, str) > + for locale in self._available_locales: > + store.append([locale['code'], locale['description']]) > > combobox = Gtk.ComboBox(model=store) > cell = Gtk.CellRendererText() > + cell.props.width = Gdk.Screen.width() / 3 > + cell.props.ellipsize = Pango.EllipsizeMode.MIDDLE > combobox.pack_start(cell, True) > - combobox.add_attribute(cell, 'text', 1) > + combobox.add_attribute(cell, 'markup', 1) > > if locale_code: > for row in store: > -- > 1.8.1.4 > > _______________________________________________ > Sugar-devel mailing list > Sugar-devel@lists.sugarlabs.org > http://lists.sugarlabs.org/listinfo/sugar-devel -- Daniel Narvaez _______________________________________________ Sugar-devel mailing list Sugar-devel@lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/sugar-devel