예제 #1
0
    def __model_append_langs(self, model, langs, visible):
        keys = list(langs.keys())
        keys.sort(key=functools.cmp_to_key(locale.strcoll))
        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None:
            loc = 'en_US'
        current_lang = IBus.get_language_name(loc)
        # move current language to the first place
        if current_lang in keys:
            keys.remove(current_lang)
            keys.insert(0, current_lang)

        #add "Others" to the end of the combo box
        if IBus.get_language_name("Other") in keys:
            keys.remove(IBus.get_language_name("Other"))
            keys += [IBus.get_language_name("Other")]
        for l in keys:
            iter1 = model.append(None)
            model.set(iter1, 0, l)

            def cmp_engine(a, b):
                if a.get_rank() == b.get_rank():
                    return locale.strcoll(a.get_longname(), b.get_longname())
                return int(b.get_rank() - a.get_rank())

            langs[l].sort(key=functools.cmp_to_key(cmp_engine))
            for e in langs[l]:
                iter2 = model.append(iter1)
                model.set(iter2, 0, e)
예제 #2
0
 def __gconf_get_lang_list_from_locale(self):
     common_list = ['en', 'Other']
     loc = None
     try:
         loc = locale.setlocale(locale.LC_ALL)
     except:
         pass
     if loc == None:
         return common_list
     current_lang = IBus.get_language_name(loc)
     if current_lang == None:
         return common_list
     group_list = self.__settings_xkblayoutconfig.get_strv('group-list')
     if len(group_list) == 0:
         return [loc] + common_list
     lang_list = None
     for group in group_list:
         group = group.replace('_', '-')
         langs = self.__settings_xkblayoutconfig.get_strv(group)
         for lang in langs:
             if current_lang == IBus.get_language_name(lang):
                 lang_list = langs
                 break
         if lang_list != None:
             break
     if lang_list == None:
         return [loc] + common_list
     return lang_list + common_list
예제 #3
0
 def __gconf_get_lang_list_from_locale(self):
     common_list = ['en', 'Other']
     if  self.__config == None:
         return None
     loc = None
     try:
        loc = locale.setlocale (locale.LC_ALL)
     except:
         pass
     if loc == None:
         return common_list
     current_lang = IBus.get_language_name(loc)
     if current_lang == None:
         return common_list
     group_list = self.__config.get_value("general/xkblayoutconfig",
                                          "group_list")
     if group_list == None:
         return [loc] + common_list
     group_list = list(group_list)
     lang_list = None
     for group in group_list:
         group = str(group)
         langs = list(self.__config.get_value("general/xkblayoutconfig",
                                               group))
         for lang in langs:
             lang = str(lang)
             if current_lang == IBus.get_language_name(lang):
                 lang_list = langs
                 break
         if lang_list != None:
             break
     if lang_list == None:
         return [loc] + common_list
     return lang_list + common_list
예제 #4
0
    def __model_append_langs(self, model, langs, visible):
        keys = langs.keys()
        keys.sort(locale.strcoll)
        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None:
            loc = 'en_US'
        current_lang = IBus.get_language_name(loc)
        # move current language to the first place
        if current_lang in keys:
            keys.remove(current_lang)
            keys.insert(0, current_lang)

        #add "Others" to the end of the combo box
        if IBus.get_language_name("Other") in keys:
            keys.remove(IBus.get_language_name("Other"))
            keys += [IBus.get_language_name("Other")]
        for l in keys:
            iter1 = model.append(None)
            model.set(iter1, 0, l)
            def cmp_engine(a, b):
                if a.get_rank() == b.get_rank():
                    return locale.strcoll(a.get_longname(), b.get_longname())
                return int(b.get_rank() - a.get_rank())
            langs[l].sort(cmp_engine)
            for e in langs[l]:
                iter2 = model.append(iter1)
                model.set(iter2, 0, e)
예제 #5
0
 def __has_engine_in_lang_list(self, engine, lang_list):
     retval = False
     for lang in lang_list:
         if IBus.get_language_name(lang) == \
             IBus.get_language_name(engine.props.language):
             retval = True
             break
     return retval
예제 #6
0
 def __sort_engines(self, model, a, b, data):
     engine_a = model[a][0]
     engine_b = model[b][0]
     language_a = IBus.get_language_name(engine_a.get_language())
     language_b = IBus.get_language_name(engine_b.get_language())
     label_a = "%s - %s" % (language_a, engine_a.get_longname())
     label_b = "%s - %s" % (language_b, engine_b.get_longname())
     return cmp(label_a, label_b)
예제 #7
0
 def __sort_engines(self, model, a, b, data):
     engine_a = model[a][0]
     engine_b = model[b][0]
     language_a = IBus.get_language_name(engine_a.get_language())
     language_b = IBus.get_language_name(engine_b.get_language())
     label_a = "%s - %s" % (language_a, engine_a.get_longname())
     label_b = "%s - %s" % (language_b, engine_b.get_longname())
     return cmp(label_a, label_b)
예제 #8
0
 def __has_engine_in_lang_list(self, engine, lang_list):
     retval = False
     for lang in lang_list:
         if IBus.get_language_name(lang) == \
             IBus.get_language_name(engine.props.language):
             retval = True
             break
     return retval
예제 #9
0
 def __sort_engines(self, model, a, b, data):
     engine_a = model[a][0]
     engine_b = model[b][0]
     language_a = IBus.get_language_name(engine_a.get_language())
     language_b = IBus.get_language_name(engine_b.get_language())
     label_a = "%s - %s" % (language_a, engine_a.get_longname())
     label_b = "%s - %s" % (language_b, engine_b.get_longname())
     # http://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons
     return (label_a > label_b) - (label_a < label_b)
예제 #10
0
 def __sort_engines(self, model, a, b, data):
     engine_a = model[a][0]
     engine_b = model[b][0]
     language_a = IBus.get_language_name(engine_a.get_language())
     language_b = IBus.get_language_name(engine_b.get_language())
     label_a = "%s - %s" % (language_a, engine_a.get_longname())
     label_b = "%s - %s" % (language_b, engine_b.get_longname())
     # http://docs.python.org/3.0/whatsnew/3.0.html#ordering-comparisons
     return (label_a > label_b) - (label_a < label_b)
예제 #11
0
    def __fill_text_view(self):
        text_buffer = self.__text_view.get_buffer()
        self.__create_tags(text_buffer)

        iter = text_buffer.get_iter_at_offset(0)
        text_buffer.insert_with_tags_by_name(iter, "\n ", "left_margin_16")
        text_buffer.insert_pixbuf(
            iter, self.__load_icon(self.__engine_desc.get_icon()))
        text_buffer.insert_with_tags_by_name(
            iter, "\n%s\n" % self.__engine_desc.get_longname(), "heading",
            "left_margin_16")
        text_buffer.insert_with_tags_by_name(
            iter,
            _("Language: %s\n") %
            IBus.get_language_name(self.__engine_desc.get_language()), "small",
            "bold", "left_margin_16")
        text_buffer.insert_with_tags_by_name(
            iter,
            _("Keyboard layout: %s\n") % self.__engine_desc.get_layout(),
            "small", "bold", "left_margin_16")
        text_buffer.insert_with_tags_by_name(
            iter,
            _("Author: %s\n") % self.__engine_desc.get_author(), "small",
            "bold", "left_margin_16")
        text_buffer.insert_with_tags_by_name(iter, _("Description:\n"),
                                             "small", "bold", "left_margin_16")
        text_buffer.insert_with_tags_by_name(
            iter, self.__engine_desc.get_description(), "wrap_text",
            "left_margin_32")
예제 #12
0
    def set_engines(self, engines):
        self.__model = Gtk.TreeStore(object)

        iter1 = self.__model.append(None)
        self.__model.set(iter1, 0, 0)
        lang_list = self.__gconf_get_lang_list_from_locale()
        lang = {}
        sub_lang = {}
        for e in engines:
            l = IBus.get_language_name(e.props.language)
            if lang_list == None or \
                self.__has_engine_in_lang_list(e, lang_list):
                if l not in lang:
                    lang[l] = []
                lang[l].append(e)
            else:
                if l not in sub_lang:
                    sub_lang[l] = []
                sub_lang[l].append(e)

        self.__model_append_langs(self.__model, lang, True)
        iter1 = self.__model.append(None)
        self.__model.set(iter1, 0, -1)

        self.__all_model = Gtk.TreeStore(object)
        iter1 = self.__all_model.append(None)
        self.__all_model.set(iter1, 0, 0)
        self.__model_append_langs(self.__all_model, lang, False)
        iter1 = self.__all_model.append(None)
        self.__all_model.set(iter1, 0, -1)
        self.__model_append_langs(self.__all_model, sub_lang, False)

        self.__toggle_sub_lang()
예제 #13
0
    def set_engines(self, engines):
        self.__model = Gtk.TreeStore(object)

        iter1 = self.__model.append(None)
        self.__model.set(iter1, 0, 0)
        lang_list = self.__gconf_get_lang_list_from_locale()
        lang = {}
        sub_lang = {}
        for e in engines:
            l = IBus.get_language_name(e.props.language)
            if lang_list == None or \
                self.__has_engine_in_lang_list(e, lang_list):
                if l not in lang:
                    lang[l] = []
                lang[l].append(e)
            else:
                if l not in sub_lang:
                    sub_lang[l] = []
                sub_lang[l].append(e)

        self.__model_append_langs(self.__model, lang, True)
        iter1 = self.__model.append(None)
        self.__model.set(iter1, 0, -1)

        self.__all_model = Gtk.TreeStore(object)
        iter1 = self.__all_model.append(None)
        self.__all_model.set(iter1, 0, 0)
        self.__model_append_langs(self.__all_model, lang, False)
        iter1 = self.__all_model.append(None)
        self.__all_model.set(iter1, 0, -1)
        self.__model_append_langs(self.__all_model, sub_lang, False)

        self.__toggle_sub_lang()
예제 #14
0
    def __fill_text_view(self):
        text_buffer = self.__text_view.get_buffer()
        self.__create_tags(text_buffer)

        iter = text_buffer.get_iter_at_offset(0)
        text_buffer.insert_with_tags_by_name(iter, "\n ",
                                             "left_margin_16")
        text_buffer.insert_pixbuf(iter,
                self.__load_icon(self.__engine_desc.get_icon()))
        text_buffer.insert_with_tags_by_name(iter,
                "\n%s\n" % self.__engine_desc.get_longname(),
                "heading", "left_margin_16")
        text_buffer.insert_with_tags_by_name(iter,
                _("Language: %s\n") % IBus.get_language_name(self.__engine_desc.get_language()),
                "small", "bold", "left_margin_16")
        text_buffer.insert_with_tags_by_name(iter,
                _("Keyboard layout: %s\n") % self.__engine_desc.get_layout(),
                "small", "bold", "left_margin_16")
        text_buffer.insert_with_tags_by_name(iter,
                _("Author: %s\n") % self.__engine_desc.get_author(),
                "small", "bold", "left_margin_16")
        text_buffer.insert_with_tags_by_name(iter,
                _("Description:\n"), "small", "bold", "left_margin_16")
        text_buffer.insert_with_tags_by_name(iter,
                self.__engine_desc.get_description(),
                "wrap_text", "left_margin_32")
예제 #15
0
    def set_engines(self, engines):
        self.__model = Gtk.TreeStore(object)

        iter1 = self.__model.append(None)
        self.__model.set(iter1, 0, 0)
        langs = {}
        for e in engines:
            l = IBus.get_language_name(e.get_language())
            if l == None:
                l = ""
            if l not in langs:
                langs[l] = []
            langs[l].append(e)

        keys = langs.keys()
        keys.sort(locale.strcoll)
        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None:
            loc = "en_US"
        current_lang = IBus.get_language_name(loc)
        # move current language to the first place
        if current_lang in keys:
            keys.remove(current_lang)
            keys.insert(0, current_lang)

        # add "Others" to the end of the combo box
        if IBus.get_language_name("Other") in keys:
            keys.remove(IBus.get_language_name("Other"))
            keys += [IBus.get_language_name("Other")]
        for l in keys:
            iter1 = self.__model.append(None)
            self.__model.set(iter1, 0, l)

            def cmp_engine(a, b):
                if a.get_rank() == b.get_rank():
                    return locale.strcoll(a.get_longname(), b.get_longname())
                return int(b.get_rank() - a.get_rank())

            langs[l].sort(cmp_engine)
            for e in langs[l]:
                iter2 = self.__model.append(iter1)
                self.__model.set(iter2, 0, e)

        self.set_model(self.__model)
        self.set_active(0)
예제 #16
0
    def set_engines(self, engines):
        self.__model = Gtk.TreeStore(object)

        iter1 = self.__model.append(None)
        self.__model.set(iter1, 0, 0)
        langs = {}
        for e in engines:
            l = IBus.get_language_name(e.get_language())
            if l == None:
                l = ""
            if l not in langs:
                langs[l] = []
            langs[l].append(e)

        keys = list(langs.keys())
        keys.sort(key=functools.cmp_to_key(locale.strcoll))
        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None or loc == 'C':
            loc = 'en_US'
        current_lang = IBus.get_language_name(loc)
        # move current language to the first place
        if current_lang in keys:
            keys.remove(current_lang)
            keys.insert(0, current_lang)

        #add "Others" to the end of the combo box
        if IBus.get_language_name("Other") in keys:
            keys.remove(IBus.get_language_name("Other"))
            keys += [IBus.get_language_name("Other")]
        for l in keys:
            iter1 = self.__model.append(None)
            self.__model.set(iter1, 0, l)

            def cmp_engine(a, b):
                if a.get_rank() == b.get_rank():
                    return locale.strcoll(a.get_longname(), b.get_longname())
                return int(b.get_rank() - a.get_rank())

            langs[l].sort(key=functools.cmp_to_key(cmp_engine))
            for e in langs[l]:
                iter2 = self.__model.append(iter1)
                self.__model.set(iter2, 0, e)

        self.set_model(self.__model)
        self.set_active(0)
예제 #17
0
파일: emojilang.py 프로젝트: zhou0/ibus
    def __load_lang_list(self):
        dictdir = os.path.dirname(__file__) + '/../dicts'
        for filename in os.listdir(dictdir):
            suffix = '.dict'
            if not filename.endswith(suffix):
                continue
            lang_id = filename[0:len(filename) - len(suffix)]
            prefix = 'emoji-'
            if not lang_id.startswith(prefix):
                continue
            lang_id = lang_id[len(prefix):]
            lang = LanguageString(lang_id, IBus.get_language_name(lang_id))
            self.__lang_list.append(lang)
        if len(self.__lang_list) == 0:
            print("Not found dicts in %s" % dictdir, file=sys.stderr)
            lang = LanguageString('en', IBus.get_language_name('en'))
            self.__lang_list.append(lang)
            return

        def cmp_lang(a, b):
            label_a = a.trans + a.id
            label_b = b.trans + b.id
            return (label_a > label_b) - (label_a < label_b)

        self.__lang_list.sort(key = functools.cmp_to_key(cmp_lang))

        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None or loc == 'C':
            loc = 'en_US'
        index = 0
        for lang in self.__lang_list:
            # move current language to the first place
            if lang.trans == IBus.get_language_name(loc):
                self.__lang_list.remove(lang)
                self.__lang_list.insert(index, lang)
                index += 1

        for lang in self.__lang_list:
            # move English to the second place
            if lang.trans == IBus.get_language_name('en'):
                self.__lang_list.remove(lang)
                self.__lang_list.insert(index, lang)
                index += 1
예제 #18
0
파일: emojilang.py 프로젝트: epico/ibus
    def __load_lang_list(self):
        dictdir = os.path.dirname(__file__) + '/../dicts'
        for filename in os.listdir(dictdir):
            suffix = '.dict'
            if not filename.endswith(suffix):
                continue
            lang_id = filename[0:len(filename) - len(suffix)]
            prefix = 'emoji-'
            if not lang_id.startswith(prefix):
                continue
            lang_id = lang_id[len(prefix):]
            lang = LanguageString(lang_id, IBus.get_language_name(lang_id))
            self.__lang_list.append(lang)
        if len(self.__lang_list) == 0:
            print("Not found dicts in %s" % dictdir, file=sys.stderr)
            lang = LanguageString('en', IBus.get_language_name('en'))
            self.__lang_list.append(lang)
            return

        def cmp_lang(a, b):
            label_a = a.trans + a.id
            label_b = b.trans + b.id
            return (label_a > label_b) - (label_a < label_b)

        self.__lang_list.sort(key = functools.cmp_to_key(cmp_lang))

        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None or loc == 'C':
            loc = 'en_US'
        index = 0
        for lang in self.__lang_list:
            # move current language to the first place
            if lang.trans == IBus.get_language_name(loc):
                self.__lang_list.remove(lang)
                self.__lang_list.insert(index, lang)
                index += 1

        for lang in self.__lang_list:
            # move English to the second place
            if lang.trans == IBus.get_language_name('en'):
                self.__lang_list.remove(lang)
                self.__lang_list.insert(index, lang)
                index += 1
예제 #19
0
파일: enginetreeview.py 프로젝트: ueno/ibus
 def __name_cell_data_cb(self, celllayout, renderer, model, it, data):
     engine = self.__model.get_value(it, 0)
     renderer.set_property("sensitive", True)
     language = IBus.get_language_name(engine.get_language())
     renderer.set_property("text", "%s - %s" % (language, engine.get_longname()))
     if self.__model.get_path(it).get_indices()[0] == 0:
         # default engine
         renderer.set_property("weight", Pango.Weight.BOLD)
     else:
         renderer.set_property("weight", Pango.Weight.NORMAL)
예제 #20
0
 def __name_cell_data_cb(self, celllayout, renderer, model, it, data):
     engine = self.__model.get_value(it, 0)
     renderer.set_property("sensitive", True)
     language = IBus.get_language_name(engine.get_language())
     renderer.set_property("text",
                           "%s - %s" % (language, engine.get_longname()))
     if self.__model.get_path(it).get_indices()[0] == 0:
         # default engine
         renderer.set_property("weight", Pango.Weight.BOLD)
     else:
         renderer.set_property("weight", Pango.Weight.NORMAL)
예제 #21
0
    def __name_cell_data_cb(self, celllayout, renderer, model, it, data):
        engine = self.__model.get_value(it, 0)

        # When append_engine() is called, self.__model.append(None)
        # is called internally and engine == None could happen in
        # a slow system.
        if engine == None:
            return

        renderer.set_property("sensitive", True)
        language = IBus.get_language_name(engine.get_language())
        renderer.set_property("text",
                "%s - %s" % (language, engine.get_longname()))
        renderer.set_property("weight", Pango.Weight.NORMAL)
예제 #22
0
    def __name_cell_data_cb(self, celllayout, renderer, model, it, data):
        engine = self.__model.get_value(it, 0)

        # When append_engine() is called, self.__model.append(None)
        # is called internally and engine == None could happen in
        # a slow system.
        if engine == None:
            return

        renderer.set_property("sensitive", True)
        language = IBus.get_language_name(engine.get_language())
        longname = i18n.gettext_engine_longname(engine)
        renderer.set_property("text", "%s - %s" % (language, longname))
        renderer.set_property("weight", Pango.Weight.NORMAL)
예제 #23
0
    def set_engines(self, engines):
        self.__engines_for_lang = {}
        self.__untrans_for_lang = {}
        for e in engines:
            l = IBus.get_language_name(e.get_language())
            if l == None:
                l = ''
            if l not in self.__engines_for_lang:
                self.__engines_for_lang[l] = []
            self.__engines_for_lang[l].append(e)

            # Retrieve Untranslated language names.
            backup_locale = locale.setlocale(locale.LC_ALL, None)

            def __set_untrans_with_locale(en_locale):
                locale.setlocale(locale.LC_ALL, en_locale)
                untrans = IBus.get_language_name(e.get_language())
                if untrans == None:
                    untrans = ''
                self.__untrans_for_lang[l] = untrans

            try:
                __set_untrans_with_locale('en_US.UTF-8')
            except locale.Error:
                try:
                    __set_untrans_with_locale('C')
                except locale.Error:
                    pass
            locale.setlocale(locale.LC_ALL, backup_locale)

        keys = list(self.__engines_for_lang.keys())
        keys.sort(key=functools.cmp_to_key(locale.strcoll))
        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None or loc == 'C':
            loc = 'en_US'
        current_lang = IBus.get_language_name(loc)
        # move current language to the first place
        if current_lang in keys:
            keys.remove(current_lang)
            keys.insert(0, current_lang)

        # move English to the second place
        en_lang = IBus.get_language_name('en_US')
        if en_lang != current_lang and en_lang in keys:
            keys.remove(en_lang)
            keys.insert(1, en_lang)

        #add 'Others' to the end of the combo box
        if IBus.get_language_name('Other') in keys:
            keys.remove(IBus.get_language_name('Other'))
            keys += [IBus.get_language_name('Other')]

        self.__langs = keys
        self.__show_lang_rows()
예제 #24
0
    def set_engines(self, engines):
        self.__engines_for_lang = {}
        self.__untrans_for_lang = {}
        for e in engines:
            l = IBus.get_language_name(e.get_language())
            if l == None:
                l = ''
            if l not in self.__engines_for_lang:
                self.__engines_for_lang[l] = []
            self.__engines_for_lang[l].append(e)

            # Retrieve Untranslated language names.
            backup_locale = locale.setlocale(locale.LC_ALL, None)
            try:
                locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
                untrans = IBus.get_language_name(e.get_language())
                if untrans == None:
                    untrans = ''
                self.__untrans_for_lang[l] = untrans
            except locale.Error:
                pass
            locale.setlocale(locale.LC_ALL, backup_locale)

        keys = list(self.__engines_for_lang.keys())
        keys.sort(key=functools.cmp_to_key(locale.strcoll))
        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None:
            loc = 'en_US'
        current_lang = IBus.get_language_name(loc)
        # move current language to the first place
        if current_lang in keys:
            keys.remove(current_lang)
            keys.insert(0, current_lang)

        # move English to the second place
        en_lang = IBus.get_language_name('en_US')
        if en_lang != current_lang and en_lang in keys:
            keys.remove(en_lang)
            keys.insert(1, en_lang)

        #add 'Others' to the end of the combo box
        if IBus.get_language_name('Other') in keys:
            keys.remove(IBus.get_language_name('Other'))
            keys += [IBus.get_language_name('Other')]

        self.__langs = keys
        self.__show_lang_rows()
예제 #25
0
    def set_engines(self, engines):
        #model
        self.__model = Gtk.TreeStore(object)

        iter1 = self.__model.append(None)
        self.__model.set(iter1, 0, 0)
        lang_list = self.__gconf_get_lang_list_from_locale()
        lang = {}
        sub_lang = {}
        for e in engines:
            l = IBus.get_language_name(e.props.language)
            if lang_list == None or \
                self.__has_engine_in_lang_list(e, lang_list):
                if l not in lang:
                    lang[l] = []
                lang[l].append(e)
            else:
                if l not in sub_lang:
                    sub_lang[l] = []
                sub_lang[l].append(e)

        self.__model_append_langs(self.__model, lang, True)
        iter1 = self.__model.append(None)
        #self.__model.set(iter1, 0, -1)

        #all model
        self.__all_model = Gtk.TreeStore(object)
        #it will add a column
        #iter1 = self.__all_model.append(None)
        #self.__all_model.set(iter1, 0, 0)
        self.__model_append_langs(self.__all_model, lang, False)
        #remove it ,it will add a column
        #iter1 = self.__all_model.append(None)
        #self.__all_model.set(iter1, 0, -1)
        #ok, it will add other region input method
        self.__model_append_langs(self.__all_model, sub_lang, False)

        self.__toggle_sub_lang()
예제 #26
0
    def set_engines(self, engines):
        self.__engines_for_lang = {}
        self.__untrans_for_lang = {}
        for e in engines:
            l = IBus.get_language_name(e.get_language())
            if l == None:
                l = ''
            if l not in self.__engines_for_lang:
                self.__engines_for_lang[l] = []
            i18n.init_textdomain(e.get_textdomain())
            row = self.__engine_row_new(e)
            self.__engines_for_lang[l].append(row)

            # Retrieve Untranslated language names.
            untrans = IBus.get_untranslated_language_name(e.get_language())
            if untrans == None:
                untrans = ''
            self.__untrans_for_lang[l] = untrans

        keys = list(self.__engines_for_lang.keys())
        keys.sort(key=functools.cmp_to_key(locale.strcoll))
        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None or loc == 'C':
            loc = 'en_US'
        current_lang = IBus.get_language_name(loc)
        # move current language to the first place
        if current_lang in keys:
            keys.remove(current_lang)
            keys.insert(0, current_lang)

        # move English to the second place
        en_lang = IBus.get_language_name('en_US')
        if en_lang != current_lang and en_lang in keys:
            keys.remove(en_lang)
            keys.insert(1, en_lang)

        #add 'Others' to the end of the combo box
        if IBus.get_language_name('Other') in keys:
            keys.remove(IBus.get_language_name('Other'))
            keys += [IBus.get_language_name('Other')]

        self.__langs = keys
        self.__show_lang_rows()
예제 #27
0
파일: emojilang.py 프로젝트: zhou0/ibus
class EmojiLangChooser(Gtk.Dialog):
    __gtype_name__ = 'EmojiLangChooser'
    __initial_languages = [ IBus.get_language_name('en_US'),
                            IBus.get_language_name('en_GB'),
                            IBus.get_language_name('de_DE'),
                            IBus.get_language_name('fr_FR'),
                            IBus.get_language_name('es_ES'),
                            IBus.get_language_name('zh_CN'),
                            IBus.get_language_name('ja_JP'),
                            IBus.get_language_name('ru_RU'),
                            IBus.get_language_name('ar_EG') ]


    def __init__(self, id = None, transient_for = None):
        super(EmojiLangChooser, self).__init__(
                title = _("Select a language"),
                transient_for = transient_for,
                resizable = True)
        buttons = (_("_Cancel"), Gtk.ResponseType.CANCEL,
                   _("_OK"), Gtk.ResponseType.APPLY)
        self.add_buttons(*buttons)

        if id == None:
            id = 'en'
        self.__id = id
        self.__engines_for_lang = {}
        self.__untrans_for_lang = {}
        self.__langs = {}
        self.__lang_list = []

        self.__scrolled = Gtk.ScrolledWindow(
                hscrollbar_policy = Gtk.PolicyType.NEVER,
                vscrollbar_policy = Gtk.PolicyType.NEVER,
                shadow_type = Gtk.ShadowType.IN,
                margin_start = 6,
                margin_end = 6,
                margin_top = 6,
                margin_bottom = 6)
        self.vbox.add(self.__scrolled)
        viewport = Gtk.Viewport()
        self.__scrolled.add(viewport)
        self.__list = Gtk.ListBox(vexpand = True,
                                  halign = Gtk.Align.FILL,
                                  valign = Gtk.Align.FILL)
        viewport.add(self.__list)

        self.__adjustment = self.__scrolled.get_vadjustment()
        self.__list.set_adjustment(self.__adjustment)
        self.__list.set_filter_func(self.__list_filter, None)
        self.__list.connect('row-activated', self.__row_activated)

        self.__showing_extra = False
        self.__more_row = self.__more_row_new()
        self.__load_lang_list()
        self.__show_lang_rows()
        self.show_all()


    def __load_lang_list(self):
        dictdir = os.path.dirname(__file__) + '/../dicts'
        for filename in os.listdir(dictdir):
            suffix = '.dict'
            if not filename.endswith(suffix):
                continue
            lang_id = filename[0:len(filename) - len(suffix)]
            prefix = 'emoji-'
            if not lang_id.startswith(prefix):
                continue
            lang_id = lang_id[len(prefix):]
            lang = LanguageString(lang_id, IBus.get_language_name(lang_id))
            self.__lang_list.append(lang)
        if len(self.__lang_list) == 0:
            print("Not found dicts in %s" % dictdir, file=sys.stderr)
            lang = LanguageString('en', IBus.get_language_name('en'))
            self.__lang_list.append(lang)
            return

        def cmp_lang(a, b):
            label_a = a.trans + a.id
            label_b = b.trans + b.id
            return (label_a > label_b) - (label_a < label_b)

        self.__lang_list.sort(key = functools.cmp_to_key(cmp_lang))

        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None or loc == 'C':
            loc = 'en_US'
        index = 0
        for lang in self.__lang_list:
            # move current language to the first place
            if lang.trans == IBus.get_language_name(loc):
                self.__lang_list.remove(lang)
                self.__lang_list.insert(index, lang)
                index += 1

        for lang in self.__lang_list:
            # move English to the second place
            if lang.trans == IBus.get_language_name('en'):
                self.__lang_list.remove(lang)
                self.__lang_list.insert(index, lang)
                index += 1


    def __list_filter(self, row, data):
        if row.id == self.__id:
            self.__list.select_row(row)
        if row == self.__more_row:
            return not self.__showing_extra
        if not self.__showing_extra and row.is_extra:
            return False
        return True


    def __row_activated(self, box, row):
        if row == self.__more_row:
            self.__show_more()
            return
        self.__id = row.id


    def __padded_label_new(self, text, icon, alignment, direction):
        hbox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL)

        if direction == ROW_TRAVEL_DIRECTION_BACKWARD:
            rtl = (Gtk.Widget.get_default_direction() == \
                   Gtk.TextDirection.RTL)
            if rtl:
                arrow = Gtk.Image.new_from_icon_name(
                    'go-previous-rtl-symbolic', Gtk.IconSize.MENU)
            else:
                arrow = Gtk.Image.new_from_icon_name(
                    'go-previous-symbolic', Gtk.IconSize.MENU)
            hbox.pack_start(arrow, False, True, 0)

        if icon != None:
            pixbuf = load_icon(icon, Gtk.IconSize.LARGE_TOOLBAR)
            image = Gtk.Image(pixbuf = pixbuf)
            hbox.pack_start(image, False, True, 0)

        label = Gtk.Label(label = text)
        label.set_halign(alignment)
        label.set_valign(Gtk.Align.CENTER)
        label.set_margin_start(20)
        label.set_margin_end(20)
        label.set_margin_top(6)
        label.set_margin_bottom(6)
        hbox.pack_start(label, True, True, 0)
        return hbox


    def __list_box_row_new(self, lang):
        row = Gtk.ListBoxRow()
        row.trans = lang.trans
        row.id = lang.id
        row.is_extra = False
        return row


    def __lang_row_new(self, lang, prev_lang):
        row = self.__list_box_row_new(lang)
        label = lang.trans
        if lang.id == self.__id:
            row.is_extra = False
        elif prev_lang != None and label == prev_lang.trans:
            label = "%s (%s)" % (lang.trans, lang.id)
            row.is_extra = True
        elif not self.__showing_extra and \
           lang.trans not in self.__initial_languages:
            row.is_extra = True
        widget = self.__padded_label_new(label,
                                         None,
                                         Gtk.Align.CENTER,
                                         ROW_TRAVEL_DIRECTION_NONE)
        row.add(widget)
        return row


    def __more_row_new(self):
        row = Gtk.ListBoxRow()
        row.id = None
        hbox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL)
        row.add(hbox)
        row.set_tooltip_text(_("More…"))
        arrow = Gtk.Image.new_from_icon_name('view-more-symbolic',
                                             Gtk.IconSize.MENU)
        arrow.set_margin_start(20)
        arrow.set_margin_end(20)
        arrow.set_margin_top(6)
        arrow.set_margin_bottom(6)
        arrow.set_halign(Gtk.Align.CENTER)
        arrow.set_valign(Gtk.Align.CENTER)
        hbox.pack_start(arrow, True, True, 0)
        return row


    def __set_fixed_size(self):
        if self.__scrolled.get_policy()[0] == Gtk.PolicyType.AUTOMATIC:
            return
        (width, height) = self.get_size()
        self.set_size_request(width, height)
        self.__scrolled.set_policy(Gtk.PolicyType.AUTOMATIC,
                                   Gtk.PolicyType.AUTOMATIC)


    def __remove_all_children(self):
        for l in self.__list.get_children():
            self.__list.remove(l)


    def __show_lang_rows(self):
        self.__remove_all_children()
        prev_lang = None
        for lang in self.__lang_list:
            row = self.__lang_row_new(lang, prev_lang)
            self.__list.add(row)
            prev_lang = lang
        self.__list.add(self.__more_row)
        self.__list.show_all()
        self.__adjustment.set_value(self.__adjustment.get_lower())
        self.__list.invalidate_filter()
        self.__list.set_selection_mode(Gtk.SelectionMode.SINGLE)


    def __show_more(self):
        self.__set_fixed_size()
        self.__showing_extra = True
        self.__list.invalidate_filter()


    def get_selected_lang(self):
        return self.__id
예제 #28
0
파일: emojilang.py 프로젝트: zhou0/ibus
 def set_lang(self, lang):
     self.__lang = lang
     self.notify("lang")
     self.set_label(IBus.get_language_name(lang))
예제 #29
0
 def __set_untrans_with_locale(en_locale):
     locale.setlocale(locale.LC_ALL, en_locale)
     untrans = IBus.get_language_name(e.get_language())
     if untrans == None:
         untrans = ''
     self.__untrans_for_lang[l] = untrans
예제 #30
0
 def __set_untrans_with_locale(en_locale):
     locale.setlocale(locale.LC_ALL, en_locale)
     untrans = IBus.get_language_name(e.get_language())
     if untrans == None:
         untrans = ''
     self.__untrans_for_lang[l] = untrans
예제 #31
0
파일: emojilang.py 프로젝트: epico/ibus
 def set_lang(self, lang):
     self.__lang = lang
     self.notify("lang")
     self.set_label(IBus.get_language_name(lang))
예제 #32
0
class EngineDialog(Gtk.Dialog):
    __gtype_name__ = 'EngineDialog'
    __initial_languages = [
        IBus.get_language_name('en_US'),
        IBus.get_language_name('en_GB'),
        IBus.get_language_name('de_DE'),
        IBus.get_language_name('fr_FR'),
        IBus.get_language_name('es_ES'),
        IBus.get_language_name('zh_CN'),
        IBus.get_language_name('ja_JP'),
        IBus.get_language_name('ru_RU'),
        IBus.get_language_name('ar_EG')
    ]

    def __init__(self, transient_for=None):
        super(EngineDialog, self).__init__(title=_("Select an input method"),
                                           transient_for=transient_for,
                                           resizable=True)
        buttons = (_("_Cancel"), Gtk.ResponseType.CANCEL, _("_Add"),
                   Gtk.ResponseType.APPLY)
        self.add_buttons(*buttons)
        self.set_response_sensitive(Gtk.ResponseType.APPLY, False)

        self.__engines_for_lang = {}
        self.__untrans_for_lang = {}
        self.__langs = {}

        self.__scrolled = Gtk.ScrolledWindow(
            hscrollbar_policy=Gtk.PolicyType.NEVER,
            vscrollbar_policy=Gtk.PolicyType.NEVER,
            shadow_type=Gtk.ShadowType.IN,
            margin_left=6,
            margin_right=6,
            margin_top=6,
            margin_bottom=6)
        self.vbox.add(self.__scrolled)
        viewport = Gtk.Viewport()
        self.__scrolled.add(viewport)
        self.__list = Gtk.ListBox(vexpand=True,
                                  halign=Gtk.Align.FILL,
                                  valign=Gtk.Align.FILL)
        viewport.add(self.__list)

        self.__adjustment = self.__scrolled.get_vadjustment()
        self.__list.set_adjustment(self.__adjustment)
        self.__list.set_filter_func(self.__list_filter, None)
        self.__list.connect('row-activated', self.__row_activated)
        self.__list.connect('row-selected', self.__row_selected)

        self.__showing_extra = False
        self.__more_row = self.__more_row_new()

        self.__filter_timeout_id = 0
        self.__filter_word = None
        self.__filter_entry = Gtk.SearchEntry(hexpand=True,
                                              margin_left=6,
                                              margin_right=6,
                                              margin_top=6,
                                              margin_bottom=6)
        self.__filter_entry.set_no_show_all(True)
        self.__filter_entry.connect('search-changed', self.__filter_changed)
        self.vbox.add(self.__filter_entry)

        self.show_all()

    def __list_filter(self, row, data):
        if row == self.__more_row:
            return not self.__showing_extra
        if not self.__showing_extra and row.is_extra:
            return False
        if self.__filter_word == None:
            return True

        name = row.name.lower()
        untrans = row.untrans.lower()
        if self.__filter_word != None:
            word = self.__filter_word.lower()
            if name.startswith(word):
                return True
            if untrans.startswith(word):
                return True
        return False

    def __row_activated(self, box, row):
        if row == self.__more_row:
            self.__show_more()
            return
        if row.back:
            self.__filter_entry.set_text('')
            self.__show_lang_rows()
            return
        if row.lang_info:
            self.__filter_entry.set_text('')
            self.__show_engines_for_lang(row)
            return

    def __row_selected(self, box, row):
        self.set_response_sensitive(Gtk.ResponseType.APPLY, row != None)

    def __padded_label_new(self, text, icon, alignment, direction):
        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)

        if direction == ROW_TRAVEL_DIRECTION_BACKWARD:
            rtl = (Gtk.Widget.get_default_direction() == \
                   Gtk.TextDirection.RTL)
            if rtl:
                arrow = Gtk.Image.new_from_icon_name(
                    'go-previous-rtl-symbolic', Gtk.IconSize.MENU)
            else:
                arrow = Gtk.Image.new_from_icon_name('go-previous-symbolic',
                                                     Gtk.IconSize.MENU)
            hbox.pack_start(arrow, False, True, 0)

        if icon != None:
            pixbuf = load_icon(icon, Gtk.IconSize.LARGE_TOOLBAR)
            image = Gtk.Image(pixbuf=pixbuf)
            hbox.pack_start(image, False, True, 0)

        label = Gtk.Label(label=text)
        label.set_halign(alignment)
        label.set_valign(Gtk.Align.CENTER)
        label.set_margin_left(20)
        label.set_margin_right(20)
        label.set_margin_top(6)
        label.set_margin_bottom(6)
        hbox.pack_start(label, True, True, 0)
        return hbox

    def __list_box_row_new(self, text):
        row = Gtk.ListBoxRow()
        row.name = text
        row.is_extra = False
        row.lang_info = False
        row.back = False
        row.untrans = ''
        row.engine = None
        return row

    def __lang_row_new(self, text):
        row = self.__list_box_row_new(text)
        row.lang_info = True
        row.untrans = self.__untrans_for_lang[text]
        if not self.__showing_extra and text not in self.__initial_languages:
            row.is_extra = True
        widget = self.__padded_label_new(text, None, Gtk.Align.CENTER,
                                         ROW_TRAVEL_DIRECTION_NONE)
        row.add(widget)
        return row

    def __more_row_new(self):
        row = Gtk.ListBoxRow()
        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL)
        row.add(hbox)
        row.set_tooltip_text(_("More…"))
        arrow = Gtk.Image.new_from_icon_name('view-more-symbolic',
                                             Gtk.IconSize.MENU)
        arrow.set_margin_left(20)
        arrow.set_margin_right(20)
        arrow.set_margin_top(6)
        arrow.set_margin_bottom(6)
        arrow.set_halign(Gtk.Align.CENTER)
        arrow.set_valign(Gtk.Align.CENTER)
        hbox.pack_start(arrow, True, True, 0)
        return row

    def __back_row_new(self, text):
        row = self.__list_box_row_new(text)
        row.lang_info = True
        row.back = True
        widget = self.__padded_label_new(text, None, Gtk.Align.CENTER,
                                         ROW_TRAVEL_DIRECTION_BACKWARD)
        row.add(widget)
        return row

    def __engine_row_new(self, engine):
        row = self.__list_box_row_new(engine.get_longname())
        row.set_tooltip_text(engine.get_description())
        row.engine = engine
        widget = self.__padded_label_new(engine.get_longname(),
                                         engine.get_icon(), Gtk.Align.START,
                                         ROW_TRAVEL_DIRECTION_NONE)
        row.add(widget)
        return row

    def __set_fixed_size(self):
        if self.__scrolled.get_policy()[0] == Gtk.PolicyType.AUTOMATIC:
            return
        (width, height) = self.get_size()
        self.set_size_request(width, height)
        self.__scrolled.set_policy(Gtk.PolicyType.AUTOMATIC,
                                   Gtk.PolicyType.AUTOMATIC)

    def __remove_all_children(self):
        for l in self.__list.get_children():
            self.__list.remove(l)

    def __add_engine_rows_for_lang(self, row):
        lang = row.name

        def cmp_engine(a, b):
            if a.get_rank() == b.get_rank():
                return locale.strcoll(a.get_longname(), b.get_longname())
            return int(b.get_rank() - a.get_rank())

        self.__engines_for_lang[lang].sort(
            key=functools.cmp_to_key(cmp_engine))
        for e in self.__engines_for_lang[lang]:
            row = self.__engine_row_new(e)
            self.__list.add(row)

    def __show_lang_rows(self):
        self.__remove_all_children()
        for lang in self.__langs:
            row = self.__lang_row_new(lang)
            self.__list.add(row)
        self.__list.add(self.__more_row)
        self.__list.show_all()
        self.__adjustment.set_value(self.__adjustment.get_lower())
        self.__list.invalidate_filter()
        self.__list.set_selection_mode(Gtk.SelectionMode.SINGLE)

    def __show_more(self):
        self.__set_fixed_size()
        self.__filter_entry.show()
        self.__showing_extra = True
        self.__list.invalidate_filter()

    def __show_engines_for_lang(self, row):
        text = row.name
        self.__set_fixed_size()
        self.__remove_all_children()
        row = self.__back_row_new(text)
        self.__list.add(row)
        self.__add_engine_rows_for_lang(row)
        self.__list.show_all()

    def __do_filter(self):
        text = self.__filter_entry.get_text()
        if text == '':
            self.__filter_word = None
        else:
            self.__filter_word = text
        self.__list.invalidate_filter()
        self.__filter_timeout_id = 0
        return False

    def __filter_changed(self, entry):
        if self.__filter_timeout_id == 0:
            self.__filter_timeout_id = GLib.timeout_add(150, self.__do_filter)

    def set_engines(self, engines):
        self.__engines_for_lang = {}
        self.__untrans_for_lang = {}
        for e in engines:
            l = IBus.get_language_name(e.get_language())
            if l == None:
                l = ''
            if l not in self.__engines_for_lang:
                self.__engines_for_lang[l] = []
            self.__engines_for_lang[l].append(e)

            # Retrieve Untranslated language names.
            backup_locale = locale.setlocale(locale.LC_ALL, None)
            locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
            untrans = IBus.get_language_name(e.get_language())
            locale.setlocale(locale.LC_ALL, backup_locale)
            if untrans == None:
                untrans = ''
            self.__untrans_for_lang[l] = untrans

        keys = list(self.__engines_for_lang.keys())
        keys.sort(key=functools.cmp_to_key(locale.strcoll))
        loc = locale.getlocale()[0]
        # None on C locale
        if loc == None:
            loc = 'en_US'
        current_lang = IBus.get_language_name(loc)
        # move current language to the first place
        if current_lang in keys:
            keys.remove(current_lang)
            keys.insert(0, current_lang)

        # move English to the second place
        en_lang = IBus.get_language_name('en_US')
        if en_lang != current_lang and en_lang in keys:
            keys.remove(en_lang)
            keys.insert(1, en_lang)

        #add 'Others' to the end of the combo box
        if IBus.get_language_name('Other') in keys:
            keys.remove(IBus.get_language_name('Other'))
            keys += [IBus.get_language_name('Other')]

        self.__langs = keys
        self.__show_lang_rows()

    def get_selected_engine(self):
        row = self.__list.get_selected_row()
        if row == None:
            return None
        return row.engine