Search code examples
pythonkivykivy-language

How to make a file chooser in kivy to support files with different languages (English, Hebrew)


I am using kivy's file chooser and when there is a file of a folder with an Hebrew name, it prints gibberish... I want to support different languages if possible. Tried to change the font name in the file chooser, didn't work for me. Can you help me find out what am I doing wrong?


Solution

  • This is my solution. Half of the credit goes to Nykakin:

    from kivy.app import App
    from kivy.clock import Clock
    from kivy.lang import Builder
    from kivy.uix.boxlayout import BoxLayout
    
    
    Builder.load_string("""
    <MyWidget>:
        FileChooserListView
            id: filechooser
    """)
    
    class MyWidget(BoxLayout):
        def __init__(self, *args):
            Clock.schedule_once(self.update_filechooser_font, 0)
            return super(MyWidget, self).__init__(*args)
    
        def update_filechooser_font(self, *args):
            fc = self.ids.filechooser
            fc.bind(on_entry_added=self.update_file_list_entry)
            fc.bind(on_subentry_to_entry=self.update_file_list_entry)    
    
    
        def update_file_list_entry(self, file_chooser, file_list_entry, *args):
            file_list_entry.ids.filename.font_name = 'DejaVuSans.ttf'
    
            updated_text = []
            # to count where to insert the english letters
            english_counter = 0
    
            # the next statements used to split the name to name, extention
            splitted = file_list_entry.ids.filename.text.split('.')
            extention = ''
            if len(splitted) > 2:
                name = '.'.join(splitted)
            elif len(splitted) == 2:
                name = splitted[0]
                extention = splitted[1]
            else:
                name = '.'.join(splitted)
    
            # for each char in the reversed name (extention is always English and need to not be reversed)
            for char in name[::-1]:
                # if its in Hebrew append it regularly (reversed) and make sure to zero the counter
                if u"\u0590" <= char <= u"\u05EA":
                    updated_text.append(char)
                    english_counter = 0
                # if its an English character append it before the last english word (to un-reverse it) and increase the counter
                else:
                    updated_text.insert(len(updated_text) - english_counter, char)
                    english_counter += 1
    
            # add the extention in the end if exists
            if extention == '':
                file_list_entry.ids.filename.text = ''.join(updated_text)
            else:
                file_list_entry.ids.filename.text = ''.join(updated_text) + '.' + extention
    
    
    class MyApp(App):
        def build(self):
            return MyWidget()
    
    
    if __name__ == '__main__':
        MyApp().run()