Esempio n. 1
0
class Translator( xbmcgui.WindowXML ):
    CONTROL_LIST_A = 50

    def __init__( self, *args, **kwargs ):
        self.RestartXBMC_ReloadLanguage = False
        self.IsModified = False
        self.googleTrans = False
        self.listitems = []

        self.Addon = Addon( AddonId )
        self._get_settings()

    def _get_settings( self ):
        self.settings = {}
        self.settings[ "LanguagePath" ] = self.Addon.getSetting( "LanguagePath" )

        self.settings[ "viewmode" ]     = int( self.Addon.getSetting( "viewmode" ) )
        self.settings[ "sortmethod" ]   = int( self.Addon.getSetting( "sortmethod" ) )
        self.settings[ "sortorder" ]    = int( self.Addon.getSetting( "sortorder" ) )
        self.settings[ "savefolderviews" ] = ( self.Addon.getSetting( "savefolderviews" ) == "true" )

    def setListItems( self ):
        self.DefaultLanguage = "English"
        self.CurrentLanguage = xbmc.getLanguage()
        self.FolderLanguage  = self.settings[ "LanguagePath" ]
        self.DefaultFolderLanguage = "special://xbmc/language/"
        if not os.path.exists( xbmc.translatePath( self.FolderLanguage ) ):
            print "Folder language not exists! '%s'" % self.FolderLanguage
            self.FolderLanguage = self.DefaultFolderLanguage

        if not self.FolderLanguage.startswith( "special" ):
            for folder in [ "profile", "home", "xbmc" ]:
                special = "special://%s/" % folder
                self.FolderLanguage = self.FolderLanguage.replace( xbmc.translatePath( special ), special )

        if ( xbmc.translatePath( "special://skin/" ) in xbmc.translatePath( self.FolderLanguage ) ):
            self.FolderLanguage = "special://skin/language/"
        self.FolderLanguage = self.FolderLanguage.replace( "\\", "/" ).rstrip( "/" )

        self.setContainerProperties()
        # get languages source
        self.language = Language( self )
        self.listitems = self.language.listitems

    def onInit( self ):
        xbmc.executebuiltin( "ActivateWindow(busydialog)" )
        self.setSortMethodControl()
        self.setContainer( setviewmode=self.settings[ "viewmode" ] )
        LOG( "notice", "initialized took %s", time_took( START_TIME ) )
        xbmc.executebuiltin( "Dialog.Close(busydialog)" )

    def setSortMethodControl( self ):
        label = ( 20316, 103 )[ self.settings[ "sortmethod" ] ]
        self.getControl( 13 ).setLabel( xbmc.getLocalizedString( label ) )

    def setContainerProperties( self ):
        self.setProperty( "IsModified", ( "", "Language file has been changed!" )[ self.IsModified ] )
        self.setProperty( "CurrentLanguage", self.CurrentLanguage )
        self.setProperty( "FolderLanguage", self.FolderLanguage )
        self.setProperty( "CurrentEnglishString", "" )
        self.Addon = Addon( AddonId )
        self.setProperty( "ExtraKeyboard_TopOrBottom", ( "top", "bottom" )[ int( self.Addon.getSetting( "ExtraKB" ) ) ] )

    def setContainer( self, filter="", SelectId="", setviewmode=None ):
        if setviewmode is not None:
            self.ContainerId = ( 50, 51 )[ setviewmode ]
            if setviewmode: xbmc.executebuiltin( "SendClick(2)" )
        else:
            self.ContainerId = ( 50, 51 )[ xbmc.getCondVisibility( "Control.IsVisible(51)" ) ]
        try:

            if not bool( self.listitems ):
                if self.IsModified:
                    # ask for save change
                    self._save_change()
                self.IsModified = False
                self.googleTrans = False
                self.getControl( self.ContainerId ).reset()
                self.setListItems()

            self.setContainerProperties()
            if self.listitems:
                selectitem = 0

                additems = []
                if not filter:
                    additems = self.listitems
                else:
                    for li in self.listitems:
                        if filter == "UnTranslated" and li.getProperty( "UnTranslated" ) == "false":
                            continue
                        if filter == "Translated" and li.getProperty( "IsModified" ) != "true":
                            continue
                        additems.append( li )

                if additems:
                    if self.settings[ "sortmethod" ]:
                        additems = sorted( additems, key=lambda li: normalize_string( li.getLabel(), True ) )
                    if self.settings[ "sortorder" ]:
                        additems = list( reversed( additems ) )
                    for count, li in enumerate( additems ):
                        if li.getProperty( "id" ) == SelectId:
                            selectitem = count

                # add listitems
                self.getControl( self.ContainerId ).reset()
                self.getControl( self.ContainerId ).addItems( additems )
                if additems: #self.getControl( self.ContainerId ).size():
                    self.getControl( self.ContainerId ).selectItem( selectitem )
                    self.setFocusId( self.ContainerId )

            # fixe view on xbox
            if UNDER_XBOX and setviewmode is not None:
                xbmc.executebuiltin( "Container.SetViewMode(%i)" % self.ContainerId )
                xbmc.sleep( 20 )
                self.setFocusId( self.ContainerId )
        except:
            print_exc()

    def onFocus( self, controlID ):
        pass

    def sendClick( self, controlID ):
        try: self.onClick( controlID )
        except: print_exc()

    def getTranslate( self, text, minimal=2 ):
        translated = ""
        if text:
            if ( len( text ) <= minimal ) or text.isdigit():
                translated = text
            else:
                country = self.Addon.getSetting( "country" )
                if country.lower() == "auto": country = self.CurrentLanguage
                pDialog = xbmcgui.DialogProgress()
                pDialog.create( "Google Translate", "English to %s" % country, text, "Please wait..." )
                try:
                    import LanguageTools
                    translated = LanguageTools.translate_text( text, country, "google" )
                except:
                    print_exc()
        self.googleTrans = False
        xbmc.executebuiltin( "Dialog.Close(progressdialog)" )
        return translated

    def onClick( self, controlID ):
        try:
            self.ContainerId = ( 50, 51 )[ xbmc.getCondVisibility( "Control.IsVisible(51)" ) ]
            if controlID == self.ContainerId:
                # get clicked listitem
                listitem = self.getControl( self.ContainerId ).getSelectedItem()
                # get position
                pos = int( listitem.getProperty( "Position" ) )
                # get id
                id = listitem.getProperty( "id" )
                if id:
                    CurrentEnglishString = fixe_line_return( listitem.getLabel2(), True )
                    
                    DefaultText = fixe_line_return( listitem.getLabel(), True )
                    old_text = DefaultText
                    if self.googleTrans: old_text = self.getTranslate( CurrentEnglishString )
                    old_text = old_text or DefaultText

                    if ( self.Addon.getSetting( "BoldKB" ) == "true" ):
                        CurrentEnglishString = "[B]%s[/B]" % CurrentEnglishString
                    self.setProperty( "CurrentEnglishString", CurrentEnglishString )
                    self.setProperty( "ShowCurrentEnglishString", "true" )
                    
                    kb = xbmc.Keyboard( old_text, self.CurrentLanguage + " (Enter desired string)", False )
                    kb.doModal()
                    if kb.isConfirmed():
                        new_text = kb.getText()
                        if new_text != DefaultText:
                            new_text = fixe_line_return( new_text )
                            self.listitems[ pos ].setLabel( new_text )
                            self.listitems[ pos ].setProperty( "IsModified", "true" )
                            self.setProperty( "IsModified", "Language file has been changed!" )
                            self.IsModified = True
                    self.setProperty( "ShowCurrentEnglishString", "" )

            # PAS TRES BON COMME FILTRE :(
            UnTranslated = self.getControl( 19 ).isSelected()
            Translated = self.getControl( 20 ).isSelected()
            Changed = self.getControl( 21 ).isSelected()
            filter = ( "", "UnTranslated" )[ UnTranslated ]
            filter = ( filter, "Translated" )[ Translated ]
            filter = ( filter, "Changed" )[ Changed ]
            
            # get selected id for selectitem again, if controlID 22 clicked
            SelectId = xbmc.getInfoLabel( "Container(50).ListItem.Property(id)" ) or xbmc.getInfoLabel( "Container(51).ListItem.Property(id)" )
            if controlID == 19:
                # UNTRANSLATED BUTTON
                filter = ( "", "UnTranslated" )[ UnTranslated ]
                self.setContainer( filter, SelectId )
                self.getControl( 19 ).setSelected( UnTranslated )
                self.getControl( 20 ).setSelected( False )
                self.getControl( 21 ).setSelected( False )

            elif controlID == 20:
                # TRANSLATED BUTTON
                filter = ( "", "Translated" )[ Translated ]
                self.setContainer( filter, SelectId )
                self.getControl( 20 ).setSelected( Translated )
                self.getControl( 19 ).setSelected( False )
                self.getControl( 21 ).setSelected( False )

            elif controlID == 21:
                # CHANGED BUTTON
                filter = ( "", "Changed" )[ Changed ]
                self.setContainer( filter, SelectId )
                self.getControl( 21 ).setSelected( Changed )
                self.getControl( 19 ).setSelected( False )
                self.getControl( 20 ).setSelected( False )

            elif controlID == 22:
                # VIEW AS BUTTON
                self.settings[ "viewmode" ] = ( 1, 0 )[ self.settings[ "viewmode" ] ]
                xbmc.sleep( 50 )
                self.setContainer( filter, SelectId )

            elif controlID == 13:
                # SORT BY BUTTON
                self.settings[ "sortmethod" ] = ( 1, 0 )[ self.settings[ "sortmethod" ] ]
                self.setSortMethodControl()
                self.setContainer( filter, SelectId )

            elif controlID == 14:
                # SORT ASC BUTTON
                self.settings[ "sortorder" ] = ( 1, 0 )[ self.settings[ "sortorder" ] ]
                self.setContainer( filter, SelectId )

            elif controlID == 32:
                # SETTINGS BUTTON
                self.Addon = Addon( AddonId )
                self.Addon.openSettings()
                xbmc.sleep( 10 )
                if self.settings[ "LanguagePath" ] != self.Addon.getSetting( "LanguagePath" ):
                    self.settings[ "LanguagePath" ] = self.Addon.getSetting( "LanguagePath" )
                    self.listitems = []
                self.setContainer( filter, SelectId )

            elif controlID == 33:
                # FIND BUTTON
                default = self.getControl( 33 ).getLabel2()
                kb = xbmc.Keyboard( default, "Find what ...", False )
                kb.doModal()
                if kb.isConfirmed():
                    find_text = kb.getText()
                    #self.getControl( 33 ).setLabel( "Find", label2=find_text )
                    self.setProperty( "FindText", find_text )
                    if find_text:# and find_text != default:
                        for count, li in enumerate( self.listitems ):
                            #l_text = find_text.lower()
                            #match = ( l_text in li.getLabel().lower() ) or ( l_text in li.getLabel2().lower() ) or ( l_text == li.getProperty( "id" ) )
                            #match = match or ( l_text == li.getLabel().lower() ) or ( l_text == li.getLabel2().lower() )
                            #if not match: continue
                            if self.findText( find_text, li ):
                                self.getControl( self.ContainerId ).selectItem( count )
                                self.setFocusId( self.ContainerId )
                                break

            elif controlID == 34:
                # FIND NEXT BUTTON
                find_next = self.getControl( 33 ).getLabel2().encode( "utf-8" )
                pos = self.getControl( self.ContainerId ).getSelectedPosition()
                for count, li in enumerate( self.listitems ):
                    if count <= pos: continue
                    #if find_next in li.getLabel() or find_next == li.getProperty( "id" ):
                    if self.findText( find_next, li ):
                        self.getControl( self.ContainerId ).selectItem( count )
                        break

        except:
            print_exc()

    def findText( self, text, listitem ):
        return re.search( text.lower(), "|".join(
            [ listitem.getLabel(), listitem.getLabel2(), listitem.getProperty( "id" ) ]
            ).lower() )

    def onAction( self, action ):
        if action in [ 9, 10 ]:
            self._close_window()

        elif action == 117:
            try:
                cm = DialogContextMenu( "Translator-DialogContextMenu.xml", CWD, parent=self )
                cm.doModal()
                del cm
            except:
                print_exc()
        else:
            try:
                bcode = action.getButtonCode()
                # keyboard press F3
                if bcode == 127138: self.sendClick( 34 )
                #
            except:
                print_exc()

    def _close_window( self ):
        xbmc.executebuiltin( "ActivateWindow(busydialog)" )
        if self.settings[ "savefolderviews" ]:
            self.Addon.setSetting( "viewmode",   str( self.settings[ "viewmode" ] ) )
            self.Addon.setSetting( "sortmethod", str( self.settings[ "sortmethod" ] ) )
            self.Addon.setSetting( "sortorder",  str( self.settings[ "sortorder" ] ) )
            xbmc.sleep( 10 )

        if self.IsModified:
            # ask for save change
            xbmc.executebuiltin( "Dialog.Close(busydialog)" )
            self._save_change()

        try: del self.language
        except: pass
        self.close()

    def _save_change( self ):
        if xbmcgui.Dialog().yesno( "Confirm file save", "Language file has been changed!", self.language.current_xml, "Do you want save your change?", "" ):
            xbmc.executebuiltin( "ActivateWindow(busydialog)" )
            OK = self.language.save_strings()
            xbmc.executebuiltin( "Dialog.Close(busydialog)" )

            if ( self.DefaultFolderLanguage.rstrip( "/" ) == self.FolderLanguage ) or ( xbmc.translatePath( "special://skin/" ) in xbmc.translatePath( self.FolderLanguage ) ):
                # if default xbmc language file has been changed,
                # set True, XBMC require Restart or reload language
                self.RestartXBMC_ReloadLanguage = OK or self.RestartXBMC_ReloadLanguage
Esempio n. 2
0
class Translator(xbmcgui.WindowXML):
    CONTROL_LIST_A = 50

    def __init__(self, *args, **kwargs):
        self.RestartXBMC_ReloadLanguage = False
        self.IsModified = False
        self.googleTrans = False
        self.listitems = []

        self.Addon = Addon(AddonId)
        self._get_settings()

    def _get_settings(self):
        self.settings = {}
        self.settings["LanguagePath"] = self.Addon.getSetting("LanguagePath")

        self.settings["viewmode"] = int(self.Addon.getSetting("viewmode"))
        self.settings["sortmethod"] = int(self.Addon.getSetting("sortmethod"))
        self.settings["sortorder"] = int(self.Addon.getSetting("sortorder"))
        self.settings["savefolderviews"] = (
            self.Addon.getSetting("savefolderviews") == "true")

    def setListItems(self):
        self.DefaultLanguage = "English"
        self.CurrentLanguage = xbmc.getLanguage()
        self.FolderLanguage = self.settings["LanguagePath"]
        self.DefaultFolderLanguage = "special://xbmc/language/"
        if not os.path.exists(xbmc.translatePath(self.FolderLanguage)):
            print "Folder language not exists! '%s'" % self.FolderLanguage
            self.FolderLanguage = self.DefaultFolderLanguage

        if not self.FolderLanguage.startswith("special"):
            for folder in ["profile", "home", "xbmc"]:
                special = "special://%s/" % folder
                self.FolderLanguage = self.FolderLanguage.replace(
                    xbmc.translatePath(special), special)

        if (xbmc.translatePath("special://skin/")
                in xbmc.translatePath(self.FolderLanguage)):
            self.FolderLanguage = "special://skin/language/"
        self.FolderLanguage = self.FolderLanguage.replace("\\",
                                                          "/").rstrip("/")

        self.setContainerProperties()
        # get languages source
        self.language = Language(self)
        self.listitems = self.language.listitems

    def onInit(self):
        xbmc.executebuiltin("ActivateWindow(busydialog)")
        self.setSortMethodControl()
        self.setContainer(setviewmode=self.settings["viewmode"])
        LOG("notice", "initialized took %s", time_took(START_TIME))
        xbmc.executebuiltin("Dialog.Close(busydialog)")

    def setSortMethodControl(self):
        label = (20316, 103)[self.settings["sortmethod"]]
        self.getControl(13).setLabel(xbmc.getLocalizedString(label))

    def setContainerProperties(self):
        self.setProperty("IsModified",
                         ("",
                          "Language file has been changed!")[self.IsModified])
        self.setProperty("CurrentLanguage", self.CurrentLanguage)
        self.setProperty("FolderLanguage", self.FolderLanguage)
        self.setProperty("CurrentEnglishString", "")
        self.Addon = Addon(AddonId)
        self.setProperty("ExtraKeyboard_TopOrBottom",
                         ("top",
                          "bottom")[int(self.Addon.getSetting("ExtraKB"))])

    def setContainer(self, filter="", SelectId="", setviewmode=None):
        if setviewmode is not None:
            self.ContainerId = (50, 51)[setviewmode]
            if setviewmode: xbmc.executebuiltin("SendClick(2)")
        else:
            self.ContainerId = (
                50, 51)[xbmc.getCondVisibility("Control.IsVisible(51)")]
        try:

            if not bool(self.listitems):
                if self.IsModified:
                    # ask for save change
                    self._save_change()
                self.IsModified = False
                self.googleTrans = False
                self.getControl(self.ContainerId).reset()
                self.setListItems()

            self.setContainerProperties()
            if self.listitems:
                selectitem = 0

                additems = []
                if not filter:
                    additems = self.listitems
                else:
                    for li in self.listitems:
                        if filter == "UnTranslated" and li.getProperty(
                                "UnTranslated") == "false":
                            continue
                        if filter == "Translated" and li.getProperty(
                                "IsModified") != "true":
                            continue
                        additems.append(li)

                if additems:
                    if self.settings["sortmethod"]:
                        additems = sorted(additems,
                                          key=lambda li: normalize_string(
                                              li.getLabel(), True))
                    if self.settings["sortorder"]:
                        additems = list(reversed(additems))
                    for count, li in enumerate(additems):
                        if li.getProperty("id") == SelectId:
                            selectitem = count

                # add listitems
                self.getControl(self.ContainerId).reset()
                self.getControl(self.ContainerId).addItems(additems)
                if additems:  #self.getControl( self.ContainerId ).size():
                    self.getControl(self.ContainerId).selectItem(selectitem)
                    self.setFocusId(self.ContainerId)

            # fixe view on xbox
            if UNDER_XBOX and setviewmode is not None:
                xbmc.executebuiltin("Container.SetViewMode(%i)" %
                                    self.ContainerId)
                xbmc.sleep(20)
                self.setFocusId(self.ContainerId)
        except:
            print_exc()

    def onFocus(self, controlID):
        pass

    def sendClick(self, controlID):
        try:
            self.onClick(controlID)
        except:
            print_exc()

    def getTranslate(self, text, minimal=2):
        translated = ""
        if text:
            if (len(text) <= minimal) or text.isdigit():
                translated = text
            else:
                country = self.Addon.getSetting("country")
                if country.lower() == "auto": country = self.CurrentLanguage
                pDialog = xbmcgui.DialogProgress()
                pDialog.create("Google Translate", "English to %s" % country,
                               text, "Please wait...")
                try:
                    import LanguageTools
                    translated = LanguageTools.translate_text(
                        text, country, "google")
                except:
                    print_exc()
        self.googleTrans = False
        xbmc.executebuiltin("Dialog.Close(progressdialog)")
        return translated

    def onClick(self, controlID):
        try:
            self.ContainerId = (
                50, 51)[xbmc.getCondVisibility("Control.IsVisible(51)")]
            if controlID == self.ContainerId:
                # get clicked listitem
                listitem = self.getControl(self.ContainerId).getSelectedItem()
                # get position
                pos = int(listitem.getProperty("Position"))
                # get id
                id = listitem.getProperty("id")
                if id:
                    CurrentEnglishString = fixe_line_return(
                        listitem.getLabel2(), True)

                    DefaultText = fixe_line_return(listitem.getLabel(), True)
                    old_text = DefaultText
                    if self.googleTrans:
                        old_text = self.getTranslate(CurrentEnglishString)
                    old_text = old_text or DefaultText

                    if (self.Addon.getSetting("BoldKB") == "true"):
                        CurrentEnglishString = "[B]%s[/B]" % CurrentEnglishString
                    self.setProperty("CurrentEnglishString",
                                     CurrentEnglishString)
                    self.setProperty("ShowCurrentEnglishString", "true")

                    kb = xbmc.Keyboard(
                        old_text,
                        self.CurrentLanguage + " (Enter desired string)",
                        False)
                    kb.doModal()
                    if kb.isConfirmed():
                        new_text = kb.getText()
                        if new_text != DefaultText:
                            new_text = fixe_line_return(new_text)
                            self.listitems[pos].setLabel(new_text)
                            self.listitems[pos].setProperty(
                                "IsModified", "true")
                            self.setProperty(
                                "IsModified",
                                "Language file has been changed!")
                            self.IsModified = True
                    self.setProperty("ShowCurrentEnglishString", "")

            # PAS TRES BON COMME FILTRE :(
            UnTranslated = self.getControl(19).isSelected()
            Translated = self.getControl(20).isSelected()
            Changed = self.getControl(21).isSelected()
            filter = ("", "UnTranslated")[UnTranslated]
            filter = (filter, "Translated")[Translated]
            filter = (filter, "Changed")[Changed]

            # get selected id for selectitem again, if controlID 22 clicked
            SelectId = xbmc.getInfoLabel(
                "Container(50).ListItem.Property(id)") or xbmc.getInfoLabel(
                    "Container(51).ListItem.Property(id)")
            if controlID == 19:
                # UNTRANSLATED BUTTON
                filter = ("", "UnTranslated")[UnTranslated]
                self.setContainer(filter, SelectId)
                self.getControl(19).setSelected(UnTranslated)
                self.getControl(20).setSelected(False)
                self.getControl(21).setSelected(False)

            elif controlID == 20:
                # TRANSLATED BUTTON
                filter = ("", "Translated")[Translated]
                self.setContainer(filter, SelectId)
                self.getControl(20).setSelected(Translated)
                self.getControl(19).setSelected(False)
                self.getControl(21).setSelected(False)

            elif controlID == 21:
                # CHANGED BUTTON
                filter = ("", "Changed")[Changed]
                self.setContainer(filter, SelectId)
                self.getControl(21).setSelected(Changed)
                self.getControl(19).setSelected(False)
                self.getControl(20).setSelected(False)

            elif controlID == 22:
                # VIEW AS BUTTON
                self.settings["viewmode"] = (1, 0)[self.settings["viewmode"]]
                xbmc.sleep(50)
                self.setContainer(filter, SelectId)

            elif controlID == 13:
                # SORT BY BUTTON
                self.settings["sortmethod"] = (1,
                                               0)[self.settings["sortmethod"]]
                self.setSortMethodControl()
                self.setContainer(filter, SelectId)

            elif controlID == 14:
                # SORT ASC BUTTON
                self.settings["sortorder"] = (1, 0)[self.settings["sortorder"]]
                self.setContainer(filter, SelectId)

            elif controlID == 32:
                # SETTINGS BUTTON
                self.Addon = Addon(AddonId)
                self.Addon.openSettings()
                xbmc.sleep(10)
                if self.settings["LanguagePath"] != self.Addon.getSetting(
                        "LanguagePath"):
                    self.settings["LanguagePath"] = self.Addon.getSetting(
                        "LanguagePath")
                    self.listitems = []
                self.setContainer(filter, SelectId)

            elif controlID == 33:
                # FIND BUTTON
                default = self.getControl(33).getLabel2()
                kb = xbmc.Keyboard(default, "Find what ...", False)
                kb.doModal()
                if kb.isConfirmed():
                    find_text = kb.getText()
                    #self.getControl( 33 ).setLabel( "Find", label2=find_text )
                    self.setProperty("FindText", find_text)
                    if find_text:  # and find_text != default:
                        for count, li in enumerate(self.listitems):
                            #l_text = find_text.lower()
                            #match = ( l_text in li.getLabel().lower() ) or ( l_text in li.getLabel2().lower() ) or ( l_text == li.getProperty( "id" ) )
                            #match = match or ( l_text == li.getLabel().lower() ) or ( l_text == li.getLabel2().lower() )
                            #if not match: continue
                            if self.findText(find_text, li):
                                self.getControl(
                                    self.ContainerId).selectItem(count)
                                self.setFocusId(self.ContainerId)
                                break

            elif controlID == 34:
                # FIND NEXT BUTTON
                find_next = self.getControl(33).getLabel2().encode("utf-8")
                pos = self.getControl(self.ContainerId).getSelectedPosition()
                for count, li in enumerate(self.listitems):
                    if count <= pos: continue
                    #if find_next in li.getLabel() or find_next == li.getProperty( "id" ):
                    if self.findText(find_next, li):
                        self.getControl(self.ContainerId).selectItem(count)
                        break

        except:
            print_exc()

    def findText(self, text, listitem):
        return re.search(
            text.lower(), "|".join([
                listitem.getLabel(),
                listitem.getLabel2(),
                listitem.getProperty("id")
            ]).lower())

    def onAction(self, action):
        if action in [9, 10]:
            self._close_window()

        elif action == 117:
            try:
                cm = DialogContextMenu("Translator-DialogContextMenu.xml",
                                       CWD,
                                       parent=self)
                cm.doModal()
                del cm
            except:
                print_exc()
        else:
            try:
                bcode = action.getButtonCode()
                # keyboard press F3
                if bcode == 127138: self.sendClick(34)
                #
            except:
                print_exc()

    def _close_window(self):
        xbmc.executebuiltin("ActivateWindow(busydialog)")
        if self.settings["savefolderviews"]:
            self.Addon.setSetting("viewmode", str(self.settings["viewmode"]))
            self.Addon.setSetting("sortmethod",
                                  str(self.settings["sortmethod"]))
            self.Addon.setSetting("sortorder", str(self.settings["sortorder"]))
            xbmc.sleep(10)

        if self.IsModified:
            # ask for save change
            xbmc.executebuiltin("Dialog.Close(busydialog)")
            self._save_change()

        try:
            del self.language
        except:
            pass
        self.close()

    def _save_change(self):
        if xbmcgui.Dialog().yesno("Confirm file save",
                                  "Language file has been changed!",
                                  self.language.current_xml,
                                  "Do you want save your change?", ""):
            xbmc.executebuiltin("ActivateWindow(busydialog)")
            OK = self.language.save_strings()
            xbmc.executebuiltin("Dialog.Close(busydialog)")

            if (self.DefaultFolderLanguage.rstrip("/") == self.FolderLanguage
                ) or (xbmc.translatePath("special://skin/")
                      in xbmc.translatePath(self.FolderLanguage)):
                # if default xbmc language file has been changed,
                # set True, XBMC require Restart or reload language
                self.RestartXBMC_ReloadLanguage = OK or self.RestartXBMC_ReloadLanguage