├── LICENSE.txt ├── addon.xml ├── default.py ├── resources ├── data │ └── default_files.json ├── images │ ├── folder-icon.png │ ├── icon.png │ ├── plus-icon.png │ ├── screenshot1.jpg │ ├── screenshot2.jpg │ ├── screenshot3.jpg │ ├── screenshot4.jpg │ ├── screenshot5.jpg │ └── screenshot6.jpg ├── language │ ├── resource.language.af_za │ │ └── strings.po │ ├── resource.language.am_et │ │ └── strings.po │ ├── resource.language.ar_sa │ │ └── strings.po │ ├── resource.language.ast_es │ │ └── strings.po │ ├── resource.language.az_az │ │ └── strings.po │ ├── resource.language.be_by │ │ └── strings.po │ ├── resource.language.bg_bg │ │ └── strings.po │ ├── resource.language.bs_ba │ │ └── strings.po │ ├── resource.language.ca_es │ │ └── strings.po │ ├── resource.language.cs_cz │ │ └── strings.po │ ├── resource.language.cy_gb │ │ └── strings.po │ ├── resource.language.da_dk │ │ └── strings.po │ ├── resource.language.de_de │ │ └── strings.po │ ├── resource.language.el_gr │ │ └── strings.po │ ├── resource.language.en_au │ │ └── strings.po │ ├── resource.language.en_gb │ │ └── strings.po │ ├── resource.language.en_nz │ │ └── strings.po │ ├── resource.language.en_us │ │ └── strings.po │ ├── resource.language.eo │ │ └── strings.po │ ├── resource.language.es_ar │ │ └── strings.po │ ├── resource.language.es_es │ │ └── strings.po │ ├── resource.language.es_mx │ │ └── strings.po │ ├── resource.language.et_ee │ │ └── strings.po │ ├── resource.language.eu_es │ │ └── strings.po │ ├── resource.language.fa_af │ │ └── strings.po │ ├── resource.language.fa_ir │ │ └── strings.po │ ├── resource.language.fi_fi │ │ └── strings.po │ ├── resource.language.fo_fo │ │ └── strings.po │ ├── resource.language.fr_ca │ │ └── strings.po │ ├── resource.language.fr_fr │ │ └── strings.po │ ├── resource.language.gl_es │ │ └── strings.po │ ├── resource.language.he_il │ │ └── strings.po │ ├── resource.language.hi_in │ │ └── strings.po │ ├── resource.language.hr_hr │ │ └── strings.po │ ├── resource.language.hu_hu │ │ └── strings.po │ ├── resource.language.hy_am │ │ └── strings.po │ ├── resource.language.id_id │ │ └── strings.po │ ├── resource.language.is_is │ │ └── strings.po │ ├── resource.language.it_it │ │ └── strings.po │ ├── resource.language.ja_jp │ │ └── strings.po │ ├── resource.language.kn_in │ │ └── strings.po │ ├── resource.language.ko_kr │ │ └── strings.po │ ├── resource.language.lt_lt │ │ └── strings.po │ ├── resource.language.lv_lv │ │ └── strings.po │ ├── resource.language.mi │ │ └── strings.po │ ├── resource.language.mk_mk │ │ └── strings.po │ ├── resource.language.ml_in │ │ └── strings.po │ ├── resource.language.mn_mn │ │ └── strings.po │ ├── resource.language.ms_my │ │ └── strings.po │ ├── resource.language.mt_mt │ │ └── strings.po │ ├── resource.language.my_mm │ │ └── strings.po │ ├── resource.language.nb_no │ │ └── strings.po │ ├── resource.language.nl_nl │ │ └── strings.po │ ├── resource.language.oc_fr │ │ └── strings.po │ ├── resource.language.os_os │ │ └── strings.po │ ├── resource.language.pl_pl │ │ └── strings.po │ ├── resource.language.pt_br │ │ └── strings.po │ ├── resource.language.pt_pt │ │ └── strings.po │ ├── resource.language.ro_ro │ │ └── strings.po │ ├── resource.language.ru_ru │ │ └── strings.po │ ├── resource.language.si_lk │ │ └── strings.po │ ├── resource.language.sk_sk │ │ └── strings.po │ ├── resource.language.sl_si │ │ └── strings.po │ ├── resource.language.sq_al │ │ └── strings.po │ ├── resource.language.sr_rs │ │ └── strings.po │ ├── resource.language.sr_rs@latin │ │ └── strings.po │ ├── resource.language.sv_se │ │ └── strings.po │ ├── resource.language.szl │ │ └── strings.po │ ├── resource.language.ta_in │ │ └── strings.po │ ├── resource.language.te_in │ │ └── strings.po │ ├── resource.language.tg_tj │ │ └── strings.po │ ├── resource.language.th_th │ │ └── strings.po │ ├── resource.language.tr_tr │ │ └── strings.po │ ├── resource.language.uk_ua │ │ └── strings.po │ ├── resource.language.uz_uz │ │ └── strings.po │ ├── resource.language.vi_vn │ │ └── strings.po │ ├── resource.language.zh_cn │ │ └── strings.po │ └── resource.language.zh_tw │ │ └── strings.po ├── lib │ ├── advanced_editor.py │ ├── authorizers.py │ ├── backup.py │ ├── croniter.py │ ├── extractor.py │ ├── guisettings.py │ ├── progressbar.py │ ├── scheduler.py │ ├── tinyurl.py │ ├── utils.py │ └── vfs.py ├── settings.xml └── skins │ └── default │ ├── 1080i │ └── script-backup-qrcode.xml │ └── media │ ├── background-black.png │ ├── dialog-bg.png │ ├── dialogbutton-fo.png │ └── dialogbutton-nofo.png └── service.py /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2010 Rob Weber 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /default.py: -------------------------------------------------------------------------------- 1 | import xbmcgui 2 | import xbmcvfs 3 | import resources.lib.utils as utils 4 | from resources.lib.backup import XbmcBackup 5 | from resources.lib.authorizers import DropboxAuthorizer 6 | from resources.lib.advanced_editor import AdvancedBackupEditor 7 | 8 | # mode constants 9 | BACKUP = 0 10 | RESTORE = 1 11 | SETTINGS = 2 12 | ADVANCED_EDITOR = 3 13 | LAUNCHER = 4 14 | 15 | 16 | def authorize_cloud(cloudProvider): 17 | # dropbox 18 | if(cloudProvider == 'dropbox'): 19 | authorizer = DropboxAuthorizer() 20 | 21 | if(authorizer.authorize()): 22 | xbmcgui.Dialog().ok(utils.getString(30010), '%s %s' % (utils.getString(30027), utils.getString(30106))) 23 | else: 24 | xbmcgui.Dialog().ok(utils.getString(30010), '%s %s' % (utils.getString(30107), utils.getString(30027))) 25 | 26 | 27 | def remove_auth(): 28 | # triggered from settings.xml - asks if user wants to delete OAuth token information 29 | shouldDelete = xbmcgui.Dialog().yesno(utils.getString(30093), '%s\n%s' % (utils.getString(30094), utils.getString(30095)), autoclose=7000) 30 | 31 | if(shouldDelete): 32 | # delete any of the known token file types 33 | xbmcvfs.delete(xbmcvfs.translatePath(utils.data_dir() + "tokens.txt")) # dropbox 34 | xbmcvfs.delete(xbmcvfs.translatePath(utils.data_dir() + "google_drive.dat")) # google drive 35 | 36 | 37 | def get_params(): 38 | param = {} 39 | try: 40 | for i in sys.argv: 41 | args = i 42 | if('=' in args): 43 | if(args.startswith('?')): 44 | args = args[1:] # legacy in case of url params 45 | splitString = args.split('=') 46 | utils.log(splitString[1]) 47 | param[splitString[0]] = splitString[1] 48 | except: 49 | pass 50 | 51 | return param 52 | 53 | 54 | # the program mode 55 | mode = -1 56 | params = get_params() 57 | 58 | if("mode" in params): 59 | if(params['mode'] == 'backup'): 60 | mode = BACKUP 61 | elif(params['mode'] == 'restore'): 62 | mode = RESTORE 63 | elif(params['mode'] == 'launcher'): 64 | mode = LAUNCHER 65 | 66 | # if mode wasn't passed in as arg, get from user 67 | if(mode == -1): 68 | # by default, Backup,Restore,Open Settings 69 | options = [utils.getString(30016), utils.getString(30017), utils.getString(30099)] 70 | 71 | # find out if we're using the advanced editor 72 | if(utils.getSettingInt('backup_selection_type') == 1): 73 | options.append(utils.getString(30125)) 74 | 75 | # figure out if this is a backup or a restore from the user 76 | mode = xbmcgui.Dialog().select(utils.getString(30010) + " - " + utils.getString(30023), options) 77 | 78 | # check which mode should be run 79 | if(mode != -1): 80 | 81 | if(mode == SETTINGS): 82 | # open the settings dialog 83 | utils.openSettings() 84 | elif(mode == ADVANCED_EDITOR and utils.getSettingInt('backup_selection_type') == 1): 85 | # open the advanced editor but only if in advanced mode 86 | editor = AdvancedBackupEditor() 87 | editor.showMainScreen() 88 | elif(mode == LAUNCHER): 89 | # copied from old launcher.py 90 | if(params['action'] == 'authorize_cloud'): 91 | authorize_cloud(params['provider']) 92 | elif(params['action'] == 'remove_auth'): 93 | remove_auth() 94 | elif(params['action'] == 'advanced_editor'): 95 | editor = AdvancedBackupEditor() 96 | editor.showMainScreen() 97 | elif(params['action'] == 'advanced_copy_config'): 98 | editor = AdvancedBackupEditor() 99 | editor.copySimpleConfig() 100 | 101 | elif(mode == BACKUP or mode == RESTORE): 102 | backup = XbmcBackup() 103 | 104 | # if mode was RESTORE 105 | if(mode == RESTORE and backup.remoteConfigured()): 106 | # get list of valid restore points 107 | restorePoints = backup.listBackups() 108 | pointNames = [] 109 | folderNames = [] 110 | 111 | for aDir in restorePoints: 112 | pointNames.append(aDir[1]) 113 | folderNames.append(aDir[0]) 114 | 115 | selectedRestore = -1 116 | 117 | if("archive" in params): 118 | # check that the user give archive exists 119 | if(params['archive'] in folderNames): 120 | # set the index 121 | selectedRestore = folderNames.index(params['archive']) 122 | utils.log(str(selectedRestore) + " : " + params['archive']) 123 | else: 124 | utils.showNotification(utils.getString(30045)) 125 | utils.log(params['archive'] + ' is not a valid restore point') 126 | else: 127 | # allow user to select the backup to restore from 128 | selectedRestore = xbmcgui.Dialog().select(utils.getString(30010) + " - " + utils.getString(30021), pointNames) 129 | 130 | if(selectedRestore != -1): 131 | backup.selectRestore(restorePoints[selectedRestore][0]) 132 | 133 | if('sets' in params): 134 | backup.restore(selectedSets=params['sets'].split('|')) 135 | else: 136 | backup.restore() 137 | elif(mode == BACKUP and backup.remoteConfigured()): 138 | # mode was BACKUP 139 | backup.backup() 140 | else: 141 | # can't go any further 142 | xbmcgui.Dialog().ok(utils.getString(30010), utils.getString(30045)) 143 | utils.openSettings() 144 | else: 145 | xbmcgui.Dialog().ok(utils.getString(30010), "%s %s" % (utils.getString(30159), params['mode'])) 146 | -------------------------------------------------------------------------------- /resources/data/default_files.json: -------------------------------------------------------------------------------- 1 | { 2 | "addons":{ 3 | "root":"special://home/addons/", 4 | "dirs":[ 5 | { 6 | "type":"include", 7 | "path":"special://home/addons/", 8 | "recurse":true 9 | }, 10 | { 11 | "type":"exclude", 12 | "path":"special://home/addons/packages/" 13 | }, 14 | { 15 | "type":"exclude", 16 | "path":"special://home/addons/temp/" 17 | } 18 | ] 19 | }, 20 | "addon_data":{ 21 | "root":"special://home/userdata/addon_data/", 22 | "dirs":[ 23 | { 24 | "type":"include", 25 | "path":"special://home/userdata/addon_data/", 26 | "recurse":true 27 | } 28 | ] 29 | }, 30 | "database":{ 31 | "root":"special://home/userdata/Database/", 32 | "dirs":[ 33 | { 34 | "type":"include", 35 | "path":"special://home/userdata/Database/", 36 | "recurse":true 37 | } 38 | ] 39 | }, 40 | "game_saves":{ 41 | "root":"special://home/userdata/Savestates/", 42 | "dirs":[ 43 | { 44 | "type":"include", 45 | "path":"special://home/userdata/Savestates/", 46 | "recurse":true 47 | } 48 | ] 49 | }, 50 | "playlists":{ 51 | "root":"special://home/userdata/playlists/", 52 | "dirs":[ 53 | { 54 | "type":"include", 55 | "path":"special://home/userdata/playlists/", 56 | "recurse":true 57 | } 58 | ] 59 | }, 60 | "profiles":{ 61 | "root":"special://home/userdata/profiles/", 62 | "dirs":[ 63 | { 64 | "type":"include", 65 | "path":"special://home/userdata/profiles/", 66 | "recurse":true 67 | } 68 | ] 69 | }, 70 | "thumbnails":{ 71 | "root":"special://home/userdata/Thumbnails/", 72 | "dirs":[ 73 | { 74 | "type":"include", 75 | "path":"special://home/userdata/Thumbnails/", 76 | "recurse":true 77 | } 78 | ] 79 | }, 80 | "config":{ 81 | "root":"special://home/userdata/", 82 | "dirs":[ 83 | { 84 | "type":"include", 85 | "path":"special://home/userdata/", 86 | "recurse":false 87 | }, 88 | { 89 | "type":"include", 90 | "path":"special://home/userdata/keymaps/", 91 | "recurse":true 92 | }, 93 | { 94 | "type":"include", 95 | "path":"special://home/userdata/peripheral_data/", 96 | "recurse":true 97 | }, 98 | { 99 | "type":"include", 100 | "path":"special://home/userdata/library/", 101 | "recurse":true 102 | } 103 | ] 104 | } 105 | } -------------------------------------------------------------------------------- /resources/images/folder-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/images/folder-icon.png -------------------------------------------------------------------------------- /resources/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/images/icon.png -------------------------------------------------------------------------------- /resources/images/plus-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/images/plus-icon.png -------------------------------------------------------------------------------- /resources/images/screenshot1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/images/screenshot1.jpg -------------------------------------------------------------------------------- /resources/images/screenshot2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/images/screenshot2.jpg -------------------------------------------------------------------------------- /resources/images/screenshot3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/images/screenshot3.jpg -------------------------------------------------------------------------------- /resources/images/screenshot4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/images/screenshot4.jpg -------------------------------------------------------------------------------- /resources/images/screenshot5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/images/screenshot5.jpg -------------------------------------------------------------------------------- /resources/images/screenshot6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/images/screenshot6.jpg -------------------------------------------------------------------------------- /resources/language/resource.language.ast_es/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2022-02-22 01:13+0000\n" 12 | "Last-Translator: Christian Gade \n" 13 | "Language-Team: Asturian (Spain) \n" 14 | "Language: ast_es\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 19 | "X-Generator: Weblate 4.10.1\n" 20 | 21 | msgctxt "Addon Summary" 22 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 23 | msgstr "" 24 | 25 | msgctxt "Addon Description" 26 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 27 | msgstr "" 28 | 29 | msgctxt "#30010" 30 | msgid "Backup" 31 | msgstr "" 32 | 33 | msgctxt "#30011" 34 | msgid "General" 35 | msgstr "Xeneral" 36 | 37 | msgctxt "#30012" 38 | msgid "File Selection" 39 | msgstr "" 40 | 41 | msgctxt "#30013" 42 | msgid "Scheduling" 43 | msgstr "" 44 | 45 | msgctxt "#30014" 46 | msgid "Simple" 47 | msgstr "" 48 | 49 | msgctxt "#30015" 50 | msgid "Advanced" 51 | msgstr "" 52 | 53 | msgctxt "#30016" 54 | msgid "Backup" 55 | msgstr "" 56 | 57 | msgctxt "#30017" 58 | msgid "Restore" 59 | msgstr "" 60 | 61 | msgctxt "#30018" 62 | msgid "Browse Path" 63 | msgstr "" 64 | 65 | msgctxt "#30019" 66 | msgid "Type Path" 67 | msgstr "" 68 | 69 | msgctxt "#30020" 70 | msgid "Browse Remote Path" 71 | msgstr "" 72 | 73 | msgctxt "#30021" 74 | msgid "Backup Folder Name" 75 | msgstr "" 76 | 77 | msgctxt "#30022" 78 | msgid "Progress Display" 79 | msgstr "" 80 | 81 | msgctxt "#30023" 82 | msgid "Mode" 83 | msgstr "" 84 | 85 | msgctxt "#30024" 86 | msgid "Type Remote Path" 87 | msgstr "" 88 | 89 | msgctxt "#30025" 90 | msgid "Remote Path Type" 91 | msgstr "" 92 | 93 | msgctxt "#30026" 94 | msgid "Backups to keep (0 for all)" 95 | msgstr "" 96 | 97 | msgctxt "#30027" 98 | msgid "Dropbox" 99 | msgstr "" 100 | 101 | msgctxt "#30028" 102 | msgid "Dropbox Key" 103 | msgstr "" 104 | 105 | msgctxt "#30029" 106 | msgid "Dropbox Secret" 107 | msgstr "" 108 | 109 | msgctxt "#30030" 110 | msgid "User Addons" 111 | msgstr "" 112 | 113 | msgctxt "#30031" 114 | msgid "Addon Data" 115 | msgstr "" 116 | 117 | msgctxt "#30032" 118 | msgid "Database" 119 | msgstr "" 120 | 121 | msgctxt "#30033" 122 | msgid "Playlist" 123 | msgstr "" 124 | 125 | msgctxt "#30034" 126 | msgid "Thumbnails/Fanart" 127 | msgstr "" 128 | 129 | msgctxt "#30035" 130 | msgid "Config Files" 131 | msgstr "" 132 | 133 | msgctxt "#30036" 134 | msgid "Disclaimer" 135 | msgstr "" 136 | 137 | msgctxt "#30037" 138 | msgid "Canceling this menu will close and save changes" 139 | msgstr "" 140 | 141 | msgctxt "#30038" 142 | msgid "Advanced Settings Detected" 143 | msgstr "" 144 | 145 | msgctxt "#30039" 146 | msgid "The advancedsettings file should be restored first" 147 | msgstr "" 148 | 149 | msgctxt "#30040" 150 | msgid "Select Yes to restore this file and restart Kodi" 151 | msgstr "" 152 | 153 | msgctxt "#30041" 154 | msgid "Select No to continue" 155 | msgstr "" 156 | 157 | msgctxt "#30042" 158 | msgid "Resume Restore" 159 | msgstr "" 160 | 161 | msgctxt "#30043" 162 | msgid "The Backup addon has detected an unfinished restore" 163 | msgstr "" 164 | 165 | msgctxt "#30044" 166 | msgid "Would you like to continue?" 167 | msgstr "" 168 | 169 | msgctxt "#30045" 170 | msgid "Error: Remote or zip file path doesn't exist" 171 | msgstr "" 172 | 173 | msgctxt "#30046" 174 | msgid "Starting" 175 | msgstr "" 176 | 177 | msgctxt "#30047" 178 | msgid "Local Dir" 179 | msgstr "" 180 | 181 | msgctxt "#30048" 182 | msgid "Remote Dir" 183 | msgstr "" 184 | 185 | msgctxt "#30049" 186 | msgid "Gathering file list" 187 | msgstr "" 188 | 189 | msgctxt "#30050" 190 | msgid "Remote Path exists - may have old files in it!" 191 | msgstr "" 192 | 193 | msgctxt "#30051" 194 | msgid "Creating Files List" 195 | msgstr "" 196 | 197 | msgctxt "#30052" 198 | msgid "Writing file" 199 | msgstr "" 200 | 201 | msgctxt "#30053" 202 | msgid "Starting scheduled backup" 203 | msgstr "" 204 | 205 | msgctxt "#30054" 206 | msgid "Removing backup" 207 | msgstr "" 208 | 209 | msgctxt "#30056" 210 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 211 | msgstr "" 212 | 213 | msgctxt "#30057" 214 | msgid "Click OK AFTER completion" 215 | msgstr "" 216 | 217 | msgctxt "#30058" 218 | msgid "Developer Code Needed" 219 | msgstr "" 220 | 221 | msgctxt "#30059" 222 | msgid "Visit https://www.dropbox.com/developers" 223 | msgstr "" 224 | 225 | msgctxt "#30060" 226 | msgid "Enable Scheduler" 227 | msgstr "" 228 | 229 | msgctxt "#30061" 230 | msgid "Schedule" 231 | msgstr "" 232 | 233 | msgctxt "#30062" 234 | msgid "Hour of Day" 235 | msgstr "" 236 | 237 | msgctxt "#30063" 238 | msgid "Day of Week" 239 | msgstr "" 240 | 241 | msgctxt "#30064" 242 | msgid "Cron Schedule" 243 | msgstr "" 244 | 245 | msgctxt "#30065" 246 | msgid "Sunday" 247 | msgstr "" 248 | 249 | msgctxt "#30066" 250 | msgid "Monday" 251 | msgstr "" 252 | 253 | msgctxt "#30067" 254 | msgid "Tuesday" 255 | msgstr "" 256 | 257 | msgctxt "#30068" 258 | msgid "Wednesday" 259 | msgstr "" 260 | 261 | msgctxt "#30069" 262 | msgid "Thursday" 263 | msgstr "" 264 | 265 | msgctxt "#30070" 266 | msgid "Friday" 267 | msgstr "" 268 | 269 | msgctxt "#30071" 270 | msgid "Saturday" 271 | msgstr "" 272 | 273 | msgctxt "#30072" 274 | msgid "Every Day" 275 | msgstr "" 276 | 277 | msgctxt "#30073" 278 | msgid "Every Week" 279 | msgstr "" 280 | 281 | msgctxt "#30074" 282 | msgid "First Day of Month" 283 | msgstr "" 284 | 285 | msgctxt "#30075" 286 | msgid "Custom Schedule" 287 | msgstr "" 288 | 289 | msgctxt "#30076" 290 | msgid "Shutdown After Backup" 291 | msgstr "" 292 | 293 | msgctxt "#30077" 294 | msgid "Restart Kodi" 295 | msgstr "" 296 | 297 | msgctxt "#30078" 298 | msgid "You should restart Kodi to continue" 299 | msgstr "" 300 | 301 | msgctxt "#30079" 302 | msgid "Just Today" 303 | msgstr "" 304 | 305 | msgctxt "#30080" 306 | msgid "Profiles" 307 | msgstr "" 308 | 309 | msgctxt "#30081" 310 | msgid "Scheduler will run again on" 311 | msgstr "" 312 | 313 | msgctxt "#30082" 314 | msgid "Progress Bar" 315 | msgstr "" 316 | 317 | msgctxt "#30083" 318 | msgid "Background Progress Bar" 319 | msgstr "" 320 | 321 | msgctxt "#30084" 322 | msgid "None (Silent)" 323 | msgstr "" 324 | 325 | msgctxt "#30085" 326 | msgid "Version Warning" 327 | msgstr "" 328 | 329 | msgctxt "#30086" 330 | msgid "This version of Kodi is different than the one used to create the archive" 331 | msgstr "" 332 | 333 | msgctxt "#30087" 334 | msgid "Compress Archives" 335 | msgstr "" 336 | 337 | msgctxt "#30088" 338 | msgid "Copying Zip Archive" 339 | msgstr "" 340 | 341 | msgctxt "#30089" 342 | msgid "Write Error Detected" 343 | msgstr "" 344 | 345 | msgctxt "#30090" 346 | msgid "The destination may not be writeable" 347 | msgstr "" 348 | 349 | msgctxt "#30091" 350 | msgid "Zip archive could not be copied" 351 | msgstr "" 352 | 353 | msgctxt "#30092" 354 | msgid "Not all files were copied" 355 | msgstr "" 356 | 357 | msgctxt "#30093" 358 | msgid "Delete Authorization Info" 359 | msgstr "" 360 | 361 | msgctxt "#30094" 362 | msgid "This will delete any OAuth token files" 363 | msgstr "" 364 | 365 | msgctxt "#30095" 366 | msgid "Do you want to do this?" 367 | msgstr "" 368 | 369 | msgctxt "#30096" 370 | msgid "Old Zip Archive could not be deleted" 371 | msgstr "" 372 | 373 | msgctxt "#30097" 374 | msgid "This needs to happen before a backup can run" 375 | msgstr "" 376 | 377 | msgctxt "#30098" 378 | msgid "Google Drive" 379 | msgstr "" 380 | 381 | msgctxt "#30099" 382 | msgid "Open Settings" 383 | msgstr "" 384 | 385 | msgctxt "#30100" 386 | msgid "Extracting Archive" 387 | msgstr "" 388 | 389 | msgctxt "#30101" 390 | msgid "Error extracting the zip archive" 391 | msgstr "" 392 | 393 | msgctxt "#30102" 394 | msgid "Click OK to enter code" 395 | msgstr "" 396 | 397 | msgctxt "#30103" 398 | msgid "Validation Code" 399 | msgstr "" 400 | 401 | msgctxt "#30104" 402 | msgid "Authorize Now" 403 | msgstr "" 404 | 405 | msgctxt "#30105" 406 | msgid "Authorize this remote service in the settings first" 407 | msgstr "" 408 | 409 | msgctxt "#30106" 410 | msgid "is authorized" 411 | msgstr "" 412 | 413 | msgctxt "#30107" 414 | msgid "error authorizing" 415 | msgstr "" 416 | 417 | msgctxt "#30108" 418 | msgid "Visit https://console.developers.google.com/" 419 | msgstr "" 420 | 421 | msgctxt "#30109" 422 | msgid "Run on startup if missed" 423 | msgstr "" 424 | 425 | msgctxt "#30110" 426 | msgid "Set Name" 427 | msgstr "" 428 | 429 | msgctxt "#30111" 430 | msgid "Root folder selection" 431 | msgstr "" 432 | 433 | msgctxt "#30112" 434 | msgid "Browse Folder" 435 | msgstr "" 436 | 437 | msgctxt "#30113" 438 | msgid "Enter Own" 439 | msgstr "" 440 | 441 | msgctxt "#30114" 442 | msgid "starts in Kodi home" 443 | msgstr "" 444 | 445 | msgctxt "#30115" 446 | msgid "enter path to start there" 447 | msgstr "" 448 | 449 | msgctxt "#30116" 450 | msgid "Enter root path" 451 | msgstr "" 452 | 453 | msgctxt "#30117" 454 | msgid "Path Error" 455 | msgstr "" 456 | 457 | msgctxt "#30118" 458 | msgid "Path does not exist" 459 | msgstr "" 460 | 461 | msgctxt "#30119" 462 | msgid "Select root" 463 | msgstr "" 464 | 465 | msgctxt "#30120" 466 | msgid "Add Exclude Folder" 467 | msgstr "" 468 | 469 | msgctxt "#30121" 470 | msgid "Root Folder" 471 | msgstr "" 472 | 473 | msgctxt "#30122" 474 | msgid "Edit" 475 | msgstr "" 476 | 477 | msgctxt "#30123" 478 | msgid "Delete" 479 | msgstr "" 480 | 481 | msgctxt "#30124" 482 | msgid "Choose Action" 483 | msgstr "" 484 | 485 | msgctxt "#30125" 486 | msgid "Advanced Editor" 487 | msgstr "" 488 | 489 | msgctxt "#30126" 490 | msgid "Add Set" 491 | msgstr "" 492 | 493 | msgctxt "#30127" 494 | msgid "Delete Set" 495 | msgstr "" 496 | 497 | msgctxt "#30128" 498 | msgid "Are you sure you want to delete?" 499 | msgstr "" 500 | 501 | msgctxt "#30129" 502 | msgid "Exclude" 503 | msgstr "" 504 | 505 | msgctxt "#30130" 506 | msgid "The root folder cannot be changed" 507 | msgstr "" 508 | 509 | msgctxt "#30131" 510 | msgid "Choose Sets to Restore" 511 | msgstr "" 512 | 513 | msgctxt "#30132" 514 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 515 | msgstr "" 516 | 517 | msgctxt "#30133" 518 | msgid "Game Saves" 519 | msgstr "" 520 | 521 | msgctxt "#30134" 522 | msgid "Include" 523 | msgstr "" 524 | 525 | msgctxt "#30135" 526 | msgid "Add Include Folder" 527 | msgstr "" 528 | 529 | msgctxt "#30136" 530 | msgid "Path must be within root folder" 531 | msgstr "" 532 | 533 | msgctxt "#30137" 534 | msgid "This path is part of a rule already" 535 | msgstr "" 536 | 537 | msgctxt "#30138" 538 | msgid "Set Name exists already" 539 | msgstr "" 540 | 541 | msgctxt "#30139" 542 | msgid "Copy Simple Config" 543 | msgstr "" 544 | 545 | msgctxt "#30140" 546 | msgid "This will copy the default Simple file selection to the Advanced Editor" 547 | msgstr "" 548 | 549 | msgctxt "#30141" 550 | msgid "This will erase any current Advanced Editor settings" 551 | msgstr "" 552 | 553 | msgctxt "#30142" 554 | msgid "Enable Verbose Logging" 555 | msgstr "" 556 | 557 | msgctxt "#30143" 558 | msgid "Exclude a specific folder from this backup set" 559 | msgstr "" 560 | 561 | msgctxt "#30144" 562 | msgid "Include a specific folder to this backup set" 563 | msgstr "" 564 | 565 | msgctxt "#30145" 566 | msgid "Type" 567 | msgstr "" 568 | 569 | msgctxt "#30146" 570 | msgid "Include Sub Folders" 571 | msgstr "" 572 | 573 | msgctxt "#30147" 574 | msgid "Toggle Sub Folders" 575 | msgstr "" 576 | 577 | msgctxt "#30148" 578 | msgid "Ask before restoring Kodi UI settings" 579 | msgstr "" 580 | 581 | msgctxt "#30149" 582 | msgid "Restore Kodi UI Settings" 583 | msgstr "" 584 | 585 | msgctxt "#30150" 586 | msgid "Restore saved Kodi system settings from backup?" 587 | msgstr "" 588 | 589 | msgctxt "#30151" 590 | msgid "Enable Verbose Logging" 591 | msgstr "" 592 | 593 | msgctxt "#30152" 594 | msgid "Set Zip File Location" 595 | msgstr "" 596 | 597 | msgctxt "#30153" 598 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 599 | msgstr "" 600 | 601 | msgctxt "#30154" 602 | msgid "Always prompt if Kodi settings should be restored - no by default" 603 | msgstr "" 604 | 605 | msgctxt "#30155" 606 | msgid "Adds additional information to the log file" 607 | msgstr "" 608 | 609 | msgctxt "#30156" 610 | msgid "Must save key/secret first, then return to settings to authorize" 611 | msgstr "" 612 | 613 | msgctxt "#30157" 614 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 615 | msgstr "" 616 | 617 | msgctxt "#30158" 618 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 619 | msgstr "" 620 | 621 | msgctxt "#30159" 622 | msgid "Backup started with unknown mode" 623 | msgstr "" 624 | 625 | msgctxt "#30160" 626 | msgid "Backup Filename Suffix" 627 | msgstr "" 628 | 629 | msgctxt "#30161" 630 | msgid "Amend a string to the end of each backup folder or ZIP file" 631 | msgstr "" 632 | -------------------------------------------------------------------------------- /resources/language/resource.language.cy_gb/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2017-09-21 18:34+0000\n" 12 | "Last-Translator: Martijn Kaijser \n" 13 | "Language-Team: Welsh (http://www.transifex.com/teamxbmc/xbmc-addons/language/cy/)\n" 14 | "Language: cy\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" 19 | 20 | msgctxt "Addon Summary" 21 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 22 | msgstr "" 23 | 24 | msgctxt "Addon Description" 25 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 26 | msgstr "" 27 | 28 | msgctxt "#30010" 29 | msgid "Backup" 30 | msgstr "" 31 | 32 | msgctxt "#30011" 33 | msgid "General" 34 | msgstr "Cyffredinol" 35 | 36 | msgctxt "#30012" 37 | msgid "File Selection" 38 | msgstr "" 39 | 40 | msgctxt "#30013" 41 | msgid "Scheduling" 42 | msgstr "" 43 | 44 | msgctxt "#30014" 45 | msgid "Simple" 46 | msgstr "" 47 | 48 | msgctxt "#30015" 49 | msgid "Advanced" 50 | msgstr "" 51 | 52 | msgctxt "#30016" 53 | msgid "Backup" 54 | msgstr "" 55 | 56 | msgctxt "#30017" 57 | msgid "Restore" 58 | msgstr "" 59 | 60 | msgctxt "#30018" 61 | msgid "Browse Path" 62 | msgstr "" 63 | 64 | msgctxt "#30019" 65 | msgid "Type Path" 66 | msgstr "" 67 | 68 | msgctxt "#30020" 69 | msgid "Browse Remote Path" 70 | msgstr "" 71 | 72 | msgctxt "#30021" 73 | msgid "Backup Folder Name" 74 | msgstr "" 75 | 76 | msgctxt "#30022" 77 | msgid "Progress Display" 78 | msgstr "" 79 | 80 | msgctxt "#30023" 81 | msgid "Mode" 82 | msgstr "" 83 | 84 | msgctxt "#30024" 85 | msgid "Type Remote Path" 86 | msgstr "" 87 | 88 | msgctxt "#30025" 89 | msgid "Remote Path Type" 90 | msgstr "" 91 | 92 | msgctxt "#30026" 93 | msgid "Backups to keep (0 for all)" 94 | msgstr "" 95 | 96 | msgctxt "#30027" 97 | msgid "Dropbox" 98 | msgstr "" 99 | 100 | msgctxt "#30028" 101 | msgid "Dropbox Key" 102 | msgstr "" 103 | 104 | msgctxt "#30029" 105 | msgid "Dropbox Secret" 106 | msgstr "" 107 | 108 | msgctxt "#30030" 109 | msgid "User Addons" 110 | msgstr "" 111 | 112 | msgctxt "#30031" 113 | msgid "Addon Data" 114 | msgstr "" 115 | 116 | msgctxt "#30032" 117 | msgid "Database" 118 | msgstr "" 119 | 120 | msgctxt "#30033" 121 | msgid "Playlist" 122 | msgstr "" 123 | 124 | msgctxt "#30034" 125 | msgid "Thumbnails/Fanart" 126 | msgstr "" 127 | 128 | msgctxt "#30035" 129 | msgid "Config Files" 130 | msgstr "" 131 | 132 | msgctxt "#30036" 133 | msgid "Disclaimer" 134 | msgstr "" 135 | 136 | msgctxt "#30037" 137 | msgid "Canceling this menu will close and save changes" 138 | msgstr "" 139 | 140 | msgctxt "#30038" 141 | msgid "Advanced Settings Detected" 142 | msgstr "" 143 | 144 | msgctxt "#30039" 145 | msgid "The advancedsettings file should be restored first" 146 | msgstr "" 147 | 148 | msgctxt "#30040" 149 | msgid "Select Yes to restore this file and restart Kodi" 150 | msgstr "" 151 | 152 | msgctxt "#30041" 153 | msgid "Select No to continue" 154 | msgstr "" 155 | 156 | msgctxt "#30042" 157 | msgid "Resume Restore" 158 | msgstr "" 159 | 160 | msgctxt "#30043" 161 | msgid "The Backup addon has detected an unfinished restore" 162 | msgstr "" 163 | 164 | msgctxt "#30044" 165 | msgid "Would you like to continue?" 166 | msgstr "" 167 | 168 | msgctxt "#30045" 169 | msgid "Error: Remote or zip file path doesn't exist" 170 | msgstr "" 171 | 172 | msgctxt "#30046" 173 | msgid "Starting" 174 | msgstr "" 175 | 176 | msgctxt "#30047" 177 | msgid "Local Dir" 178 | msgstr "" 179 | 180 | msgctxt "#30048" 181 | msgid "Remote Dir" 182 | msgstr "" 183 | 184 | msgctxt "#30049" 185 | msgid "Gathering file list" 186 | msgstr "" 187 | 188 | msgctxt "#30050" 189 | msgid "Remote Path exists - may have old files in it!" 190 | msgstr "" 191 | 192 | msgctxt "#30051" 193 | msgid "Creating Files List" 194 | msgstr "" 195 | 196 | msgctxt "#30052" 197 | msgid "Writing file" 198 | msgstr "" 199 | 200 | msgctxt "#30053" 201 | msgid "Starting scheduled backup" 202 | msgstr "" 203 | 204 | msgctxt "#30054" 205 | msgid "Removing backup" 206 | msgstr "" 207 | 208 | msgctxt "#30056" 209 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 210 | msgstr "" 211 | 212 | msgctxt "#30057" 213 | msgid "Click OK AFTER completion" 214 | msgstr "" 215 | 216 | msgctxt "#30058" 217 | msgid "Developer Code Needed" 218 | msgstr "" 219 | 220 | msgctxt "#30059" 221 | msgid "Visit https://www.dropbox.com/developers" 222 | msgstr "" 223 | 224 | msgctxt "#30060" 225 | msgid "Enable Scheduler" 226 | msgstr "" 227 | 228 | msgctxt "#30061" 229 | msgid "Schedule" 230 | msgstr "" 231 | 232 | msgctxt "#30062" 233 | msgid "Hour of Day" 234 | msgstr "" 235 | 236 | msgctxt "#30063" 237 | msgid "Day of Week" 238 | msgstr "" 239 | 240 | msgctxt "#30064" 241 | msgid "Cron Schedule" 242 | msgstr "" 243 | 244 | msgctxt "#30065" 245 | msgid "Sunday" 246 | msgstr "" 247 | 248 | msgctxt "#30066" 249 | msgid "Monday" 250 | msgstr "" 251 | 252 | msgctxt "#30067" 253 | msgid "Tuesday" 254 | msgstr "" 255 | 256 | msgctxt "#30068" 257 | msgid "Wednesday" 258 | msgstr "" 259 | 260 | msgctxt "#30069" 261 | msgid "Thursday" 262 | msgstr "" 263 | 264 | msgctxt "#30070" 265 | msgid "Friday" 266 | msgstr "" 267 | 268 | msgctxt "#30071" 269 | msgid "Saturday" 270 | msgstr "" 271 | 272 | msgctxt "#30072" 273 | msgid "Every Day" 274 | msgstr "" 275 | 276 | msgctxt "#30073" 277 | msgid "Every Week" 278 | msgstr "" 279 | 280 | msgctxt "#30074" 281 | msgid "First Day of Month" 282 | msgstr "" 283 | 284 | msgctxt "#30075" 285 | msgid "Custom Schedule" 286 | msgstr "" 287 | 288 | msgctxt "#30076" 289 | msgid "Shutdown After Backup" 290 | msgstr "" 291 | 292 | msgctxt "#30077" 293 | msgid "Restart Kodi" 294 | msgstr "" 295 | 296 | msgctxt "#30078" 297 | msgid "You should restart Kodi to continue" 298 | msgstr "" 299 | 300 | msgctxt "#30079" 301 | msgid "Just Today" 302 | msgstr "" 303 | 304 | msgctxt "#30080" 305 | msgid "Profiles" 306 | msgstr "" 307 | 308 | msgctxt "#30081" 309 | msgid "Scheduler will run again on" 310 | msgstr "" 311 | 312 | msgctxt "#30082" 313 | msgid "Progress Bar" 314 | msgstr "" 315 | 316 | msgctxt "#30083" 317 | msgid "Background Progress Bar" 318 | msgstr "" 319 | 320 | msgctxt "#30084" 321 | msgid "None (Silent)" 322 | msgstr "" 323 | 324 | msgctxt "#30085" 325 | msgid "Version Warning" 326 | msgstr "" 327 | 328 | msgctxt "#30086" 329 | msgid "This version of Kodi is different than the one used to create the archive" 330 | msgstr "" 331 | 332 | msgctxt "#30087" 333 | msgid "Compress Archives" 334 | msgstr "" 335 | 336 | msgctxt "#30088" 337 | msgid "Copying Zip Archive" 338 | msgstr "" 339 | 340 | msgctxt "#30089" 341 | msgid "Write Error Detected" 342 | msgstr "" 343 | 344 | msgctxt "#30090" 345 | msgid "The destination may not be writeable" 346 | msgstr "" 347 | 348 | msgctxt "#30091" 349 | msgid "Zip archive could not be copied" 350 | msgstr "" 351 | 352 | msgctxt "#30092" 353 | msgid "Not all files were copied" 354 | msgstr "" 355 | 356 | msgctxt "#30093" 357 | msgid "Delete Authorization Info" 358 | msgstr "" 359 | 360 | msgctxt "#30094" 361 | msgid "This will delete any OAuth token files" 362 | msgstr "" 363 | 364 | msgctxt "#30095" 365 | msgid "Do you want to do this?" 366 | msgstr "" 367 | 368 | msgctxt "#30096" 369 | msgid "Old Zip Archive could not be deleted" 370 | msgstr "" 371 | 372 | msgctxt "#30097" 373 | msgid "This needs to happen before a backup can run" 374 | msgstr "" 375 | 376 | msgctxt "#30098" 377 | msgid "Google Drive" 378 | msgstr "" 379 | 380 | msgctxt "#30099" 381 | msgid "Open Settings" 382 | msgstr "" 383 | 384 | msgctxt "#30100" 385 | msgid "Extracting Archive" 386 | msgstr "" 387 | 388 | msgctxt "#30101" 389 | msgid "Error extracting the zip archive" 390 | msgstr "" 391 | 392 | msgctxt "#30102" 393 | msgid "Click OK to enter code" 394 | msgstr "" 395 | 396 | msgctxt "#30103" 397 | msgid "Validation Code" 398 | msgstr "" 399 | 400 | msgctxt "#30104" 401 | msgid "Authorize Now" 402 | msgstr "" 403 | 404 | msgctxt "#30105" 405 | msgid "Authorize this remote service in the settings first" 406 | msgstr "" 407 | 408 | msgctxt "#30106" 409 | msgid "is authorized" 410 | msgstr "" 411 | 412 | msgctxt "#30107" 413 | msgid "error authorizing" 414 | msgstr "" 415 | 416 | msgctxt "#30108" 417 | msgid "Visit https://console.developers.google.com/" 418 | msgstr "" 419 | 420 | msgctxt "#30109" 421 | msgid "Run on startup if missed" 422 | msgstr "" 423 | 424 | msgctxt "#30110" 425 | msgid "Set Name" 426 | msgstr "" 427 | 428 | msgctxt "#30111" 429 | msgid "Root folder selection" 430 | msgstr "" 431 | 432 | msgctxt "#30112" 433 | msgid "Browse Folder" 434 | msgstr "" 435 | 436 | msgctxt "#30113" 437 | msgid "Enter Own" 438 | msgstr "" 439 | 440 | msgctxt "#30114" 441 | msgid "starts in Kodi home" 442 | msgstr "" 443 | 444 | msgctxt "#30115" 445 | msgid "enter path to start there" 446 | msgstr "" 447 | 448 | msgctxt "#30116" 449 | msgid "Enter root path" 450 | msgstr "" 451 | 452 | msgctxt "#30117" 453 | msgid "Path Error" 454 | msgstr "" 455 | 456 | msgctxt "#30118" 457 | msgid "Path does not exist" 458 | msgstr "" 459 | 460 | msgctxt "#30119" 461 | msgid "Select root" 462 | msgstr "" 463 | 464 | msgctxt "#30120" 465 | msgid "Add Exclude Folder" 466 | msgstr "" 467 | 468 | msgctxt "#30121" 469 | msgid "Root Folder" 470 | msgstr "" 471 | 472 | msgctxt "#30122" 473 | msgid "Edit" 474 | msgstr "" 475 | 476 | msgctxt "#30123" 477 | msgid "Delete" 478 | msgstr "" 479 | 480 | msgctxt "#30124" 481 | msgid "Choose Action" 482 | msgstr "" 483 | 484 | msgctxt "#30125" 485 | msgid "Advanced Editor" 486 | msgstr "" 487 | 488 | msgctxt "#30126" 489 | msgid "Add Set" 490 | msgstr "" 491 | 492 | msgctxt "#30127" 493 | msgid "Delete Set" 494 | msgstr "" 495 | 496 | msgctxt "#30128" 497 | msgid "Are you sure you want to delete?" 498 | msgstr "" 499 | 500 | msgctxt "#30129" 501 | msgid "Exclude" 502 | msgstr "" 503 | 504 | msgctxt "#30130" 505 | msgid "The root folder cannot be changed" 506 | msgstr "" 507 | 508 | msgctxt "#30131" 509 | msgid "Choose Sets to Restore" 510 | msgstr "" 511 | 512 | msgctxt "#30132" 513 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 514 | msgstr "" 515 | 516 | msgctxt "#30133" 517 | msgid "Game Saves" 518 | msgstr "" 519 | 520 | msgctxt "#30134" 521 | msgid "Include" 522 | msgstr "" 523 | 524 | msgctxt "#30135" 525 | msgid "Add Include Folder" 526 | msgstr "" 527 | 528 | msgctxt "#30136" 529 | msgid "Path must be within root folder" 530 | msgstr "" 531 | 532 | msgctxt "#30137" 533 | msgid "This path is part of a rule already" 534 | msgstr "" 535 | 536 | msgctxt "#30138" 537 | msgid "Set Name exists already" 538 | msgstr "" 539 | 540 | msgctxt "#30139" 541 | msgid "Copy Simple Config" 542 | msgstr "" 543 | 544 | msgctxt "#30140" 545 | msgid "This will copy the default Simple file selection to the Advanced Editor" 546 | msgstr "" 547 | 548 | msgctxt "#30141" 549 | msgid "This will erase any current Advanced Editor settings" 550 | msgstr "" 551 | 552 | msgctxt "#30142" 553 | msgid "Enable Verbose Logging" 554 | msgstr "" 555 | 556 | msgctxt "#30143" 557 | msgid "Exclude a specific folder from this backup set" 558 | msgstr "" 559 | 560 | msgctxt "#30144" 561 | msgid "Include a specific folder to this backup set" 562 | msgstr "" 563 | 564 | msgctxt "#30145" 565 | msgid "Type" 566 | msgstr "" 567 | 568 | msgctxt "#30146" 569 | msgid "Include Sub Folders" 570 | msgstr "" 571 | 572 | msgctxt "#30147" 573 | msgid "Toggle Sub Folders" 574 | msgstr "" 575 | 576 | msgctxt "#30148" 577 | msgid "Ask before restoring Kodi UI settings" 578 | msgstr "" 579 | 580 | msgctxt "#30149" 581 | msgid "Restore Kodi UI Settings" 582 | msgstr "" 583 | 584 | msgctxt "#30150" 585 | msgid "Restore saved Kodi system settings from backup?" 586 | msgstr "" 587 | 588 | msgctxt "#30151" 589 | msgid "Enable Verbose Logging" 590 | msgstr "" 591 | 592 | msgctxt "#30152" 593 | msgid "Set Zip File Location" 594 | msgstr "" 595 | 596 | msgctxt "#30153" 597 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 598 | msgstr "" 599 | 600 | msgctxt "#30154" 601 | msgid "Always prompt if Kodi settings should be restored - no by default" 602 | msgstr "" 603 | 604 | msgctxt "#30155" 605 | msgid "Adds additional information to the log file" 606 | msgstr "" 607 | 608 | msgctxt "#30156" 609 | msgid "Must save key/secret first, then return to settings to authorize" 610 | msgstr "" 611 | 612 | msgctxt "#30157" 613 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 614 | msgstr "" 615 | 616 | msgctxt "#30158" 617 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 618 | msgstr "" 619 | 620 | msgctxt "#30159" 621 | msgid "Backup started with unknown mode" 622 | msgstr "" 623 | 624 | msgctxt "#30160" 625 | msgid "Backup Filename Suffix" 626 | msgstr "" 627 | 628 | msgctxt "#30161" 629 | msgid "Amend a string to the end of each backup folder or ZIP file" 630 | msgstr "" 631 | -------------------------------------------------------------------------------- /resources/language/resource.language.kn_in/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2017-09-19 14:20+0000\n" 12 | "Last-Translator: Automatically generated\n" 13 | "Language-Team: none\n" 14 | "Language: kn_in\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=n > 1;\n" 19 | 20 | msgctxt "Addon Summary" 21 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 22 | msgstr "" 23 | 24 | msgctxt "Addon Description" 25 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 26 | msgstr "" 27 | 28 | msgctxt "#30010" 29 | msgid "Backup" 30 | msgstr "" 31 | 32 | msgctxt "#30011" 33 | msgid "General" 34 | msgstr "" 35 | 36 | msgctxt "#30012" 37 | msgid "File Selection" 38 | msgstr "" 39 | 40 | msgctxt "#30013" 41 | msgid "Scheduling" 42 | msgstr "" 43 | 44 | msgctxt "#30014" 45 | msgid "Simple" 46 | msgstr "" 47 | 48 | msgctxt "#30015" 49 | msgid "Advanced" 50 | msgstr "" 51 | 52 | msgctxt "#30016" 53 | msgid "Backup" 54 | msgstr "" 55 | 56 | msgctxt "#30017" 57 | msgid "Restore" 58 | msgstr "" 59 | 60 | msgctxt "#30018" 61 | msgid "Browse Path" 62 | msgstr "" 63 | 64 | msgctxt "#30019" 65 | msgid "Type Path" 66 | msgstr "" 67 | 68 | msgctxt "#30020" 69 | msgid "Browse Remote Path" 70 | msgstr "" 71 | 72 | msgctxt "#30021" 73 | msgid "Backup Folder Name" 74 | msgstr "" 75 | 76 | msgctxt "#30022" 77 | msgid "Progress Display" 78 | msgstr "" 79 | 80 | msgctxt "#30023" 81 | msgid "Mode" 82 | msgstr "" 83 | 84 | msgctxt "#30024" 85 | msgid "Type Remote Path" 86 | msgstr "" 87 | 88 | msgctxt "#30025" 89 | msgid "Remote Path Type" 90 | msgstr "" 91 | 92 | msgctxt "#30026" 93 | msgid "Backups to keep (0 for all)" 94 | msgstr "" 95 | 96 | msgctxt "#30027" 97 | msgid "Dropbox" 98 | msgstr "" 99 | 100 | msgctxt "#30028" 101 | msgid "Dropbox Key" 102 | msgstr "" 103 | 104 | msgctxt "#30029" 105 | msgid "Dropbox Secret" 106 | msgstr "" 107 | 108 | msgctxt "#30030" 109 | msgid "User Addons" 110 | msgstr "" 111 | 112 | msgctxt "#30031" 113 | msgid "Addon Data" 114 | msgstr "" 115 | 116 | msgctxt "#30032" 117 | msgid "Database" 118 | msgstr "" 119 | 120 | msgctxt "#30033" 121 | msgid "Playlist" 122 | msgstr "" 123 | 124 | msgctxt "#30034" 125 | msgid "Thumbnails/Fanart" 126 | msgstr "" 127 | 128 | msgctxt "#30035" 129 | msgid "Config Files" 130 | msgstr "" 131 | 132 | msgctxt "#30036" 133 | msgid "Disclaimer" 134 | msgstr "" 135 | 136 | msgctxt "#30037" 137 | msgid "Canceling this menu will close and save changes" 138 | msgstr "" 139 | 140 | msgctxt "#30038" 141 | msgid "Advanced Settings Detected" 142 | msgstr "" 143 | 144 | msgctxt "#30039" 145 | msgid "The advancedsettings file should be restored first" 146 | msgstr "" 147 | 148 | msgctxt "#30040" 149 | msgid "Select Yes to restore this file and restart Kodi" 150 | msgstr "" 151 | 152 | msgctxt "#30041" 153 | msgid "Select No to continue" 154 | msgstr "" 155 | 156 | msgctxt "#30042" 157 | msgid "Resume Restore" 158 | msgstr "" 159 | 160 | msgctxt "#30043" 161 | msgid "The Backup addon has detected an unfinished restore" 162 | msgstr "" 163 | 164 | msgctxt "#30044" 165 | msgid "Would you like to continue?" 166 | msgstr "" 167 | 168 | msgctxt "#30045" 169 | msgid "Error: Remote or zip file path doesn't exist" 170 | msgstr "" 171 | 172 | msgctxt "#30046" 173 | msgid "Starting" 174 | msgstr "" 175 | 176 | msgctxt "#30047" 177 | msgid "Local Dir" 178 | msgstr "" 179 | 180 | msgctxt "#30048" 181 | msgid "Remote Dir" 182 | msgstr "" 183 | 184 | msgctxt "#30049" 185 | msgid "Gathering file list" 186 | msgstr "" 187 | 188 | msgctxt "#30050" 189 | msgid "Remote Path exists - may have old files in it!" 190 | msgstr "" 191 | 192 | msgctxt "#30051" 193 | msgid "Creating Files List" 194 | msgstr "" 195 | 196 | msgctxt "#30052" 197 | msgid "Writing file" 198 | msgstr "" 199 | 200 | msgctxt "#30053" 201 | msgid "Starting scheduled backup" 202 | msgstr "" 203 | 204 | msgctxt "#30054" 205 | msgid "Removing backup" 206 | msgstr "" 207 | 208 | msgctxt "#30056" 209 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 210 | msgstr "" 211 | 212 | msgctxt "#30057" 213 | msgid "Click OK AFTER completion" 214 | msgstr "" 215 | 216 | msgctxt "#30058" 217 | msgid "Developer Code Needed" 218 | msgstr "" 219 | 220 | msgctxt "#30059" 221 | msgid "Visit https://www.dropbox.com/developers" 222 | msgstr "" 223 | 224 | msgctxt "#30060" 225 | msgid "Enable Scheduler" 226 | msgstr "" 227 | 228 | msgctxt "#30061" 229 | msgid "Schedule" 230 | msgstr "" 231 | 232 | msgctxt "#30062" 233 | msgid "Hour of Day" 234 | msgstr "" 235 | 236 | msgctxt "#30063" 237 | msgid "Day of Week" 238 | msgstr "" 239 | 240 | msgctxt "#30064" 241 | msgid "Cron Schedule" 242 | msgstr "" 243 | 244 | msgctxt "#30065" 245 | msgid "Sunday" 246 | msgstr "" 247 | 248 | msgctxt "#30066" 249 | msgid "Monday" 250 | msgstr "" 251 | 252 | msgctxt "#30067" 253 | msgid "Tuesday" 254 | msgstr "" 255 | 256 | msgctxt "#30068" 257 | msgid "Wednesday" 258 | msgstr "" 259 | 260 | msgctxt "#30069" 261 | msgid "Thursday" 262 | msgstr "" 263 | 264 | msgctxt "#30070" 265 | msgid "Friday" 266 | msgstr "" 267 | 268 | msgctxt "#30071" 269 | msgid "Saturday" 270 | msgstr "" 271 | 272 | msgctxt "#30072" 273 | msgid "Every Day" 274 | msgstr "" 275 | 276 | msgctxt "#30073" 277 | msgid "Every Week" 278 | msgstr "" 279 | 280 | msgctxt "#30074" 281 | msgid "First Day of Month" 282 | msgstr "" 283 | 284 | msgctxt "#30075" 285 | msgid "Custom Schedule" 286 | msgstr "" 287 | 288 | msgctxt "#30076" 289 | msgid "Shutdown After Backup" 290 | msgstr "" 291 | 292 | msgctxt "#30077" 293 | msgid "Restart Kodi" 294 | msgstr "" 295 | 296 | msgctxt "#30078" 297 | msgid "You should restart Kodi to continue" 298 | msgstr "" 299 | 300 | msgctxt "#30079" 301 | msgid "Just Today" 302 | msgstr "" 303 | 304 | msgctxt "#30080" 305 | msgid "Profiles" 306 | msgstr "" 307 | 308 | msgctxt "#30081" 309 | msgid "Scheduler will run again on" 310 | msgstr "" 311 | 312 | msgctxt "#30082" 313 | msgid "Progress Bar" 314 | msgstr "" 315 | 316 | msgctxt "#30083" 317 | msgid "Background Progress Bar" 318 | msgstr "" 319 | 320 | msgctxt "#30084" 321 | msgid "None (Silent)" 322 | msgstr "" 323 | 324 | msgctxt "#30085" 325 | msgid "Version Warning" 326 | msgstr "" 327 | 328 | msgctxt "#30086" 329 | msgid "This version of Kodi is different than the one used to create the archive" 330 | msgstr "" 331 | 332 | msgctxt "#30087" 333 | msgid "Compress Archives" 334 | msgstr "" 335 | 336 | msgctxt "#30088" 337 | msgid "Copying Zip Archive" 338 | msgstr "" 339 | 340 | msgctxt "#30089" 341 | msgid "Write Error Detected" 342 | msgstr "" 343 | 344 | msgctxt "#30090" 345 | msgid "The destination may not be writeable" 346 | msgstr "" 347 | 348 | msgctxt "#30091" 349 | msgid "Zip archive could not be copied" 350 | msgstr "" 351 | 352 | msgctxt "#30092" 353 | msgid "Not all files were copied" 354 | msgstr "" 355 | 356 | msgctxt "#30093" 357 | msgid "Delete Authorization Info" 358 | msgstr "" 359 | 360 | msgctxt "#30094" 361 | msgid "This will delete any OAuth token files" 362 | msgstr "" 363 | 364 | msgctxt "#30095" 365 | msgid "Do you want to do this?" 366 | msgstr "" 367 | 368 | msgctxt "#30096" 369 | msgid "Old Zip Archive could not be deleted" 370 | msgstr "" 371 | 372 | msgctxt "#30097" 373 | msgid "This needs to happen before a backup can run" 374 | msgstr "" 375 | 376 | msgctxt "#30098" 377 | msgid "Google Drive" 378 | msgstr "" 379 | 380 | msgctxt "#30099" 381 | msgid "Open Settings" 382 | msgstr "" 383 | 384 | msgctxt "#30100" 385 | msgid "Extracting Archive" 386 | msgstr "" 387 | 388 | msgctxt "#30101" 389 | msgid "Error extracting the zip archive" 390 | msgstr "" 391 | 392 | msgctxt "#30102" 393 | msgid "Click OK to enter code" 394 | msgstr "" 395 | 396 | msgctxt "#30103" 397 | msgid "Validation Code" 398 | msgstr "" 399 | 400 | msgctxt "#30104" 401 | msgid "Authorize Now" 402 | msgstr "" 403 | 404 | msgctxt "#30105" 405 | msgid "Authorize this remote service in the settings first" 406 | msgstr "" 407 | 408 | msgctxt "#30106" 409 | msgid "is authorized" 410 | msgstr "" 411 | 412 | msgctxt "#30107" 413 | msgid "error authorizing" 414 | msgstr "" 415 | 416 | msgctxt "#30108" 417 | msgid "Visit https://console.developers.google.com/" 418 | msgstr "" 419 | 420 | msgctxt "#30109" 421 | msgid "Run on startup if missed" 422 | msgstr "" 423 | 424 | msgctxt "#30110" 425 | msgid "Set Name" 426 | msgstr "" 427 | 428 | msgctxt "#30111" 429 | msgid "Root folder selection" 430 | msgstr "" 431 | 432 | msgctxt "#30112" 433 | msgid "Browse Folder" 434 | msgstr "" 435 | 436 | msgctxt "#30113" 437 | msgid "Enter Own" 438 | msgstr "" 439 | 440 | msgctxt "#30114" 441 | msgid "starts in Kodi home" 442 | msgstr "" 443 | 444 | msgctxt "#30115" 445 | msgid "enter path to start there" 446 | msgstr "" 447 | 448 | msgctxt "#30116" 449 | msgid "Enter root path" 450 | msgstr "" 451 | 452 | msgctxt "#30117" 453 | msgid "Path Error" 454 | msgstr "" 455 | 456 | msgctxt "#30118" 457 | msgid "Path does not exist" 458 | msgstr "" 459 | 460 | msgctxt "#30119" 461 | msgid "Select root" 462 | msgstr "" 463 | 464 | msgctxt "#30120" 465 | msgid "Add Exclude Folder" 466 | msgstr "" 467 | 468 | msgctxt "#30121" 469 | msgid "Root Folder" 470 | msgstr "" 471 | 472 | msgctxt "#30122" 473 | msgid "Edit" 474 | msgstr "" 475 | 476 | msgctxt "#30123" 477 | msgid "Delete" 478 | msgstr "" 479 | 480 | msgctxt "#30124" 481 | msgid "Choose Action" 482 | msgstr "" 483 | 484 | msgctxt "#30125" 485 | msgid "Advanced Editor" 486 | msgstr "" 487 | 488 | msgctxt "#30126" 489 | msgid "Add Set" 490 | msgstr "" 491 | 492 | msgctxt "#30127" 493 | msgid "Delete Set" 494 | msgstr "" 495 | 496 | msgctxt "#30128" 497 | msgid "Are you sure you want to delete?" 498 | msgstr "" 499 | 500 | msgctxt "#30129" 501 | msgid "Exclude" 502 | msgstr "" 503 | 504 | msgctxt "#30130" 505 | msgid "The root folder cannot be changed" 506 | msgstr "" 507 | 508 | msgctxt "#30131" 509 | msgid "Choose Sets to Restore" 510 | msgstr "" 511 | 512 | msgctxt "#30132" 513 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 514 | msgstr "" 515 | 516 | msgctxt "#30133" 517 | msgid "Game Saves" 518 | msgstr "" 519 | 520 | msgctxt "#30134" 521 | msgid "Include" 522 | msgstr "" 523 | 524 | msgctxt "#30135" 525 | msgid "Add Include Folder" 526 | msgstr "" 527 | 528 | msgctxt "#30136" 529 | msgid "Path must be within root folder" 530 | msgstr "" 531 | 532 | msgctxt "#30137" 533 | msgid "This path is part of a rule already" 534 | msgstr "" 535 | 536 | msgctxt "#30138" 537 | msgid "Set Name exists already" 538 | msgstr "" 539 | 540 | msgctxt "#30139" 541 | msgid "Copy Simple Config" 542 | msgstr "" 543 | 544 | msgctxt "#30140" 545 | msgid "This will copy the default Simple file selection to the Advanced Editor" 546 | msgstr "" 547 | 548 | msgctxt "#30141" 549 | msgid "This will erase any current Advanced Editor settings" 550 | msgstr "" 551 | 552 | msgctxt "#30142" 553 | msgid "Enable Verbose Logging" 554 | msgstr "" 555 | 556 | msgctxt "#30143" 557 | msgid "Exclude a specific folder from this backup set" 558 | msgstr "" 559 | 560 | msgctxt "#30144" 561 | msgid "Include a specific folder to this backup set" 562 | msgstr "" 563 | 564 | msgctxt "#30145" 565 | msgid "Type" 566 | msgstr "" 567 | 568 | msgctxt "#30146" 569 | msgid "Include Sub Folders" 570 | msgstr "" 571 | 572 | msgctxt "#30147" 573 | msgid "Toggle Sub Folders" 574 | msgstr "" 575 | 576 | msgctxt "#30148" 577 | msgid "Ask before restoring Kodi UI settings" 578 | msgstr "" 579 | 580 | msgctxt "#30149" 581 | msgid "Restore Kodi UI Settings" 582 | msgstr "" 583 | 584 | msgctxt "#30150" 585 | msgid "Restore saved Kodi system settings from backup?" 586 | msgstr "" 587 | 588 | msgctxt "#30151" 589 | msgid "Enable Verbose Logging" 590 | msgstr "" 591 | 592 | msgctxt "#30152" 593 | msgid "Set Zip File Location" 594 | msgstr "" 595 | 596 | msgctxt "#30153" 597 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 598 | msgstr "" 599 | 600 | msgctxt "#30154" 601 | msgid "Always prompt if Kodi settings should be restored - no by default" 602 | msgstr "" 603 | 604 | msgctxt "#30155" 605 | msgid "Adds additional information to the log file" 606 | msgstr "" 607 | 608 | msgctxt "#30156" 609 | msgid "Must save key/secret first, then return to settings to authorize" 610 | msgstr "" 611 | 612 | msgctxt "#30157" 613 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 614 | msgstr "" 615 | 616 | msgctxt "#30158" 617 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 618 | msgstr "" 619 | 620 | msgctxt "#30159" 621 | msgid "Backup started with unknown mode" 622 | msgstr "" 623 | 624 | msgctxt "#30160" 625 | msgid "Backup Filename Suffix" 626 | msgstr "" 627 | 628 | msgctxt "#30161" 629 | msgid "Amend a string to the end of each backup folder or ZIP file" 630 | msgstr "" 631 | -------------------------------------------------------------------------------- /resources/language/resource.language.mi/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2022-03-09 14:05+0000\n" 12 | "Last-Translator: Christian Gade \n" 13 | "Language-Team: Maori \n" 14 | "Language: mi\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=n > 1;\n" 19 | "X-Generator: Weblate 4.11.2\n" 20 | 21 | msgctxt "Addon Summary" 22 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 23 | msgstr "" 24 | 25 | msgctxt "Addon Description" 26 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 27 | msgstr "" 28 | 29 | msgctxt "#30010" 30 | msgid "Backup" 31 | msgstr "" 32 | 33 | msgctxt "#30011" 34 | msgid "General" 35 | msgstr "Āhuawhānui" 36 | 37 | msgctxt "#30012" 38 | msgid "File Selection" 39 | msgstr "" 40 | 41 | msgctxt "#30013" 42 | msgid "Scheduling" 43 | msgstr "" 44 | 45 | msgctxt "#30014" 46 | msgid "Simple" 47 | msgstr "" 48 | 49 | msgctxt "#30015" 50 | msgid "Advanced" 51 | msgstr "" 52 | 53 | msgctxt "#30016" 54 | msgid "Backup" 55 | msgstr "" 56 | 57 | msgctxt "#30017" 58 | msgid "Restore" 59 | msgstr "" 60 | 61 | msgctxt "#30018" 62 | msgid "Browse Path" 63 | msgstr "" 64 | 65 | msgctxt "#30019" 66 | msgid "Type Path" 67 | msgstr "" 68 | 69 | msgctxt "#30020" 70 | msgid "Browse Remote Path" 71 | msgstr "" 72 | 73 | msgctxt "#30021" 74 | msgid "Backup Folder Name" 75 | msgstr "" 76 | 77 | msgctxt "#30022" 78 | msgid "Progress Display" 79 | msgstr "" 80 | 81 | msgctxt "#30023" 82 | msgid "Mode" 83 | msgstr "" 84 | 85 | msgctxt "#30024" 86 | msgid "Type Remote Path" 87 | msgstr "" 88 | 89 | msgctxt "#30025" 90 | msgid "Remote Path Type" 91 | msgstr "" 92 | 93 | msgctxt "#30026" 94 | msgid "Backups to keep (0 for all)" 95 | msgstr "" 96 | 97 | msgctxt "#30027" 98 | msgid "Dropbox" 99 | msgstr "" 100 | 101 | msgctxt "#30028" 102 | msgid "Dropbox Key" 103 | msgstr "" 104 | 105 | msgctxt "#30029" 106 | msgid "Dropbox Secret" 107 | msgstr "" 108 | 109 | msgctxt "#30030" 110 | msgid "User Addons" 111 | msgstr "" 112 | 113 | msgctxt "#30031" 114 | msgid "Addon Data" 115 | msgstr "" 116 | 117 | msgctxt "#30032" 118 | msgid "Database" 119 | msgstr "" 120 | 121 | msgctxt "#30033" 122 | msgid "Playlist" 123 | msgstr "" 124 | 125 | msgctxt "#30034" 126 | msgid "Thumbnails/Fanart" 127 | msgstr "" 128 | 129 | msgctxt "#30035" 130 | msgid "Config Files" 131 | msgstr "" 132 | 133 | msgctxt "#30036" 134 | msgid "Disclaimer" 135 | msgstr "" 136 | 137 | msgctxt "#30037" 138 | msgid "Canceling this menu will close and save changes" 139 | msgstr "" 140 | 141 | msgctxt "#30038" 142 | msgid "Advanced Settings Detected" 143 | msgstr "" 144 | 145 | msgctxt "#30039" 146 | msgid "The advancedsettings file should be restored first" 147 | msgstr "" 148 | 149 | msgctxt "#30040" 150 | msgid "Select Yes to restore this file and restart Kodi" 151 | msgstr "" 152 | 153 | msgctxt "#30041" 154 | msgid "Select No to continue" 155 | msgstr "" 156 | 157 | msgctxt "#30042" 158 | msgid "Resume Restore" 159 | msgstr "" 160 | 161 | msgctxt "#30043" 162 | msgid "The Backup addon has detected an unfinished restore" 163 | msgstr "" 164 | 165 | msgctxt "#30044" 166 | msgid "Would you like to continue?" 167 | msgstr "" 168 | 169 | msgctxt "#30045" 170 | msgid "Error: Remote or zip file path doesn't exist" 171 | msgstr "" 172 | 173 | msgctxt "#30046" 174 | msgid "Starting" 175 | msgstr "" 176 | 177 | msgctxt "#30047" 178 | msgid "Local Dir" 179 | msgstr "" 180 | 181 | msgctxt "#30048" 182 | msgid "Remote Dir" 183 | msgstr "" 184 | 185 | msgctxt "#30049" 186 | msgid "Gathering file list" 187 | msgstr "" 188 | 189 | msgctxt "#30050" 190 | msgid "Remote Path exists - may have old files in it!" 191 | msgstr "" 192 | 193 | msgctxt "#30051" 194 | msgid "Creating Files List" 195 | msgstr "" 196 | 197 | msgctxt "#30052" 198 | msgid "Writing file" 199 | msgstr "" 200 | 201 | msgctxt "#30053" 202 | msgid "Starting scheduled backup" 203 | msgstr "" 204 | 205 | msgctxt "#30054" 206 | msgid "Removing backup" 207 | msgstr "" 208 | 209 | msgctxt "#30056" 210 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 211 | msgstr "" 212 | 213 | msgctxt "#30057" 214 | msgid "Click OK AFTER completion" 215 | msgstr "" 216 | 217 | msgctxt "#30058" 218 | msgid "Developer Code Needed" 219 | msgstr "" 220 | 221 | msgctxt "#30059" 222 | msgid "Visit https://www.dropbox.com/developers" 223 | msgstr "" 224 | 225 | msgctxt "#30060" 226 | msgid "Enable Scheduler" 227 | msgstr "" 228 | 229 | msgctxt "#30061" 230 | msgid "Schedule" 231 | msgstr "" 232 | 233 | msgctxt "#30062" 234 | msgid "Hour of Day" 235 | msgstr "" 236 | 237 | msgctxt "#30063" 238 | msgid "Day of Week" 239 | msgstr "" 240 | 241 | msgctxt "#30064" 242 | msgid "Cron Schedule" 243 | msgstr "" 244 | 245 | msgctxt "#30065" 246 | msgid "Sunday" 247 | msgstr "" 248 | 249 | msgctxt "#30066" 250 | msgid "Monday" 251 | msgstr "" 252 | 253 | msgctxt "#30067" 254 | msgid "Tuesday" 255 | msgstr "" 256 | 257 | msgctxt "#30068" 258 | msgid "Wednesday" 259 | msgstr "" 260 | 261 | msgctxt "#30069" 262 | msgid "Thursday" 263 | msgstr "" 264 | 265 | msgctxt "#30070" 266 | msgid "Friday" 267 | msgstr "" 268 | 269 | msgctxt "#30071" 270 | msgid "Saturday" 271 | msgstr "" 272 | 273 | msgctxt "#30072" 274 | msgid "Every Day" 275 | msgstr "" 276 | 277 | msgctxt "#30073" 278 | msgid "Every Week" 279 | msgstr "" 280 | 281 | msgctxt "#30074" 282 | msgid "First Day of Month" 283 | msgstr "" 284 | 285 | msgctxt "#30075" 286 | msgid "Custom Schedule" 287 | msgstr "" 288 | 289 | msgctxt "#30076" 290 | msgid "Shutdown After Backup" 291 | msgstr "" 292 | 293 | msgctxt "#30077" 294 | msgid "Restart Kodi" 295 | msgstr "" 296 | 297 | msgctxt "#30078" 298 | msgid "You should restart Kodi to continue" 299 | msgstr "" 300 | 301 | msgctxt "#30079" 302 | msgid "Just Today" 303 | msgstr "" 304 | 305 | msgctxt "#30080" 306 | msgid "Profiles" 307 | msgstr "" 308 | 309 | msgctxt "#30081" 310 | msgid "Scheduler will run again on" 311 | msgstr "" 312 | 313 | msgctxt "#30082" 314 | msgid "Progress Bar" 315 | msgstr "" 316 | 317 | msgctxt "#30083" 318 | msgid "Background Progress Bar" 319 | msgstr "" 320 | 321 | msgctxt "#30084" 322 | msgid "None (Silent)" 323 | msgstr "" 324 | 325 | msgctxt "#30085" 326 | msgid "Version Warning" 327 | msgstr "" 328 | 329 | msgctxt "#30086" 330 | msgid "This version of Kodi is different than the one used to create the archive" 331 | msgstr "" 332 | 333 | msgctxt "#30087" 334 | msgid "Compress Archives" 335 | msgstr "" 336 | 337 | msgctxt "#30088" 338 | msgid "Copying Zip Archive" 339 | msgstr "" 340 | 341 | msgctxt "#30089" 342 | msgid "Write Error Detected" 343 | msgstr "" 344 | 345 | msgctxt "#30090" 346 | msgid "The destination may not be writeable" 347 | msgstr "" 348 | 349 | msgctxt "#30091" 350 | msgid "Zip archive could not be copied" 351 | msgstr "" 352 | 353 | msgctxt "#30092" 354 | msgid "Not all files were copied" 355 | msgstr "" 356 | 357 | msgctxt "#30093" 358 | msgid "Delete Authorization Info" 359 | msgstr "" 360 | 361 | msgctxt "#30094" 362 | msgid "This will delete any OAuth token files" 363 | msgstr "" 364 | 365 | msgctxt "#30095" 366 | msgid "Do you want to do this?" 367 | msgstr "" 368 | 369 | msgctxt "#30096" 370 | msgid "Old Zip Archive could not be deleted" 371 | msgstr "" 372 | 373 | msgctxt "#30097" 374 | msgid "This needs to happen before a backup can run" 375 | msgstr "" 376 | 377 | msgctxt "#30098" 378 | msgid "Google Drive" 379 | msgstr "" 380 | 381 | msgctxt "#30099" 382 | msgid "Open Settings" 383 | msgstr "" 384 | 385 | msgctxt "#30100" 386 | msgid "Extracting Archive" 387 | msgstr "" 388 | 389 | msgctxt "#30101" 390 | msgid "Error extracting the zip archive" 391 | msgstr "" 392 | 393 | msgctxt "#30102" 394 | msgid "Click OK to enter code" 395 | msgstr "" 396 | 397 | msgctxt "#30103" 398 | msgid "Validation Code" 399 | msgstr "" 400 | 401 | msgctxt "#30104" 402 | msgid "Authorize Now" 403 | msgstr "" 404 | 405 | msgctxt "#30105" 406 | msgid "Authorize this remote service in the settings first" 407 | msgstr "" 408 | 409 | msgctxt "#30106" 410 | msgid "is authorized" 411 | msgstr "" 412 | 413 | msgctxt "#30107" 414 | msgid "error authorizing" 415 | msgstr "" 416 | 417 | msgctxt "#30108" 418 | msgid "Visit https://console.developers.google.com/" 419 | msgstr "" 420 | 421 | msgctxt "#30109" 422 | msgid "Run on startup if missed" 423 | msgstr "" 424 | 425 | msgctxt "#30110" 426 | msgid "Set Name" 427 | msgstr "" 428 | 429 | msgctxt "#30111" 430 | msgid "Root folder selection" 431 | msgstr "" 432 | 433 | msgctxt "#30112" 434 | msgid "Browse Folder" 435 | msgstr "" 436 | 437 | msgctxt "#30113" 438 | msgid "Enter Own" 439 | msgstr "" 440 | 441 | msgctxt "#30114" 442 | msgid "starts in Kodi home" 443 | msgstr "" 444 | 445 | msgctxt "#30115" 446 | msgid "enter path to start there" 447 | msgstr "" 448 | 449 | msgctxt "#30116" 450 | msgid "Enter root path" 451 | msgstr "" 452 | 453 | msgctxt "#30117" 454 | msgid "Path Error" 455 | msgstr "" 456 | 457 | msgctxt "#30118" 458 | msgid "Path does not exist" 459 | msgstr "" 460 | 461 | msgctxt "#30119" 462 | msgid "Select root" 463 | msgstr "" 464 | 465 | msgctxt "#30120" 466 | msgid "Add Exclude Folder" 467 | msgstr "" 468 | 469 | msgctxt "#30121" 470 | msgid "Root Folder" 471 | msgstr "" 472 | 473 | msgctxt "#30122" 474 | msgid "Edit" 475 | msgstr "" 476 | 477 | msgctxt "#30123" 478 | msgid "Delete" 479 | msgstr "" 480 | 481 | msgctxt "#30124" 482 | msgid "Choose Action" 483 | msgstr "" 484 | 485 | msgctxt "#30125" 486 | msgid "Advanced Editor" 487 | msgstr "" 488 | 489 | msgctxt "#30126" 490 | msgid "Add Set" 491 | msgstr "" 492 | 493 | msgctxt "#30127" 494 | msgid "Delete Set" 495 | msgstr "" 496 | 497 | msgctxt "#30128" 498 | msgid "Are you sure you want to delete?" 499 | msgstr "" 500 | 501 | msgctxt "#30129" 502 | msgid "Exclude" 503 | msgstr "" 504 | 505 | msgctxt "#30130" 506 | msgid "The root folder cannot be changed" 507 | msgstr "" 508 | 509 | msgctxt "#30131" 510 | msgid "Choose Sets to Restore" 511 | msgstr "" 512 | 513 | msgctxt "#30132" 514 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 515 | msgstr "" 516 | 517 | msgctxt "#30133" 518 | msgid "Game Saves" 519 | msgstr "" 520 | 521 | msgctxt "#30134" 522 | msgid "Include" 523 | msgstr "" 524 | 525 | msgctxt "#30135" 526 | msgid "Add Include Folder" 527 | msgstr "" 528 | 529 | msgctxt "#30136" 530 | msgid "Path must be within root folder" 531 | msgstr "" 532 | 533 | msgctxt "#30137" 534 | msgid "This path is part of a rule already" 535 | msgstr "" 536 | 537 | msgctxt "#30138" 538 | msgid "Set Name exists already" 539 | msgstr "" 540 | 541 | msgctxt "#30139" 542 | msgid "Copy Simple Config" 543 | msgstr "" 544 | 545 | msgctxt "#30140" 546 | msgid "This will copy the default Simple file selection to the Advanced Editor" 547 | msgstr "" 548 | 549 | msgctxt "#30141" 550 | msgid "This will erase any current Advanced Editor settings" 551 | msgstr "" 552 | 553 | msgctxt "#30142" 554 | msgid "Enable Verbose Logging" 555 | msgstr "" 556 | 557 | msgctxt "#30143" 558 | msgid "Exclude a specific folder from this backup set" 559 | msgstr "" 560 | 561 | msgctxt "#30144" 562 | msgid "Include a specific folder to this backup set" 563 | msgstr "" 564 | 565 | msgctxt "#30145" 566 | msgid "Type" 567 | msgstr "" 568 | 569 | msgctxt "#30146" 570 | msgid "Include Sub Folders" 571 | msgstr "" 572 | 573 | msgctxt "#30147" 574 | msgid "Toggle Sub Folders" 575 | msgstr "" 576 | 577 | msgctxt "#30148" 578 | msgid "Ask before restoring Kodi UI settings" 579 | msgstr "" 580 | 581 | msgctxt "#30149" 582 | msgid "Restore Kodi UI Settings" 583 | msgstr "" 584 | 585 | msgctxt "#30150" 586 | msgid "Restore saved Kodi system settings from backup?" 587 | msgstr "" 588 | 589 | msgctxt "#30151" 590 | msgid "Enable Verbose Logging" 591 | msgstr "" 592 | 593 | msgctxt "#30152" 594 | msgid "Set Zip File Location" 595 | msgstr "" 596 | 597 | msgctxt "#30153" 598 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 599 | msgstr "" 600 | 601 | msgctxt "#30154" 602 | msgid "Always prompt if Kodi settings should be restored - no by default" 603 | msgstr "" 604 | 605 | msgctxt "#30155" 606 | msgid "Adds additional information to the log file" 607 | msgstr "" 608 | 609 | msgctxt "#30156" 610 | msgid "Must save key/secret first, then return to settings to authorize" 611 | msgstr "" 612 | 613 | msgctxt "#30157" 614 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 615 | msgstr "" 616 | 617 | msgctxt "#30158" 618 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 619 | msgstr "" 620 | 621 | msgctxt "#30159" 622 | msgid "Backup started with unknown mode" 623 | msgstr "" 624 | 625 | msgctxt "#30160" 626 | msgid "Backup Filename Suffix" 627 | msgstr "" 628 | 629 | msgctxt "#30161" 630 | msgid "Amend a string to the end of each backup folder or ZIP file" 631 | msgstr "" 632 | -------------------------------------------------------------------------------- /resources/language/resource.language.ml_in/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2022-03-09 14:05+0000\n" 12 | "Last-Translator: Christian Gade \n" 13 | "Language-Team: Malayalam (India) \n" 14 | "Language: ml_in\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 19 | "X-Generator: Weblate 4.11.2\n" 20 | 21 | msgctxt "Addon Summary" 22 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 23 | msgstr "" 24 | 25 | msgctxt "Addon Description" 26 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 27 | msgstr "" 28 | 29 | msgctxt "#30010" 30 | msgid "Backup" 31 | msgstr "" 32 | 33 | msgctxt "#30011" 34 | msgid "General" 35 | msgstr "പോതുവായത്" 36 | 37 | msgctxt "#30012" 38 | msgid "File Selection" 39 | msgstr "" 40 | 41 | msgctxt "#30013" 42 | msgid "Scheduling" 43 | msgstr "" 44 | 45 | msgctxt "#30014" 46 | msgid "Simple" 47 | msgstr "" 48 | 49 | msgctxt "#30015" 50 | msgid "Advanced" 51 | msgstr "" 52 | 53 | msgctxt "#30016" 54 | msgid "Backup" 55 | msgstr "" 56 | 57 | msgctxt "#30017" 58 | msgid "Restore" 59 | msgstr "" 60 | 61 | msgctxt "#30018" 62 | msgid "Browse Path" 63 | msgstr "" 64 | 65 | msgctxt "#30019" 66 | msgid "Type Path" 67 | msgstr "" 68 | 69 | msgctxt "#30020" 70 | msgid "Browse Remote Path" 71 | msgstr "" 72 | 73 | msgctxt "#30021" 74 | msgid "Backup Folder Name" 75 | msgstr "" 76 | 77 | msgctxt "#30022" 78 | msgid "Progress Display" 79 | msgstr "" 80 | 81 | msgctxt "#30023" 82 | msgid "Mode" 83 | msgstr "" 84 | 85 | msgctxt "#30024" 86 | msgid "Type Remote Path" 87 | msgstr "" 88 | 89 | msgctxt "#30025" 90 | msgid "Remote Path Type" 91 | msgstr "" 92 | 93 | msgctxt "#30026" 94 | msgid "Backups to keep (0 for all)" 95 | msgstr "" 96 | 97 | msgctxt "#30027" 98 | msgid "Dropbox" 99 | msgstr "" 100 | 101 | msgctxt "#30028" 102 | msgid "Dropbox Key" 103 | msgstr "" 104 | 105 | msgctxt "#30029" 106 | msgid "Dropbox Secret" 107 | msgstr "" 108 | 109 | msgctxt "#30030" 110 | msgid "User Addons" 111 | msgstr "" 112 | 113 | msgctxt "#30031" 114 | msgid "Addon Data" 115 | msgstr "" 116 | 117 | msgctxt "#30032" 118 | msgid "Database" 119 | msgstr "" 120 | 121 | msgctxt "#30033" 122 | msgid "Playlist" 123 | msgstr "" 124 | 125 | msgctxt "#30034" 126 | msgid "Thumbnails/Fanart" 127 | msgstr "" 128 | 129 | msgctxt "#30035" 130 | msgid "Config Files" 131 | msgstr "" 132 | 133 | msgctxt "#30036" 134 | msgid "Disclaimer" 135 | msgstr "" 136 | 137 | msgctxt "#30037" 138 | msgid "Canceling this menu will close and save changes" 139 | msgstr "" 140 | 141 | msgctxt "#30038" 142 | msgid "Advanced Settings Detected" 143 | msgstr "" 144 | 145 | msgctxt "#30039" 146 | msgid "The advancedsettings file should be restored first" 147 | msgstr "" 148 | 149 | msgctxt "#30040" 150 | msgid "Select Yes to restore this file and restart Kodi" 151 | msgstr "" 152 | 153 | msgctxt "#30041" 154 | msgid "Select No to continue" 155 | msgstr "" 156 | 157 | msgctxt "#30042" 158 | msgid "Resume Restore" 159 | msgstr "" 160 | 161 | msgctxt "#30043" 162 | msgid "The Backup addon has detected an unfinished restore" 163 | msgstr "" 164 | 165 | msgctxt "#30044" 166 | msgid "Would you like to continue?" 167 | msgstr "" 168 | 169 | msgctxt "#30045" 170 | msgid "Error: Remote or zip file path doesn't exist" 171 | msgstr "" 172 | 173 | msgctxt "#30046" 174 | msgid "Starting" 175 | msgstr "" 176 | 177 | msgctxt "#30047" 178 | msgid "Local Dir" 179 | msgstr "" 180 | 181 | msgctxt "#30048" 182 | msgid "Remote Dir" 183 | msgstr "" 184 | 185 | msgctxt "#30049" 186 | msgid "Gathering file list" 187 | msgstr "" 188 | 189 | msgctxt "#30050" 190 | msgid "Remote Path exists - may have old files in it!" 191 | msgstr "" 192 | 193 | msgctxt "#30051" 194 | msgid "Creating Files List" 195 | msgstr "" 196 | 197 | msgctxt "#30052" 198 | msgid "Writing file" 199 | msgstr "" 200 | 201 | msgctxt "#30053" 202 | msgid "Starting scheduled backup" 203 | msgstr "" 204 | 205 | msgctxt "#30054" 206 | msgid "Removing backup" 207 | msgstr "" 208 | 209 | msgctxt "#30056" 210 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 211 | msgstr "" 212 | 213 | msgctxt "#30057" 214 | msgid "Click OK AFTER completion" 215 | msgstr "" 216 | 217 | msgctxt "#30058" 218 | msgid "Developer Code Needed" 219 | msgstr "" 220 | 221 | msgctxt "#30059" 222 | msgid "Visit https://www.dropbox.com/developers" 223 | msgstr "" 224 | 225 | msgctxt "#30060" 226 | msgid "Enable Scheduler" 227 | msgstr "" 228 | 229 | msgctxt "#30061" 230 | msgid "Schedule" 231 | msgstr "" 232 | 233 | msgctxt "#30062" 234 | msgid "Hour of Day" 235 | msgstr "" 236 | 237 | msgctxt "#30063" 238 | msgid "Day of Week" 239 | msgstr "" 240 | 241 | msgctxt "#30064" 242 | msgid "Cron Schedule" 243 | msgstr "" 244 | 245 | msgctxt "#30065" 246 | msgid "Sunday" 247 | msgstr "" 248 | 249 | msgctxt "#30066" 250 | msgid "Monday" 251 | msgstr "" 252 | 253 | msgctxt "#30067" 254 | msgid "Tuesday" 255 | msgstr "" 256 | 257 | msgctxt "#30068" 258 | msgid "Wednesday" 259 | msgstr "" 260 | 261 | msgctxt "#30069" 262 | msgid "Thursday" 263 | msgstr "" 264 | 265 | msgctxt "#30070" 266 | msgid "Friday" 267 | msgstr "" 268 | 269 | msgctxt "#30071" 270 | msgid "Saturday" 271 | msgstr "" 272 | 273 | msgctxt "#30072" 274 | msgid "Every Day" 275 | msgstr "" 276 | 277 | msgctxt "#30073" 278 | msgid "Every Week" 279 | msgstr "" 280 | 281 | msgctxt "#30074" 282 | msgid "First Day of Month" 283 | msgstr "" 284 | 285 | msgctxt "#30075" 286 | msgid "Custom Schedule" 287 | msgstr "" 288 | 289 | msgctxt "#30076" 290 | msgid "Shutdown After Backup" 291 | msgstr "" 292 | 293 | msgctxt "#30077" 294 | msgid "Restart Kodi" 295 | msgstr "" 296 | 297 | msgctxt "#30078" 298 | msgid "You should restart Kodi to continue" 299 | msgstr "" 300 | 301 | msgctxt "#30079" 302 | msgid "Just Today" 303 | msgstr "" 304 | 305 | msgctxt "#30080" 306 | msgid "Profiles" 307 | msgstr "" 308 | 309 | msgctxt "#30081" 310 | msgid "Scheduler will run again on" 311 | msgstr "" 312 | 313 | msgctxt "#30082" 314 | msgid "Progress Bar" 315 | msgstr "" 316 | 317 | msgctxt "#30083" 318 | msgid "Background Progress Bar" 319 | msgstr "" 320 | 321 | msgctxt "#30084" 322 | msgid "None (Silent)" 323 | msgstr "" 324 | 325 | msgctxt "#30085" 326 | msgid "Version Warning" 327 | msgstr "" 328 | 329 | msgctxt "#30086" 330 | msgid "This version of Kodi is different than the one used to create the archive" 331 | msgstr "" 332 | 333 | msgctxt "#30087" 334 | msgid "Compress Archives" 335 | msgstr "" 336 | 337 | msgctxt "#30088" 338 | msgid "Copying Zip Archive" 339 | msgstr "" 340 | 341 | msgctxt "#30089" 342 | msgid "Write Error Detected" 343 | msgstr "" 344 | 345 | msgctxt "#30090" 346 | msgid "The destination may not be writeable" 347 | msgstr "" 348 | 349 | msgctxt "#30091" 350 | msgid "Zip archive could not be copied" 351 | msgstr "" 352 | 353 | msgctxt "#30092" 354 | msgid "Not all files were copied" 355 | msgstr "" 356 | 357 | msgctxt "#30093" 358 | msgid "Delete Authorization Info" 359 | msgstr "" 360 | 361 | msgctxt "#30094" 362 | msgid "This will delete any OAuth token files" 363 | msgstr "" 364 | 365 | msgctxt "#30095" 366 | msgid "Do you want to do this?" 367 | msgstr "" 368 | 369 | msgctxt "#30096" 370 | msgid "Old Zip Archive could not be deleted" 371 | msgstr "" 372 | 373 | msgctxt "#30097" 374 | msgid "This needs to happen before a backup can run" 375 | msgstr "" 376 | 377 | msgctxt "#30098" 378 | msgid "Google Drive" 379 | msgstr "" 380 | 381 | msgctxt "#30099" 382 | msgid "Open Settings" 383 | msgstr "" 384 | 385 | msgctxt "#30100" 386 | msgid "Extracting Archive" 387 | msgstr "" 388 | 389 | msgctxt "#30101" 390 | msgid "Error extracting the zip archive" 391 | msgstr "" 392 | 393 | msgctxt "#30102" 394 | msgid "Click OK to enter code" 395 | msgstr "" 396 | 397 | msgctxt "#30103" 398 | msgid "Validation Code" 399 | msgstr "" 400 | 401 | msgctxt "#30104" 402 | msgid "Authorize Now" 403 | msgstr "" 404 | 405 | msgctxt "#30105" 406 | msgid "Authorize this remote service in the settings first" 407 | msgstr "" 408 | 409 | msgctxt "#30106" 410 | msgid "is authorized" 411 | msgstr "" 412 | 413 | msgctxt "#30107" 414 | msgid "error authorizing" 415 | msgstr "" 416 | 417 | msgctxt "#30108" 418 | msgid "Visit https://console.developers.google.com/" 419 | msgstr "" 420 | 421 | msgctxt "#30109" 422 | msgid "Run on startup if missed" 423 | msgstr "" 424 | 425 | msgctxt "#30110" 426 | msgid "Set Name" 427 | msgstr "" 428 | 429 | msgctxt "#30111" 430 | msgid "Root folder selection" 431 | msgstr "" 432 | 433 | msgctxt "#30112" 434 | msgid "Browse Folder" 435 | msgstr "" 436 | 437 | msgctxt "#30113" 438 | msgid "Enter Own" 439 | msgstr "" 440 | 441 | msgctxt "#30114" 442 | msgid "starts in Kodi home" 443 | msgstr "" 444 | 445 | msgctxt "#30115" 446 | msgid "enter path to start there" 447 | msgstr "" 448 | 449 | msgctxt "#30116" 450 | msgid "Enter root path" 451 | msgstr "" 452 | 453 | msgctxt "#30117" 454 | msgid "Path Error" 455 | msgstr "" 456 | 457 | msgctxt "#30118" 458 | msgid "Path does not exist" 459 | msgstr "" 460 | 461 | msgctxt "#30119" 462 | msgid "Select root" 463 | msgstr "" 464 | 465 | msgctxt "#30120" 466 | msgid "Add Exclude Folder" 467 | msgstr "" 468 | 469 | msgctxt "#30121" 470 | msgid "Root Folder" 471 | msgstr "" 472 | 473 | msgctxt "#30122" 474 | msgid "Edit" 475 | msgstr "" 476 | 477 | msgctxt "#30123" 478 | msgid "Delete" 479 | msgstr "" 480 | 481 | msgctxt "#30124" 482 | msgid "Choose Action" 483 | msgstr "" 484 | 485 | msgctxt "#30125" 486 | msgid "Advanced Editor" 487 | msgstr "" 488 | 489 | msgctxt "#30126" 490 | msgid "Add Set" 491 | msgstr "" 492 | 493 | msgctxt "#30127" 494 | msgid "Delete Set" 495 | msgstr "" 496 | 497 | msgctxt "#30128" 498 | msgid "Are you sure you want to delete?" 499 | msgstr "" 500 | 501 | msgctxt "#30129" 502 | msgid "Exclude" 503 | msgstr "" 504 | 505 | msgctxt "#30130" 506 | msgid "The root folder cannot be changed" 507 | msgstr "" 508 | 509 | msgctxt "#30131" 510 | msgid "Choose Sets to Restore" 511 | msgstr "" 512 | 513 | msgctxt "#30132" 514 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 515 | msgstr "" 516 | 517 | msgctxt "#30133" 518 | msgid "Game Saves" 519 | msgstr "" 520 | 521 | msgctxt "#30134" 522 | msgid "Include" 523 | msgstr "" 524 | 525 | msgctxt "#30135" 526 | msgid "Add Include Folder" 527 | msgstr "" 528 | 529 | msgctxt "#30136" 530 | msgid "Path must be within root folder" 531 | msgstr "" 532 | 533 | msgctxt "#30137" 534 | msgid "This path is part of a rule already" 535 | msgstr "" 536 | 537 | msgctxt "#30138" 538 | msgid "Set Name exists already" 539 | msgstr "" 540 | 541 | msgctxt "#30139" 542 | msgid "Copy Simple Config" 543 | msgstr "" 544 | 545 | msgctxt "#30140" 546 | msgid "This will copy the default Simple file selection to the Advanced Editor" 547 | msgstr "" 548 | 549 | msgctxt "#30141" 550 | msgid "This will erase any current Advanced Editor settings" 551 | msgstr "" 552 | 553 | msgctxt "#30142" 554 | msgid "Enable Verbose Logging" 555 | msgstr "" 556 | 557 | msgctxt "#30143" 558 | msgid "Exclude a specific folder from this backup set" 559 | msgstr "" 560 | 561 | msgctxt "#30144" 562 | msgid "Include a specific folder to this backup set" 563 | msgstr "" 564 | 565 | msgctxt "#30145" 566 | msgid "Type" 567 | msgstr "" 568 | 569 | msgctxt "#30146" 570 | msgid "Include Sub Folders" 571 | msgstr "" 572 | 573 | msgctxt "#30147" 574 | msgid "Toggle Sub Folders" 575 | msgstr "" 576 | 577 | msgctxt "#30148" 578 | msgid "Ask before restoring Kodi UI settings" 579 | msgstr "" 580 | 581 | msgctxt "#30149" 582 | msgid "Restore Kodi UI Settings" 583 | msgstr "" 584 | 585 | msgctxt "#30150" 586 | msgid "Restore saved Kodi system settings from backup?" 587 | msgstr "" 588 | 589 | msgctxt "#30151" 590 | msgid "Enable Verbose Logging" 591 | msgstr "" 592 | 593 | msgctxt "#30152" 594 | msgid "Set Zip File Location" 595 | msgstr "" 596 | 597 | msgctxt "#30153" 598 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 599 | msgstr "" 600 | 601 | msgctxt "#30154" 602 | msgid "Always prompt if Kodi settings should be restored - no by default" 603 | msgstr "" 604 | 605 | msgctxt "#30155" 606 | msgid "Adds additional information to the log file" 607 | msgstr "" 608 | 609 | msgctxt "#30156" 610 | msgid "Must save key/secret first, then return to settings to authorize" 611 | msgstr "" 612 | 613 | msgctxt "#30157" 614 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 615 | msgstr "" 616 | 617 | msgctxt "#30158" 618 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 619 | msgstr "" 620 | 621 | msgctxt "#30159" 622 | msgid "Backup started with unknown mode" 623 | msgstr "" 624 | 625 | msgctxt "#30160" 626 | msgid "Backup Filename Suffix" 627 | msgstr "" 628 | 629 | msgctxt "#30161" 630 | msgid "Amend a string to the end of each backup folder or ZIP file" 631 | msgstr "" 632 | -------------------------------------------------------------------------------- /resources/language/resource.language.mn_mn/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2022-03-09 14:05+0000\n" 12 | "Last-Translator: Christian Gade \n" 13 | "Language-Team: Mongolian \n" 14 | "Language: mn_mn\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 19 | "X-Generator: Weblate 4.11.2\n" 20 | 21 | msgctxt "Addon Summary" 22 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 23 | msgstr "" 24 | 25 | msgctxt "Addon Description" 26 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 27 | msgstr "" 28 | 29 | msgctxt "#30010" 30 | msgid "Backup" 31 | msgstr "" 32 | 33 | msgctxt "#30011" 34 | msgid "General" 35 | msgstr "Ерөнхий" 36 | 37 | msgctxt "#30012" 38 | msgid "File Selection" 39 | msgstr "" 40 | 41 | msgctxt "#30013" 42 | msgid "Scheduling" 43 | msgstr "" 44 | 45 | msgctxt "#30014" 46 | msgid "Simple" 47 | msgstr "" 48 | 49 | msgctxt "#30015" 50 | msgid "Advanced" 51 | msgstr "" 52 | 53 | msgctxt "#30016" 54 | msgid "Backup" 55 | msgstr "" 56 | 57 | msgctxt "#30017" 58 | msgid "Restore" 59 | msgstr "" 60 | 61 | msgctxt "#30018" 62 | msgid "Browse Path" 63 | msgstr "" 64 | 65 | msgctxt "#30019" 66 | msgid "Type Path" 67 | msgstr "" 68 | 69 | msgctxt "#30020" 70 | msgid "Browse Remote Path" 71 | msgstr "" 72 | 73 | msgctxt "#30021" 74 | msgid "Backup Folder Name" 75 | msgstr "" 76 | 77 | msgctxt "#30022" 78 | msgid "Progress Display" 79 | msgstr "" 80 | 81 | msgctxt "#30023" 82 | msgid "Mode" 83 | msgstr "" 84 | 85 | msgctxt "#30024" 86 | msgid "Type Remote Path" 87 | msgstr "" 88 | 89 | msgctxt "#30025" 90 | msgid "Remote Path Type" 91 | msgstr "" 92 | 93 | msgctxt "#30026" 94 | msgid "Backups to keep (0 for all)" 95 | msgstr "" 96 | 97 | msgctxt "#30027" 98 | msgid "Dropbox" 99 | msgstr "" 100 | 101 | msgctxt "#30028" 102 | msgid "Dropbox Key" 103 | msgstr "" 104 | 105 | msgctxt "#30029" 106 | msgid "Dropbox Secret" 107 | msgstr "" 108 | 109 | msgctxt "#30030" 110 | msgid "User Addons" 111 | msgstr "" 112 | 113 | msgctxt "#30031" 114 | msgid "Addon Data" 115 | msgstr "" 116 | 117 | msgctxt "#30032" 118 | msgid "Database" 119 | msgstr "" 120 | 121 | msgctxt "#30033" 122 | msgid "Playlist" 123 | msgstr "" 124 | 125 | msgctxt "#30034" 126 | msgid "Thumbnails/Fanart" 127 | msgstr "" 128 | 129 | msgctxt "#30035" 130 | msgid "Config Files" 131 | msgstr "" 132 | 133 | msgctxt "#30036" 134 | msgid "Disclaimer" 135 | msgstr "" 136 | 137 | msgctxt "#30037" 138 | msgid "Canceling this menu will close and save changes" 139 | msgstr "" 140 | 141 | msgctxt "#30038" 142 | msgid "Advanced Settings Detected" 143 | msgstr "" 144 | 145 | msgctxt "#30039" 146 | msgid "The advancedsettings file should be restored first" 147 | msgstr "" 148 | 149 | msgctxt "#30040" 150 | msgid "Select Yes to restore this file and restart Kodi" 151 | msgstr "" 152 | 153 | msgctxt "#30041" 154 | msgid "Select No to continue" 155 | msgstr "" 156 | 157 | msgctxt "#30042" 158 | msgid "Resume Restore" 159 | msgstr "" 160 | 161 | msgctxt "#30043" 162 | msgid "The Backup addon has detected an unfinished restore" 163 | msgstr "" 164 | 165 | msgctxt "#30044" 166 | msgid "Would you like to continue?" 167 | msgstr "" 168 | 169 | msgctxt "#30045" 170 | msgid "Error: Remote or zip file path doesn't exist" 171 | msgstr "" 172 | 173 | msgctxt "#30046" 174 | msgid "Starting" 175 | msgstr "" 176 | 177 | msgctxt "#30047" 178 | msgid "Local Dir" 179 | msgstr "" 180 | 181 | msgctxt "#30048" 182 | msgid "Remote Dir" 183 | msgstr "" 184 | 185 | msgctxt "#30049" 186 | msgid "Gathering file list" 187 | msgstr "" 188 | 189 | msgctxt "#30050" 190 | msgid "Remote Path exists - may have old files in it!" 191 | msgstr "" 192 | 193 | msgctxt "#30051" 194 | msgid "Creating Files List" 195 | msgstr "" 196 | 197 | msgctxt "#30052" 198 | msgid "Writing file" 199 | msgstr "" 200 | 201 | msgctxt "#30053" 202 | msgid "Starting scheduled backup" 203 | msgstr "" 204 | 205 | msgctxt "#30054" 206 | msgid "Removing backup" 207 | msgstr "" 208 | 209 | msgctxt "#30056" 210 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 211 | msgstr "" 212 | 213 | msgctxt "#30057" 214 | msgid "Click OK AFTER completion" 215 | msgstr "" 216 | 217 | msgctxt "#30058" 218 | msgid "Developer Code Needed" 219 | msgstr "" 220 | 221 | msgctxt "#30059" 222 | msgid "Visit https://www.dropbox.com/developers" 223 | msgstr "" 224 | 225 | msgctxt "#30060" 226 | msgid "Enable Scheduler" 227 | msgstr "" 228 | 229 | msgctxt "#30061" 230 | msgid "Schedule" 231 | msgstr "" 232 | 233 | msgctxt "#30062" 234 | msgid "Hour of Day" 235 | msgstr "" 236 | 237 | msgctxt "#30063" 238 | msgid "Day of Week" 239 | msgstr "" 240 | 241 | msgctxt "#30064" 242 | msgid "Cron Schedule" 243 | msgstr "" 244 | 245 | msgctxt "#30065" 246 | msgid "Sunday" 247 | msgstr "" 248 | 249 | msgctxt "#30066" 250 | msgid "Monday" 251 | msgstr "" 252 | 253 | msgctxt "#30067" 254 | msgid "Tuesday" 255 | msgstr "" 256 | 257 | msgctxt "#30068" 258 | msgid "Wednesday" 259 | msgstr "" 260 | 261 | msgctxt "#30069" 262 | msgid "Thursday" 263 | msgstr "" 264 | 265 | msgctxt "#30070" 266 | msgid "Friday" 267 | msgstr "" 268 | 269 | msgctxt "#30071" 270 | msgid "Saturday" 271 | msgstr "" 272 | 273 | msgctxt "#30072" 274 | msgid "Every Day" 275 | msgstr "" 276 | 277 | msgctxt "#30073" 278 | msgid "Every Week" 279 | msgstr "" 280 | 281 | msgctxt "#30074" 282 | msgid "First Day of Month" 283 | msgstr "" 284 | 285 | msgctxt "#30075" 286 | msgid "Custom Schedule" 287 | msgstr "" 288 | 289 | msgctxt "#30076" 290 | msgid "Shutdown After Backup" 291 | msgstr "" 292 | 293 | msgctxt "#30077" 294 | msgid "Restart Kodi" 295 | msgstr "" 296 | 297 | msgctxt "#30078" 298 | msgid "You should restart Kodi to continue" 299 | msgstr "" 300 | 301 | msgctxt "#30079" 302 | msgid "Just Today" 303 | msgstr "" 304 | 305 | msgctxt "#30080" 306 | msgid "Profiles" 307 | msgstr "" 308 | 309 | msgctxt "#30081" 310 | msgid "Scheduler will run again on" 311 | msgstr "" 312 | 313 | msgctxt "#30082" 314 | msgid "Progress Bar" 315 | msgstr "" 316 | 317 | msgctxt "#30083" 318 | msgid "Background Progress Bar" 319 | msgstr "" 320 | 321 | msgctxt "#30084" 322 | msgid "None (Silent)" 323 | msgstr "" 324 | 325 | msgctxt "#30085" 326 | msgid "Version Warning" 327 | msgstr "" 328 | 329 | msgctxt "#30086" 330 | msgid "This version of Kodi is different than the one used to create the archive" 331 | msgstr "" 332 | 333 | msgctxt "#30087" 334 | msgid "Compress Archives" 335 | msgstr "" 336 | 337 | msgctxt "#30088" 338 | msgid "Copying Zip Archive" 339 | msgstr "" 340 | 341 | msgctxt "#30089" 342 | msgid "Write Error Detected" 343 | msgstr "" 344 | 345 | msgctxt "#30090" 346 | msgid "The destination may not be writeable" 347 | msgstr "" 348 | 349 | msgctxt "#30091" 350 | msgid "Zip archive could not be copied" 351 | msgstr "" 352 | 353 | msgctxt "#30092" 354 | msgid "Not all files were copied" 355 | msgstr "" 356 | 357 | msgctxt "#30093" 358 | msgid "Delete Authorization Info" 359 | msgstr "" 360 | 361 | msgctxt "#30094" 362 | msgid "This will delete any OAuth token files" 363 | msgstr "" 364 | 365 | msgctxt "#30095" 366 | msgid "Do you want to do this?" 367 | msgstr "" 368 | 369 | msgctxt "#30096" 370 | msgid "Old Zip Archive could not be deleted" 371 | msgstr "" 372 | 373 | msgctxt "#30097" 374 | msgid "This needs to happen before a backup can run" 375 | msgstr "" 376 | 377 | msgctxt "#30098" 378 | msgid "Google Drive" 379 | msgstr "" 380 | 381 | msgctxt "#30099" 382 | msgid "Open Settings" 383 | msgstr "" 384 | 385 | msgctxt "#30100" 386 | msgid "Extracting Archive" 387 | msgstr "" 388 | 389 | msgctxt "#30101" 390 | msgid "Error extracting the zip archive" 391 | msgstr "" 392 | 393 | msgctxt "#30102" 394 | msgid "Click OK to enter code" 395 | msgstr "" 396 | 397 | msgctxt "#30103" 398 | msgid "Validation Code" 399 | msgstr "" 400 | 401 | msgctxt "#30104" 402 | msgid "Authorize Now" 403 | msgstr "" 404 | 405 | msgctxt "#30105" 406 | msgid "Authorize this remote service in the settings first" 407 | msgstr "" 408 | 409 | msgctxt "#30106" 410 | msgid "is authorized" 411 | msgstr "" 412 | 413 | msgctxt "#30107" 414 | msgid "error authorizing" 415 | msgstr "" 416 | 417 | msgctxt "#30108" 418 | msgid "Visit https://console.developers.google.com/" 419 | msgstr "" 420 | 421 | msgctxt "#30109" 422 | msgid "Run on startup if missed" 423 | msgstr "" 424 | 425 | msgctxt "#30110" 426 | msgid "Set Name" 427 | msgstr "" 428 | 429 | msgctxt "#30111" 430 | msgid "Root folder selection" 431 | msgstr "" 432 | 433 | msgctxt "#30112" 434 | msgid "Browse Folder" 435 | msgstr "" 436 | 437 | msgctxt "#30113" 438 | msgid "Enter Own" 439 | msgstr "" 440 | 441 | msgctxt "#30114" 442 | msgid "starts in Kodi home" 443 | msgstr "" 444 | 445 | msgctxt "#30115" 446 | msgid "enter path to start there" 447 | msgstr "" 448 | 449 | msgctxt "#30116" 450 | msgid "Enter root path" 451 | msgstr "" 452 | 453 | msgctxt "#30117" 454 | msgid "Path Error" 455 | msgstr "" 456 | 457 | msgctxt "#30118" 458 | msgid "Path does not exist" 459 | msgstr "" 460 | 461 | msgctxt "#30119" 462 | msgid "Select root" 463 | msgstr "" 464 | 465 | msgctxt "#30120" 466 | msgid "Add Exclude Folder" 467 | msgstr "" 468 | 469 | msgctxt "#30121" 470 | msgid "Root Folder" 471 | msgstr "" 472 | 473 | msgctxt "#30122" 474 | msgid "Edit" 475 | msgstr "" 476 | 477 | msgctxt "#30123" 478 | msgid "Delete" 479 | msgstr "Устгах" 480 | 481 | msgctxt "#30124" 482 | msgid "Choose Action" 483 | msgstr "" 484 | 485 | msgctxt "#30125" 486 | msgid "Advanced Editor" 487 | msgstr "" 488 | 489 | msgctxt "#30126" 490 | msgid "Add Set" 491 | msgstr "" 492 | 493 | msgctxt "#30127" 494 | msgid "Delete Set" 495 | msgstr "" 496 | 497 | msgctxt "#30128" 498 | msgid "Are you sure you want to delete?" 499 | msgstr "" 500 | 501 | msgctxt "#30129" 502 | msgid "Exclude" 503 | msgstr "" 504 | 505 | msgctxt "#30130" 506 | msgid "The root folder cannot be changed" 507 | msgstr "" 508 | 509 | msgctxt "#30131" 510 | msgid "Choose Sets to Restore" 511 | msgstr "" 512 | 513 | msgctxt "#30132" 514 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 515 | msgstr "" 516 | 517 | msgctxt "#30133" 518 | msgid "Game Saves" 519 | msgstr "" 520 | 521 | msgctxt "#30134" 522 | msgid "Include" 523 | msgstr "" 524 | 525 | msgctxt "#30135" 526 | msgid "Add Include Folder" 527 | msgstr "" 528 | 529 | msgctxt "#30136" 530 | msgid "Path must be within root folder" 531 | msgstr "" 532 | 533 | msgctxt "#30137" 534 | msgid "This path is part of a rule already" 535 | msgstr "" 536 | 537 | msgctxt "#30138" 538 | msgid "Set Name exists already" 539 | msgstr "" 540 | 541 | msgctxt "#30139" 542 | msgid "Copy Simple Config" 543 | msgstr "" 544 | 545 | msgctxt "#30140" 546 | msgid "This will copy the default Simple file selection to the Advanced Editor" 547 | msgstr "" 548 | 549 | msgctxt "#30141" 550 | msgid "This will erase any current Advanced Editor settings" 551 | msgstr "" 552 | 553 | msgctxt "#30142" 554 | msgid "Enable Verbose Logging" 555 | msgstr "" 556 | 557 | msgctxt "#30143" 558 | msgid "Exclude a specific folder from this backup set" 559 | msgstr "" 560 | 561 | msgctxt "#30144" 562 | msgid "Include a specific folder to this backup set" 563 | msgstr "" 564 | 565 | msgctxt "#30145" 566 | msgid "Type" 567 | msgstr "" 568 | 569 | msgctxt "#30146" 570 | msgid "Include Sub Folders" 571 | msgstr "" 572 | 573 | msgctxt "#30147" 574 | msgid "Toggle Sub Folders" 575 | msgstr "" 576 | 577 | msgctxt "#30148" 578 | msgid "Ask before restoring Kodi UI settings" 579 | msgstr "" 580 | 581 | msgctxt "#30149" 582 | msgid "Restore Kodi UI Settings" 583 | msgstr "" 584 | 585 | msgctxt "#30150" 586 | msgid "Restore saved Kodi system settings from backup?" 587 | msgstr "" 588 | 589 | msgctxt "#30151" 590 | msgid "Enable Verbose Logging" 591 | msgstr "" 592 | 593 | msgctxt "#30152" 594 | msgid "Set Zip File Location" 595 | msgstr "" 596 | 597 | msgctxt "#30153" 598 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 599 | msgstr "" 600 | 601 | msgctxt "#30154" 602 | msgid "Always prompt if Kodi settings should be restored - no by default" 603 | msgstr "" 604 | 605 | msgctxt "#30155" 606 | msgid "Adds additional information to the log file" 607 | msgstr "" 608 | 609 | msgctxt "#30156" 610 | msgid "Must save key/secret first, then return to settings to authorize" 611 | msgstr "" 612 | 613 | msgctxt "#30157" 614 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 615 | msgstr "" 616 | 617 | msgctxt "#30158" 618 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 619 | msgstr "" 620 | 621 | msgctxt "#30159" 622 | msgid "Backup started with unknown mode" 623 | msgstr "" 624 | 625 | msgctxt "#30160" 626 | msgid "Backup Filename Suffix" 627 | msgstr "" 628 | 629 | msgctxt "#30161" 630 | msgid "Amend a string to the end of each backup folder or ZIP file" 631 | msgstr "" 632 | -------------------------------------------------------------------------------- /resources/language/resource.language.oc_fr/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2022-03-09 14:05+0000\n" 12 | "Last-Translator: Christian Gade \n" 13 | "Language-Team: Occitan (France) \n" 14 | "Language: oc_fr\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 19 | "X-Generator: Weblate 4.11.2\n" 20 | 21 | msgctxt "Addon Summary" 22 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 23 | msgstr "" 24 | 25 | msgctxt "Addon Description" 26 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 27 | msgstr "" 28 | 29 | msgctxt "#30010" 30 | msgid "Backup" 31 | msgstr "" 32 | 33 | msgctxt "#30011" 34 | msgid "General" 35 | msgstr "General" 36 | 37 | msgctxt "#30012" 38 | msgid "File Selection" 39 | msgstr "" 40 | 41 | msgctxt "#30013" 42 | msgid "Scheduling" 43 | msgstr "" 44 | 45 | msgctxt "#30014" 46 | msgid "Simple" 47 | msgstr "" 48 | 49 | msgctxt "#30015" 50 | msgid "Advanced" 51 | msgstr "Avançat" 52 | 53 | msgctxt "#30016" 54 | msgid "Backup" 55 | msgstr "" 56 | 57 | msgctxt "#30017" 58 | msgid "Restore" 59 | msgstr "" 60 | 61 | msgctxt "#30018" 62 | msgid "Browse Path" 63 | msgstr "" 64 | 65 | msgctxt "#30019" 66 | msgid "Type Path" 67 | msgstr "" 68 | 69 | msgctxt "#30020" 70 | msgid "Browse Remote Path" 71 | msgstr "" 72 | 73 | msgctxt "#30021" 74 | msgid "Backup Folder Name" 75 | msgstr "" 76 | 77 | msgctxt "#30022" 78 | msgid "Progress Display" 79 | msgstr "" 80 | 81 | msgctxt "#30023" 82 | msgid "Mode" 83 | msgstr "" 84 | 85 | msgctxt "#30024" 86 | msgid "Type Remote Path" 87 | msgstr "" 88 | 89 | msgctxt "#30025" 90 | msgid "Remote Path Type" 91 | msgstr "" 92 | 93 | msgctxt "#30026" 94 | msgid "Backups to keep (0 for all)" 95 | msgstr "" 96 | 97 | msgctxt "#30027" 98 | msgid "Dropbox" 99 | msgstr "" 100 | 101 | msgctxt "#30028" 102 | msgid "Dropbox Key" 103 | msgstr "" 104 | 105 | msgctxt "#30029" 106 | msgid "Dropbox Secret" 107 | msgstr "" 108 | 109 | msgctxt "#30030" 110 | msgid "User Addons" 111 | msgstr "" 112 | 113 | msgctxt "#30031" 114 | msgid "Addon Data" 115 | msgstr "" 116 | 117 | msgctxt "#30032" 118 | msgid "Database" 119 | msgstr "" 120 | 121 | msgctxt "#30033" 122 | msgid "Playlist" 123 | msgstr "" 124 | 125 | msgctxt "#30034" 126 | msgid "Thumbnails/Fanart" 127 | msgstr "" 128 | 129 | msgctxt "#30035" 130 | msgid "Config Files" 131 | msgstr "" 132 | 133 | msgctxt "#30036" 134 | msgid "Disclaimer" 135 | msgstr "" 136 | 137 | msgctxt "#30037" 138 | msgid "Canceling this menu will close and save changes" 139 | msgstr "" 140 | 141 | msgctxt "#30038" 142 | msgid "Advanced Settings Detected" 143 | msgstr "" 144 | 145 | msgctxt "#30039" 146 | msgid "The advancedsettings file should be restored first" 147 | msgstr "" 148 | 149 | msgctxt "#30040" 150 | msgid "Select Yes to restore this file and restart Kodi" 151 | msgstr "" 152 | 153 | msgctxt "#30041" 154 | msgid "Select No to continue" 155 | msgstr "" 156 | 157 | msgctxt "#30042" 158 | msgid "Resume Restore" 159 | msgstr "" 160 | 161 | msgctxt "#30043" 162 | msgid "The Backup addon has detected an unfinished restore" 163 | msgstr "" 164 | 165 | msgctxt "#30044" 166 | msgid "Would you like to continue?" 167 | msgstr "" 168 | 169 | msgctxt "#30045" 170 | msgid "Error: Remote or zip file path doesn't exist" 171 | msgstr "" 172 | 173 | msgctxt "#30046" 174 | msgid "Starting" 175 | msgstr "" 176 | 177 | msgctxt "#30047" 178 | msgid "Local Dir" 179 | msgstr "" 180 | 181 | msgctxt "#30048" 182 | msgid "Remote Dir" 183 | msgstr "" 184 | 185 | msgctxt "#30049" 186 | msgid "Gathering file list" 187 | msgstr "" 188 | 189 | msgctxt "#30050" 190 | msgid "Remote Path exists - may have old files in it!" 191 | msgstr "" 192 | 193 | msgctxt "#30051" 194 | msgid "Creating Files List" 195 | msgstr "" 196 | 197 | msgctxt "#30052" 198 | msgid "Writing file" 199 | msgstr "" 200 | 201 | msgctxt "#30053" 202 | msgid "Starting scheduled backup" 203 | msgstr "" 204 | 205 | msgctxt "#30054" 206 | msgid "Removing backup" 207 | msgstr "" 208 | 209 | msgctxt "#30056" 210 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 211 | msgstr "" 212 | 213 | msgctxt "#30057" 214 | msgid "Click OK AFTER completion" 215 | msgstr "" 216 | 217 | msgctxt "#30058" 218 | msgid "Developer Code Needed" 219 | msgstr "" 220 | 221 | msgctxt "#30059" 222 | msgid "Visit https://www.dropbox.com/developers" 223 | msgstr "" 224 | 225 | msgctxt "#30060" 226 | msgid "Enable Scheduler" 227 | msgstr "" 228 | 229 | msgctxt "#30061" 230 | msgid "Schedule" 231 | msgstr "" 232 | 233 | msgctxt "#30062" 234 | msgid "Hour of Day" 235 | msgstr "" 236 | 237 | msgctxt "#30063" 238 | msgid "Day of Week" 239 | msgstr "" 240 | 241 | msgctxt "#30064" 242 | msgid "Cron Schedule" 243 | msgstr "" 244 | 245 | msgctxt "#30065" 246 | msgid "Sunday" 247 | msgstr "" 248 | 249 | msgctxt "#30066" 250 | msgid "Monday" 251 | msgstr "" 252 | 253 | msgctxt "#30067" 254 | msgid "Tuesday" 255 | msgstr "" 256 | 257 | msgctxt "#30068" 258 | msgid "Wednesday" 259 | msgstr "" 260 | 261 | msgctxt "#30069" 262 | msgid "Thursday" 263 | msgstr "" 264 | 265 | msgctxt "#30070" 266 | msgid "Friday" 267 | msgstr "" 268 | 269 | msgctxt "#30071" 270 | msgid "Saturday" 271 | msgstr "" 272 | 273 | msgctxt "#30072" 274 | msgid "Every Day" 275 | msgstr "" 276 | 277 | msgctxt "#30073" 278 | msgid "Every Week" 279 | msgstr "" 280 | 281 | msgctxt "#30074" 282 | msgid "First Day of Month" 283 | msgstr "" 284 | 285 | msgctxt "#30075" 286 | msgid "Custom Schedule" 287 | msgstr "" 288 | 289 | msgctxt "#30076" 290 | msgid "Shutdown After Backup" 291 | msgstr "" 292 | 293 | msgctxt "#30077" 294 | msgid "Restart Kodi" 295 | msgstr "" 296 | 297 | msgctxt "#30078" 298 | msgid "You should restart Kodi to continue" 299 | msgstr "" 300 | 301 | msgctxt "#30079" 302 | msgid "Just Today" 303 | msgstr "" 304 | 305 | msgctxt "#30080" 306 | msgid "Profiles" 307 | msgstr "" 308 | 309 | msgctxt "#30081" 310 | msgid "Scheduler will run again on" 311 | msgstr "" 312 | 313 | msgctxt "#30082" 314 | msgid "Progress Bar" 315 | msgstr "" 316 | 317 | msgctxt "#30083" 318 | msgid "Background Progress Bar" 319 | msgstr "" 320 | 321 | msgctxt "#30084" 322 | msgid "None (Silent)" 323 | msgstr "" 324 | 325 | msgctxt "#30085" 326 | msgid "Version Warning" 327 | msgstr "" 328 | 329 | msgctxt "#30086" 330 | msgid "This version of Kodi is different than the one used to create the archive" 331 | msgstr "" 332 | 333 | msgctxt "#30087" 334 | msgid "Compress Archives" 335 | msgstr "" 336 | 337 | msgctxt "#30088" 338 | msgid "Copying Zip Archive" 339 | msgstr "" 340 | 341 | msgctxt "#30089" 342 | msgid "Write Error Detected" 343 | msgstr "" 344 | 345 | msgctxt "#30090" 346 | msgid "The destination may not be writeable" 347 | msgstr "" 348 | 349 | msgctxt "#30091" 350 | msgid "Zip archive could not be copied" 351 | msgstr "" 352 | 353 | msgctxt "#30092" 354 | msgid "Not all files were copied" 355 | msgstr "" 356 | 357 | msgctxt "#30093" 358 | msgid "Delete Authorization Info" 359 | msgstr "" 360 | 361 | msgctxt "#30094" 362 | msgid "This will delete any OAuth token files" 363 | msgstr "" 364 | 365 | msgctxt "#30095" 366 | msgid "Do you want to do this?" 367 | msgstr "" 368 | 369 | msgctxt "#30096" 370 | msgid "Old Zip Archive could not be deleted" 371 | msgstr "" 372 | 373 | msgctxt "#30097" 374 | msgid "This needs to happen before a backup can run" 375 | msgstr "" 376 | 377 | msgctxt "#30098" 378 | msgid "Google Drive" 379 | msgstr "" 380 | 381 | msgctxt "#30099" 382 | msgid "Open Settings" 383 | msgstr "" 384 | 385 | msgctxt "#30100" 386 | msgid "Extracting Archive" 387 | msgstr "" 388 | 389 | msgctxt "#30101" 390 | msgid "Error extracting the zip archive" 391 | msgstr "" 392 | 393 | msgctxt "#30102" 394 | msgid "Click OK to enter code" 395 | msgstr "" 396 | 397 | msgctxt "#30103" 398 | msgid "Validation Code" 399 | msgstr "" 400 | 401 | msgctxt "#30104" 402 | msgid "Authorize Now" 403 | msgstr "" 404 | 405 | msgctxt "#30105" 406 | msgid "Authorize this remote service in the settings first" 407 | msgstr "" 408 | 409 | msgctxt "#30106" 410 | msgid "is authorized" 411 | msgstr "" 412 | 413 | msgctxt "#30107" 414 | msgid "error authorizing" 415 | msgstr "" 416 | 417 | msgctxt "#30108" 418 | msgid "Visit https://console.developers.google.com/" 419 | msgstr "" 420 | 421 | msgctxt "#30109" 422 | msgid "Run on startup if missed" 423 | msgstr "" 424 | 425 | msgctxt "#30110" 426 | msgid "Set Name" 427 | msgstr "" 428 | 429 | msgctxt "#30111" 430 | msgid "Root folder selection" 431 | msgstr "" 432 | 433 | msgctxt "#30112" 434 | msgid "Browse Folder" 435 | msgstr "" 436 | 437 | msgctxt "#30113" 438 | msgid "Enter Own" 439 | msgstr "" 440 | 441 | msgctxt "#30114" 442 | msgid "starts in Kodi home" 443 | msgstr "" 444 | 445 | msgctxt "#30115" 446 | msgid "enter path to start there" 447 | msgstr "" 448 | 449 | msgctxt "#30116" 450 | msgid "Enter root path" 451 | msgstr "" 452 | 453 | msgctxt "#30117" 454 | msgid "Path Error" 455 | msgstr "" 456 | 457 | msgctxt "#30118" 458 | msgid "Path does not exist" 459 | msgstr "" 460 | 461 | msgctxt "#30119" 462 | msgid "Select root" 463 | msgstr "" 464 | 465 | msgctxt "#30120" 466 | msgid "Add Exclude Folder" 467 | msgstr "" 468 | 469 | msgctxt "#30121" 470 | msgid "Root Folder" 471 | msgstr "" 472 | 473 | msgctxt "#30122" 474 | msgid "Edit" 475 | msgstr "" 476 | 477 | msgctxt "#30123" 478 | msgid "Delete" 479 | msgstr "" 480 | 481 | msgctxt "#30124" 482 | msgid "Choose Action" 483 | msgstr "" 484 | 485 | msgctxt "#30125" 486 | msgid "Advanced Editor" 487 | msgstr "" 488 | 489 | msgctxt "#30126" 490 | msgid "Add Set" 491 | msgstr "" 492 | 493 | msgctxt "#30127" 494 | msgid "Delete Set" 495 | msgstr "" 496 | 497 | msgctxt "#30128" 498 | msgid "Are you sure you want to delete?" 499 | msgstr "" 500 | 501 | msgctxt "#30129" 502 | msgid "Exclude" 503 | msgstr "" 504 | 505 | msgctxt "#30130" 506 | msgid "The root folder cannot be changed" 507 | msgstr "" 508 | 509 | msgctxt "#30131" 510 | msgid "Choose Sets to Restore" 511 | msgstr "" 512 | 513 | msgctxt "#30132" 514 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 515 | msgstr "" 516 | 517 | msgctxt "#30133" 518 | msgid "Game Saves" 519 | msgstr "" 520 | 521 | msgctxt "#30134" 522 | msgid "Include" 523 | msgstr "" 524 | 525 | msgctxt "#30135" 526 | msgid "Add Include Folder" 527 | msgstr "" 528 | 529 | msgctxt "#30136" 530 | msgid "Path must be within root folder" 531 | msgstr "" 532 | 533 | msgctxt "#30137" 534 | msgid "This path is part of a rule already" 535 | msgstr "" 536 | 537 | msgctxt "#30138" 538 | msgid "Set Name exists already" 539 | msgstr "" 540 | 541 | msgctxt "#30139" 542 | msgid "Copy Simple Config" 543 | msgstr "" 544 | 545 | msgctxt "#30140" 546 | msgid "This will copy the default Simple file selection to the Advanced Editor" 547 | msgstr "" 548 | 549 | msgctxt "#30141" 550 | msgid "This will erase any current Advanced Editor settings" 551 | msgstr "" 552 | 553 | msgctxt "#30142" 554 | msgid "Enable Verbose Logging" 555 | msgstr "" 556 | 557 | msgctxt "#30143" 558 | msgid "Exclude a specific folder from this backup set" 559 | msgstr "" 560 | 561 | msgctxt "#30144" 562 | msgid "Include a specific folder to this backup set" 563 | msgstr "" 564 | 565 | msgctxt "#30145" 566 | msgid "Type" 567 | msgstr "" 568 | 569 | msgctxt "#30146" 570 | msgid "Include Sub Folders" 571 | msgstr "" 572 | 573 | msgctxt "#30147" 574 | msgid "Toggle Sub Folders" 575 | msgstr "" 576 | 577 | msgctxt "#30148" 578 | msgid "Ask before restoring Kodi UI settings" 579 | msgstr "" 580 | 581 | msgctxt "#30149" 582 | msgid "Restore Kodi UI Settings" 583 | msgstr "" 584 | 585 | msgctxt "#30150" 586 | msgid "Restore saved Kodi system settings from backup?" 587 | msgstr "" 588 | 589 | msgctxt "#30151" 590 | msgid "Enable Verbose Logging" 591 | msgstr "" 592 | 593 | msgctxt "#30152" 594 | msgid "Set Zip File Location" 595 | msgstr "" 596 | 597 | msgctxt "#30153" 598 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 599 | msgstr "" 600 | 601 | msgctxt "#30154" 602 | msgid "Always prompt if Kodi settings should be restored - no by default" 603 | msgstr "" 604 | 605 | msgctxt "#30155" 606 | msgid "Adds additional information to the log file" 607 | msgstr "" 608 | 609 | msgctxt "#30156" 610 | msgid "Must save key/secret first, then return to settings to authorize" 611 | msgstr "" 612 | 613 | msgctxt "#30157" 614 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 615 | msgstr "" 616 | 617 | msgctxt "#30158" 618 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 619 | msgstr "" 620 | 621 | msgctxt "#30159" 622 | msgid "Backup started with unknown mode" 623 | msgstr "" 624 | 625 | msgctxt "#30160" 626 | msgid "Backup Filename Suffix" 627 | msgstr "" 628 | 629 | msgctxt "#30161" 630 | msgid "Amend a string to the end of each backup folder or ZIP file" 631 | msgstr "" 632 | -------------------------------------------------------------------------------- /resources/language/resource.language.os_os/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2022-03-09 14:05+0000\n" 12 | "Last-Translator: Christian Gade \n" 13 | "Language-Team: Ossetian \n" 14 | "Language: os_os\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 19 | "X-Generator: Weblate 4.11.2\n" 20 | 21 | msgctxt "Addon Summary" 22 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 23 | msgstr "" 24 | 25 | msgctxt "Addon Description" 26 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 27 | msgstr "" 28 | 29 | msgctxt "#30010" 30 | msgid "Backup" 31 | msgstr "" 32 | 33 | msgctxt "#30011" 34 | msgid "General" 35 | msgstr "Сӕйраг" 36 | 37 | msgctxt "#30012" 38 | msgid "File Selection" 39 | msgstr "" 40 | 41 | msgctxt "#30013" 42 | msgid "Scheduling" 43 | msgstr "" 44 | 45 | msgctxt "#30014" 46 | msgid "Simple" 47 | msgstr "" 48 | 49 | msgctxt "#30015" 50 | msgid "Advanced" 51 | msgstr "" 52 | 53 | msgctxt "#30016" 54 | msgid "Backup" 55 | msgstr "" 56 | 57 | msgctxt "#30017" 58 | msgid "Restore" 59 | msgstr "" 60 | 61 | msgctxt "#30018" 62 | msgid "Browse Path" 63 | msgstr "" 64 | 65 | msgctxt "#30019" 66 | msgid "Type Path" 67 | msgstr "" 68 | 69 | msgctxt "#30020" 70 | msgid "Browse Remote Path" 71 | msgstr "" 72 | 73 | msgctxt "#30021" 74 | msgid "Backup Folder Name" 75 | msgstr "" 76 | 77 | msgctxt "#30022" 78 | msgid "Progress Display" 79 | msgstr "" 80 | 81 | msgctxt "#30023" 82 | msgid "Mode" 83 | msgstr "" 84 | 85 | msgctxt "#30024" 86 | msgid "Type Remote Path" 87 | msgstr "" 88 | 89 | msgctxt "#30025" 90 | msgid "Remote Path Type" 91 | msgstr "" 92 | 93 | msgctxt "#30026" 94 | msgid "Backups to keep (0 for all)" 95 | msgstr "" 96 | 97 | msgctxt "#30027" 98 | msgid "Dropbox" 99 | msgstr "" 100 | 101 | msgctxt "#30028" 102 | msgid "Dropbox Key" 103 | msgstr "" 104 | 105 | msgctxt "#30029" 106 | msgid "Dropbox Secret" 107 | msgstr "" 108 | 109 | msgctxt "#30030" 110 | msgid "User Addons" 111 | msgstr "" 112 | 113 | msgctxt "#30031" 114 | msgid "Addon Data" 115 | msgstr "" 116 | 117 | msgctxt "#30032" 118 | msgid "Database" 119 | msgstr "" 120 | 121 | msgctxt "#30033" 122 | msgid "Playlist" 123 | msgstr "" 124 | 125 | msgctxt "#30034" 126 | msgid "Thumbnails/Fanart" 127 | msgstr "" 128 | 129 | msgctxt "#30035" 130 | msgid "Config Files" 131 | msgstr "" 132 | 133 | msgctxt "#30036" 134 | msgid "Disclaimer" 135 | msgstr "" 136 | 137 | msgctxt "#30037" 138 | msgid "Canceling this menu will close and save changes" 139 | msgstr "" 140 | 141 | msgctxt "#30038" 142 | msgid "Advanced Settings Detected" 143 | msgstr "" 144 | 145 | msgctxt "#30039" 146 | msgid "The advancedsettings file should be restored first" 147 | msgstr "" 148 | 149 | msgctxt "#30040" 150 | msgid "Select Yes to restore this file and restart Kodi" 151 | msgstr "" 152 | 153 | msgctxt "#30041" 154 | msgid "Select No to continue" 155 | msgstr "" 156 | 157 | msgctxt "#30042" 158 | msgid "Resume Restore" 159 | msgstr "" 160 | 161 | msgctxt "#30043" 162 | msgid "The Backup addon has detected an unfinished restore" 163 | msgstr "" 164 | 165 | msgctxt "#30044" 166 | msgid "Would you like to continue?" 167 | msgstr "" 168 | 169 | msgctxt "#30045" 170 | msgid "Error: Remote or zip file path doesn't exist" 171 | msgstr "" 172 | 173 | msgctxt "#30046" 174 | msgid "Starting" 175 | msgstr "" 176 | 177 | msgctxt "#30047" 178 | msgid "Local Dir" 179 | msgstr "" 180 | 181 | msgctxt "#30048" 182 | msgid "Remote Dir" 183 | msgstr "" 184 | 185 | msgctxt "#30049" 186 | msgid "Gathering file list" 187 | msgstr "" 188 | 189 | msgctxt "#30050" 190 | msgid "Remote Path exists - may have old files in it!" 191 | msgstr "" 192 | 193 | msgctxt "#30051" 194 | msgid "Creating Files List" 195 | msgstr "" 196 | 197 | msgctxt "#30052" 198 | msgid "Writing file" 199 | msgstr "" 200 | 201 | msgctxt "#30053" 202 | msgid "Starting scheduled backup" 203 | msgstr "" 204 | 205 | msgctxt "#30054" 206 | msgid "Removing backup" 207 | msgstr "" 208 | 209 | msgctxt "#30056" 210 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 211 | msgstr "" 212 | 213 | msgctxt "#30057" 214 | msgid "Click OK AFTER completion" 215 | msgstr "" 216 | 217 | msgctxt "#30058" 218 | msgid "Developer Code Needed" 219 | msgstr "" 220 | 221 | msgctxt "#30059" 222 | msgid "Visit https://www.dropbox.com/developers" 223 | msgstr "" 224 | 225 | msgctxt "#30060" 226 | msgid "Enable Scheduler" 227 | msgstr "" 228 | 229 | msgctxt "#30061" 230 | msgid "Schedule" 231 | msgstr "" 232 | 233 | msgctxt "#30062" 234 | msgid "Hour of Day" 235 | msgstr "" 236 | 237 | msgctxt "#30063" 238 | msgid "Day of Week" 239 | msgstr "" 240 | 241 | msgctxt "#30064" 242 | msgid "Cron Schedule" 243 | msgstr "" 244 | 245 | msgctxt "#30065" 246 | msgid "Sunday" 247 | msgstr "" 248 | 249 | msgctxt "#30066" 250 | msgid "Monday" 251 | msgstr "" 252 | 253 | msgctxt "#30067" 254 | msgid "Tuesday" 255 | msgstr "" 256 | 257 | msgctxt "#30068" 258 | msgid "Wednesday" 259 | msgstr "" 260 | 261 | msgctxt "#30069" 262 | msgid "Thursday" 263 | msgstr "" 264 | 265 | msgctxt "#30070" 266 | msgid "Friday" 267 | msgstr "" 268 | 269 | msgctxt "#30071" 270 | msgid "Saturday" 271 | msgstr "" 272 | 273 | msgctxt "#30072" 274 | msgid "Every Day" 275 | msgstr "" 276 | 277 | msgctxt "#30073" 278 | msgid "Every Week" 279 | msgstr "" 280 | 281 | msgctxt "#30074" 282 | msgid "First Day of Month" 283 | msgstr "" 284 | 285 | msgctxt "#30075" 286 | msgid "Custom Schedule" 287 | msgstr "" 288 | 289 | msgctxt "#30076" 290 | msgid "Shutdown After Backup" 291 | msgstr "" 292 | 293 | msgctxt "#30077" 294 | msgid "Restart Kodi" 295 | msgstr "" 296 | 297 | msgctxt "#30078" 298 | msgid "You should restart Kodi to continue" 299 | msgstr "" 300 | 301 | msgctxt "#30079" 302 | msgid "Just Today" 303 | msgstr "" 304 | 305 | msgctxt "#30080" 306 | msgid "Profiles" 307 | msgstr "" 308 | 309 | msgctxt "#30081" 310 | msgid "Scheduler will run again on" 311 | msgstr "" 312 | 313 | msgctxt "#30082" 314 | msgid "Progress Bar" 315 | msgstr "" 316 | 317 | msgctxt "#30083" 318 | msgid "Background Progress Bar" 319 | msgstr "" 320 | 321 | msgctxt "#30084" 322 | msgid "None (Silent)" 323 | msgstr "" 324 | 325 | msgctxt "#30085" 326 | msgid "Version Warning" 327 | msgstr "" 328 | 329 | msgctxt "#30086" 330 | msgid "This version of Kodi is different than the one used to create the archive" 331 | msgstr "" 332 | 333 | msgctxt "#30087" 334 | msgid "Compress Archives" 335 | msgstr "" 336 | 337 | msgctxt "#30088" 338 | msgid "Copying Zip Archive" 339 | msgstr "" 340 | 341 | msgctxt "#30089" 342 | msgid "Write Error Detected" 343 | msgstr "" 344 | 345 | msgctxt "#30090" 346 | msgid "The destination may not be writeable" 347 | msgstr "" 348 | 349 | msgctxt "#30091" 350 | msgid "Zip archive could not be copied" 351 | msgstr "" 352 | 353 | msgctxt "#30092" 354 | msgid "Not all files were copied" 355 | msgstr "" 356 | 357 | msgctxt "#30093" 358 | msgid "Delete Authorization Info" 359 | msgstr "" 360 | 361 | msgctxt "#30094" 362 | msgid "This will delete any OAuth token files" 363 | msgstr "" 364 | 365 | msgctxt "#30095" 366 | msgid "Do you want to do this?" 367 | msgstr "" 368 | 369 | msgctxt "#30096" 370 | msgid "Old Zip Archive could not be deleted" 371 | msgstr "" 372 | 373 | msgctxt "#30097" 374 | msgid "This needs to happen before a backup can run" 375 | msgstr "" 376 | 377 | msgctxt "#30098" 378 | msgid "Google Drive" 379 | msgstr "" 380 | 381 | msgctxt "#30099" 382 | msgid "Open Settings" 383 | msgstr "" 384 | 385 | msgctxt "#30100" 386 | msgid "Extracting Archive" 387 | msgstr "" 388 | 389 | msgctxt "#30101" 390 | msgid "Error extracting the zip archive" 391 | msgstr "" 392 | 393 | msgctxt "#30102" 394 | msgid "Click OK to enter code" 395 | msgstr "" 396 | 397 | msgctxt "#30103" 398 | msgid "Validation Code" 399 | msgstr "" 400 | 401 | msgctxt "#30104" 402 | msgid "Authorize Now" 403 | msgstr "" 404 | 405 | msgctxt "#30105" 406 | msgid "Authorize this remote service in the settings first" 407 | msgstr "" 408 | 409 | msgctxt "#30106" 410 | msgid "is authorized" 411 | msgstr "" 412 | 413 | msgctxt "#30107" 414 | msgid "error authorizing" 415 | msgstr "" 416 | 417 | msgctxt "#30108" 418 | msgid "Visit https://console.developers.google.com/" 419 | msgstr "" 420 | 421 | msgctxt "#30109" 422 | msgid "Run on startup if missed" 423 | msgstr "" 424 | 425 | msgctxt "#30110" 426 | msgid "Set Name" 427 | msgstr "" 428 | 429 | msgctxt "#30111" 430 | msgid "Root folder selection" 431 | msgstr "" 432 | 433 | msgctxt "#30112" 434 | msgid "Browse Folder" 435 | msgstr "" 436 | 437 | msgctxt "#30113" 438 | msgid "Enter Own" 439 | msgstr "" 440 | 441 | msgctxt "#30114" 442 | msgid "starts in Kodi home" 443 | msgstr "" 444 | 445 | msgctxt "#30115" 446 | msgid "enter path to start there" 447 | msgstr "" 448 | 449 | msgctxt "#30116" 450 | msgid "Enter root path" 451 | msgstr "" 452 | 453 | msgctxt "#30117" 454 | msgid "Path Error" 455 | msgstr "" 456 | 457 | msgctxt "#30118" 458 | msgid "Path does not exist" 459 | msgstr "" 460 | 461 | msgctxt "#30119" 462 | msgid "Select root" 463 | msgstr "" 464 | 465 | msgctxt "#30120" 466 | msgid "Add Exclude Folder" 467 | msgstr "" 468 | 469 | msgctxt "#30121" 470 | msgid "Root Folder" 471 | msgstr "" 472 | 473 | msgctxt "#30122" 474 | msgid "Edit" 475 | msgstr "" 476 | 477 | msgctxt "#30123" 478 | msgid "Delete" 479 | msgstr "" 480 | 481 | msgctxt "#30124" 482 | msgid "Choose Action" 483 | msgstr "" 484 | 485 | msgctxt "#30125" 486 | msgid "Advanced Editor" 487 | msgstr "" 488 | 489 | msgctxt "#30126" 490 | msgid "Add Set" 491 | msgstr "" 492 | 493 | msgctxt "#30127" 494 | msgid "Delete Set" 495 | msgstr "" 496 | 497 | msgctxt "#30128" 498 | msgid "Are you sure you want to delete?" 499 | msgstr "" 500 | 501 | msgctxt "#30129" 502 | msgid "Exclude" 503 | msgstr "" 504 | 505 | msgctxt "#30130" 506 | msgid "The root folder cannot be changed" 507 | msgstr "" 508 | 509 | msgctxt "#30131" 510 | msgid "Choose Sets to Restore" 511 | msgstr "" 512 | 513 | msgctxt "#30132" 514 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 515 | msgstr "" 516 | 517 | msgctxt "#30133" 518 | msgid "Game Saves" 519 | msgstr "" 520 | 521 | msgctxt "#30134" 522 | msgid "Include" 523 | msgstr "" 524 | 525 | msgctxt "#30135" 526 | msgid "Add Include Folder" 527 | msgstr "" 528 | 529 | msgctxt "#30136" 530 | msgid "Path must be within root folder" 531 | msgstr "" 532 | 533 | msgctxt "#30137" 534 | msgid "This path is part of a rule already" 535 | msgstr "" 536 | 537 | msgctxt "#30138" 538 | msgid "Set Name exists already" 539 | msgstr "" 540 | 541 | msgctxt "#30139" 542 | msgid "Copy Simple Config" 543 | msgstr "" 544 | 545 | msgctxt "#30140" 546 | msgid "This will copy the default Simple file selection to the Advanced Editor" 547 | msgstr "" 548 | 549 | msgctxt "#30141" 550 | msgid "This will erase any current Advanced Editor settings" 551 | msgstr "" 552 | 553 | msgctxt "#30142" 554 | msgid "Enable Verbose Logging" 555 | msgstr "" 556 | 557 | msgctxt "#30143" 558 | msgid "Exclude a specific folder from this backup set" 559 | msgstr "" 560 | 561 | msgctxt "#30144" 562 | msgid "Include a specific folder to this backup set" 563 | msgstr "" 564 | 565 | msgctxt "#30145" 566 | msgid "Type" 567 | msgstr "" 568 | 569 | msgctxt "#30146" 570 | msgid "Include Sub Folders" 571 | msgstr "" 572 | 573 | msgctxt "#30147" 574 | msgid "Toggle Sub Folders" 575 | msgstr "" 576 | 577 | msgctxt "#30148" 578 | msgid "Ask before restoring Kodi UI settings" 579 | msgstr "" 580 | 581 | msgctxt "#30149" 582 | msgid "Restore Kodi UI Settings" 583 | msgstr "" 584 | 585 | msgctxt "#30150" 586 | msgid "Restore saved Kodi system settings from backup?" 587 | msgstr "" 588 | 589 | msgctxt "#30151" 590 | msgid "Enable Verbose Logging" 591 | msgstr "" 592 | 593 | msgctxt "#30152" 594 | msgid "Set Zip File Location" 595 | msgstr "" 596 | 597 | msgctxt "#30153" 598 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 599 | msgstr "" 600 | 601 | msgctxt "#30154" 602 | msgid "Always prompt if Kodi settings should be restored - no by default" 603 | msgstr "" 604 | 605 | msgctxt "#30155" 606 | msgid "Adds additional information to the log file" 607 | msgstr "" 608 | 609 | msgctxt "#30156" 610 | msgid "Must save key/secret first, then return to settings to authorize" 611 | msgstr "" 612 | 613 | msgctxt "#30157" 614 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 615 | msgstr "" 616 | 617 | msgctxt "#30158" 618 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 619 | msgstr "" 620 | 621 | msgctxt "#30159" 622 | msgid "Backup started with unknown mode" 623 | msgstr "" 624 | 625 | msgctxt "#30160" 626 | msgid "Backup Filename Suffix" 627 | msgstr "" 628 | 629 | msgctxt "#30161" 630 | msgid "Amend a string to the end of each backup folder or ZIP file" 631 | msgstr "" 632 | -------------------------------------------------------------------------------- /resources/language/resource.language.si_lk/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2022-03-09 14:05+0000\n" 12 | "Last-Translator: Christian Gade \n" 13 | "Language-Team: Sinhala (Sri Lanka) \n" 14 | "Language: si_lk\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=n > 1;\n" 19 | "X-Generator: Weblate 4.11.2\n" 20 | 21 | msgctxt "Addon Summary" 22 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 23 | msgstr "" 24 | 25 | msgctxt "Addon Description" 26 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 27 | msgstr "" 28 | 29 | msgctxt "#30010" 30 | msgid "Backup" 31 | msgstr "" 32 | 33 | msgctxt "#30011" 34 | msgid "General" 35 | msgstr "සාමාන්‍ය" 36 | 37 | msgctxt "#30012" 38 | msgid "File Selection" 39 | msgstr "" 40 | 41 | msgctxt "#30013" 42 | msgid "Scheduling" 43 | msgstr "" 44 | 45 | msgctxt "#30014" 46 | msgid "Simple" 47 | msgstr "" 48 | 49 | msgctxt "#30015" 50 | msgid "Advanced" 51 | msgstr "" 52 | 53 | msgctxt "#30016" 54 | msgid "Backup" 55 | msgstr "" 56 | 57 | msgctxt "#30017" 58 | msgid "Restore" 59 | msgstr "" 60 | 61 | msgctxt "#30018" 62 | msgid "Browse Path" 63 | msgstr "" 64 | 65 | msgctxt "#30019" 66 | msgid "Type Path" 67 | msgstr "" 68 | 69 | msgctxt "#30020" 70 | msgid "Browse Remote Path" 71 | msgstr "" 72 | 73 | msgctxt "#30021" 74 | msgid "Backup Folder Name" 75 | msgstr "" 76 | 77 | msgctxt "#30022" 78 | msgid "Progress Display" 79 | msgstr "" 80 | 81 | msgctxt "#30023" 82 | msgid "Mode" 83 | msgstr "" 84 | 85 | msgctxt "#30024" 86 | msgid "Type Remote Path" 87 | msgstr "" 88 | 89 | msgctxt "#30025" 90 | msgid "Remote Path Type" 91 | msgstr "" 92 | 93 | msgctxt "#30026" 94 | msgid "Backups to keep (0 for all)" 95 | msgstr "" 96 | 97 | msgctxt "#30027" 98 | msgid "Dropbox" 99 | msgstr "" 100 | 101 | msgctxt "#30028" 102 | msgid "Dropbox Key" 103 | msgstr "" 104 | 105 | msgctxt "#30029" 106 | msgid "Dropbox Secret" 107 | msgstr "" 108 | 109 | msgctxt "#30030" 110 | msgid "User Addons" 111 | msgstr "" 112 | 113 | msgctxt "#30031" 114 | msgid "Addon Data" 115 | msgstr "" 116 | 117 | msgctxt "#30032" 118 | msgid "Database" 119 | msgstr "" 120 | 121 | msgctxt "#30033" 122 | msgid "Playlist" 123 | msgstr "" 124 | 125 | msgctxt "#30034" 126 | msgid "Thumbnails/Fanart" 127 | msgstr "" 128 | 129 | msgctxt "#30035" 130 | msgid "Config Files" 131 | msgstr "" 132 | 133 | msgctxt "#30036" 134 | msgid "Disclaimer" 135 | msgstr "" 136 | 137 | msgctxt "#30037" 138 | msgid "Canceling this menu will close and save changes" 139 | msgstr "" 140 | 141 | msgctxt "#30038" 142 | msgid "Advanced Settings Detected" 143 | msgstr "" 144 | 145 | msgctxt "#30039" 146 | msgid "The advancedsettings file should be restored first" 147 | msgstr "" 148 | 149 | msgctxt "#30040" 150 | msgid "Select Yes to restore this file and restart Kodi" 151 | msgstr "" 152 | 153 | msgctxt "#30041" 154 | msgid "Select No to continue" 155 | msgstr "" 156 | 157 | msgctxt "#30042" 158 | msgid "Resume Restore" 159 | msgstr "" 160 | 161 | msgctxt "#30043" 162 | msgid "The Backup addon has detected an unfinished restore" 163 | msgstr "" 164 | 165 | msgctxt "#30044" 166 | msgid "Would you like to continue?" 167 | msgstr "" 168 | 169 | msgctxt "#30045" 170 | msgid "Error: Remote or zip file path doesn't exist" 171 | msgstr "" 172 | 173 | msgctxt "#30046" 174 | msgid "Starting" 175 | msgstr "" 176 | 177 | msgctxt "#30047" 178 | msgid "Local Dir" 179 | msgstr "" 180 | 181 | msgctxt "#30048" 182 | msgid "Remote Dir" 183 | msgstr "" 184 | 185 | msgctxt "#30049" 186 | msgid "Gathering file list" 187 | msgstr "" 188 | 189 | msgctxt "#30050" 190 | msgid "Remote Path exists - may have old files in it!" 191 | msgstr "" 192 | 193 | msgctxt "#30051" 194 | msgid "Creating Files List" 195 | msgstr "" 196 | 197 | msgctxt "#30052" 198 | msgid "Writing file" 199 | msgstr "" 200 | 201 | msgctxt "#30053" 202 | msgid "Starting scheduled backup" 203 | msgstr "" 204 | 205 | msgctxt "#30054" 206 | msgid "Removing backup" 207 | msgstr "" 208 | 209 | msgctxt "#30056" 210 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 211 | msgstr "" 212 | 213 | msgctxt "#30057" 214 | msgid "Click OK AFTER completion" 215 | msgstr "" 216 | 217 | msgctxt "#30058" 218 | msgid "Developer Code Needed" 219 | msgstr "" 220 | 221 | msgctxt "#30059" 222 | msgid "Visit https://www.dropbox.com/developers" 223 | msgstr "" 224 | 225 | msgctxt "#30060" 226 | msgid "Enable Scheduler" 227 | msgstr "" 228 | 229 | msgctxt "#30061" 230 | msgid "Schedule" 231 | msgstr "" 232 | 233 | msgctxt "#30062" 234 | msgid "Hour of Day" 235 | msgstr "" 236 | 237 | msgctxt "#30063" 238 | msgid "Day of Week" 239 | msgstr "" 240 | 241 | msgctxt "#30064" 242 | msgid "Cron Schedule" 243 | msgstr "" 244 | 245 | msgctxt "#30065" 246 | msgid "Sunday" 247 | msgstr "" 248 | 249 | msgctxt "#30066" 250 | msgid "Monday" 251 | msgstr "" 252 | 253 | msgctxt "#30067" 254 | msgid "Tuesday" 255 | msgstr "" 256 | 257 | msgctxt "#30068" 258 | msgid "Wednesday" 259 | msgstr "" 260 | 261 | msgctxt "#30069" 262 | msgid "Thursday" 263 | msgstr "" 264 | 265 | msgctxt "#30070" 266 | msgid "Friday" 267 | msgstr "" 268 | 269 | msgctxt "#30071" 270 | msgid "Saturday" 271 | msgstr "" 272 | 273 | msgctxt "#30072" 274 | msgid "Every Day" 275 | msgstr "" 276 | 277 | msgctxt "#30073" 278 | msgid "Every Week" 279 | msgstr "" 280 | 281 | msgctxt "#30074" 282 | msgid "First Day of Month" 283 | msgstr "" 284 | 285 | msgctxt "#30075" 286 | msgid "Custom Schedule" 287 | msgstr "" 288 | 289 | msgctxt "#30076" 290 | msgid "Shutdown After Backup" 291 | msgstr "" 292 | 293 | msgctxt "#30077" 294 | msgid "Restart Kodi" 295 | msgstr "" 296 | 297 | msgctxt "#30078" 298 | msgid "You should restart Kodi to continue" 299 | msgstr "" 300 | 301 | msgctxt "#30079" 302 | msgid "Just Today" 303 | msgstr "" 304 | 305 | msgctxt "#30080" 306 | msgid "Profiles" 307 | msgstr "" 308 | 309 | msgctxt "#30081" 310 | msgid "Scheduler will run again on" 311 | msgstr "" 312 | 313 | msgctxt "#30082" 314 | msgid "Progress Bar" 315 | msgstr "" 316 | 317 | msgctxt "#30083" 318 | msgid "Background Progress Bar" 319 | msgstr "" 320 | 321 | msgctxt "#30084" 322 | msgid "None (Silent)" 323 | msgstr "" 324 | 325 | msgctxt "#30085" 326 | msgid "Version Warning" 327 | msgstr "" 328 | 329 | msgctxt "#30086" 330 | msgid "This version of Kodi is different than the one used to create the archive" 331 | msgstr "" 332 | 333 | msgctxt "#30087" 334 | msgid "Compress Archives" 335 | msgstr "" 336 | 337 | msgctxt "#30088" 338 | msgid "Copying Zip Archive" 339 | msgstr "" 340 | 341 | msgctxt "#30089" 342 | msgid "Write Error Detected" 343 | msgstr "" 344 | 345 | msgctxt "#30090" 346 | msgid "The destination may not be writeable" 347 | msgstr "" 348 | 349 | msgctxt "#30091" 350 | msgid "Zip archive could not be copied" 351 | msgstr "" 352 | 353 | msgctxt "#30092" 354 | msgid "Not all files were copied" 355 | msgstr "" 356 | 357 | msgctxt "#30093" 358 | msgid "Delete Authorization Info" 359 | msgstr "" 360 | 361 | msgctxt "#30094" 362 | msgid "This will delete any OAuth token files" 363 | msgstr "" 364 | 365 | msgctxt "#30095" 366 | msgid "Do you want to do this?" 367 | msgstr "" 368 | 369 | msgctxt "#30096" 370 | msgid "Old Zip Archive could not be deleted" 371 | msgstr "" 372 | 373 | msgctxt "#30097" 374 | msgid "This needs to happen before a backup can run" 375 | msgstr "" 376 | 377 | msgctxt "#30098" 378 | msgid "Google Drive" 379 | msgstr "" 380 | 381 | msgctxt "#30099" 382 | msgid "Open Settings" 383 | msgstr "" 384 | 385 | msgctxt "#30100" 386 | msgid "Extracting Archive" 387 | msgstr "" 388 | 389 | msgctxt "#30101" 390 | msgid "Error extracting the zip archive" 391 | msgstr "" 392 | 393 | msgctxt "#30102" 394 | msgid "Click OK to enter code" 395 | msgstr "" 396 | 397 | msgctxt "#30103" 398 | msgid "Validation Code" 399 | msgstr "" 400 | 401 | msgctxt "#30104" 402 | msgid "Authorize Now" 403 | msgstr "" 404 | 405 | msgctxt "#30105" 406 | msgid "Authorize this remote service in the settings first" 407 | msgstr "" 408 | 409 | msgctxt "#30106" 410 | msgid "is authorized" 411 | msgstr "" 412 | 413 | msgctxt "#30107" 414 | msgid "error authorizing" 415 | msgstr "" 416 | 417 | msgctxt "#30108" 418 | msgid "Visit https://console.developers.google.com/" 419 | msgstr "" 420 | 421 | msgctxt "#30109" 422 | msgid "Run on startup if missed" 423 | msgstr "" 424 | 425 | msgctxt "#30110" 426 | msgid "Set Name" 427 | msgstr "" 428 | 429 | msgctxt "#30111" 430 | msgid "Root folder selection" 431 | msgstr "" 432 | 433 | msgctxt "#30112" 434 | msgid "Browse Folder" 435 | msgstr "" 436 | 437 | msgctxt "#30113" 438 | msgid "Enter Own" 439 | msgstr "" 440 | 441 | msgctxt "#30114" 442 | msgid "starts in Kodi home" 443 | msgstr "" 444 | 445 | msgctxt "#30115" 446 | msgid "enter path to start there" 447 | msgstr "" 448 | 449 | msgctxt "#30116" 450 | msgid "Enter root path" 451 | msgstr "" 452 | 453 | msgctxt "#30117" 454 | msgid "Path Error" 455 | msgstr "" 456 | 457 | msgctxt "#30118" 458 | msgid "Path does not exist" 459 | msgstr "" 460 | 461 | msgctxt "#30119" 462 | msgid "Select root" 463 | msgstr "" 464 | 465 | msgctxt "#30120" 466 | msgid "Add Exclude Folder" 467 | msgstr "" 468 | 469 | msgctxt "#30121" 470 | msgid "Root Folder" 471 | msgstr "" 472 | 473 | msgctxt "#30122" 474 | msgid "Edit" 475 | msgstr "" 476 | 477 | msgctxt "#30123" 478 | msgid "Delete" 479 | msgstr "" 480 | 481 | msgctxt "#30124" 482 | msgid "Choose Action" 483 | msgstr "" 484 | 485 | msgctxt "#30125" 486 | msgid "Advanced Editor" 487 | msgstr "" 488 | 489 | msgctxt "#30126" 490 | msgid "Add Set" 491 | msgstr "" 492 | 493 | msgctxt "#30127" 494 | msgid "Delete Set" 495 | msgstr "" 496 | 497 | msgctxt "#30128" 498 | msgid "Are you sure you want to delete?" 499 | msgstr "" 500 | 501 | msgctxt "#30129" 502 | msgid "Exclude" 503 | msgstr "" 504 | 505 | msgctxt "#30130" 506 | msgid "The root folder cannot be changed" 507 | msgstr "" 508 | 509 | msgctxt "#30131" 510 | msgid "Choose Sets to Restore" 511 | msgstr "" 512 | 513 | msgctxt "#30132" 514 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 515 | msgstr "" 516 | 517 | msgctxt "#30133" 518 | msgid "Game Saves" 519 | msgstr "" 520 | 521 | msgctxt "#30134" 522 | msgid "Include" 523 | msgstr "" 524 | 525 | msgctxt "#30135" 526 | msgid "Add Include Folder" 527 | msgstr "" 528 | 529 | msgctxt "#30136" 530 | msgid "Path must be within root folder" 531 | msgstr "" 532 | 533 | msgctxt "#30137" 534 | msgid "This path is part of a rule already" 535 | msgstr "" 536 | 537 | msgctxt "#30138" 538 | msgid "Set Name exists already" 539 | msgstr "" 540 | 541 | msgctxt "#30139" 542 | msgid "Copy Simple Config" 543 | msgstr "" 544 | 545 | msgctxt "#30140" 546 | msgid "This will copy the default Simple file selection to the Advanced Editor" 547 | msgstr "" 548 | 549 | msgctxt "#30141" 550 | msgid "This will erase any current Advanced Editor settings" 551 | msgstr "" 552 | 553 | msgctxt "#30142" 554 | msgid "Enable Verbose Logging" 555 | msgstr "" 556 | 557 | msgctxt "#30143" 558 | msgid "Exclude a specific folder from this backup set" 559 | msgstr "" 560 | 561 | msgctxt "#30144" 562 | msgid "Include a specific folder to this backup set" 563 | msgstr "" 564 | 565 | msgctxt "#30145" 566 | msgid "Type" 567 | msgstr "" 568 | 569 | msgctxt "#30146" 570 | msgid "Include Sub Folders" 571 | msgstr "" 572 | 573 | msgctxt "#30147" 574 | msgid "Toggle Sub Folders" 575 | msgstr "" 576 | 577 | msgctxt "#30148" 578 | msgid "Ask before restoring Kodi UI settings" 579 | msgstr "" 580 | 581 | msgctxt "#30149" 582 | msgid "Restore Kodi UI Settings" 583 | msgstr "" 584 | 585 | msgctxt "#30150" 586 | msgid "Restore saved Kodi system settings from backup?" 587 | msgstr "" 588 | 589 | msgctxt "#30151" 590 | msgid "Enable Verbose Logging" 591 | msgstr "" 592 | 593 | msgctxt "#30152" 594 | msgid "Set Zip File Location" 595 | msgstr "" 596 | 597 | msgctxt "#30153" 598 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 599 | msgstr "" 600 | 601 | msgctxt "#30154" 602 | msgid "Always prompt if Kodi settings should be restored - no by default" 603 | msgstr "" 604 | 605 | msgctxt "#30155" 606 | msgid "Adds additional information to the log file" 607 | msgstr "" 608 | 609 | msgctxt "#30156" 610 | msgid "Must save key/secret first, then return to settings to authorize" 611 | msgstr "" 612 | 613 | msgctxt "#30157" 614 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 615 | msgstr "" 616 | 617 | msgctxt "#30158" 618 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 619 | msgstr "" 620 | 621 | msgctxt "#30159" 622 | msgid "Backup started with unknown mode" 623 | msgstr "" 624 | 625 | msgctxt "#30160" 626 | msgid "Backup Filename Suffix" 627 | msgstr "" 628 | 629 | msgctxt "#30161" 630 | msgid "Amend a string to the end of each backup folder or ZIP file" 631 | msgstr "" 632 | -------------------------------------------------------------------------------- /resources/language/resource.language.te_in/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2022-03-09 14:05+0000\n" 12 | "Last-Translator: Christian Gade \n" 13 | "Language-Team: Telugu (India) \n" 14 | "Language: te_in\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 19 | "X-Generator: Weblate 4.11.2\n" 20 | 21 | msgctxt "Addon Summary" 22 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 23 | msgstr "" 24 | 25 | msgctxt "Addon Description" 26 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 27 | msgstr "" 28 | 29 | msgctxt "#30010" 30 | msgid "Backup" 31 | msgstr "" 32 | 33 | msgctxt "#30011" 34 | msgid "General" 35 | msgstr "సాధారణం" 36 | 37 | msgctxt "#30012" 38 | msgid "File Selection" 39 | msgstr "" 40 | 41 | msgctxt "#30013" 42 | msgid "Scheduling" 43 | msgstr "" 44 | 45 | msgctxt "#30014" 46 | msgid "Simple" 47 | msgstr "" 48 | 49 | msgctxt "#30015" 50 | msgid "Advanced" 51 | msgstr "" 52 | 53 | msgctxt "#30016" 54 | msgid "Backup" 55 | msgstr "" 56 | 57 | msgctxt "#30017" 58 | msgid "Restore" 59 | msgstr "" 60 | 61 | msgctxt "#30018" 62 | msgid "Browse Path" 63 | msgstr "" 64 | 65 | msgctxt "#30019" 66 | msgid "Type Path" 67 | msgstr "" 68 | 69 | msgctxt "#30020" 70 | msgid "Browse Remote Path" 71 | msgstr "" 72 | 73 | msgctxt "#30021" 74 | msgid "Backup Folder Name" 75 | msgstr "" 76 | 77 | msgctxt "#30022" 78 | msgid "Progress Display" 79 | msgstr "" 80 | 81 | msgctxt "#30023" 82 | msgid "Mode" 83 | msgstr "" 84 | 85 | msgctxt "#30024" 86 | msgid "Type Remote Path" 87 | msgstr "" 88 | 89 | msgctxt "#30025" 90 | msgid "Remote Path Type" 91 | msgstr "" 92 | 93 | msgctxt "#30026" 94 | msgid "Backups to keep (0 for all)" 95 | msgstr "" 96 | 97 | msgctxt "#30027" 98 | msgid "Dropbox" 99 | msgstr "" 100 | 101 | msgctxt "#30028" 102 | msgid "Dropbox Key" 103 | msgstr "" 104 | 105 | msgctxt "#30029" 106 | msgid "Dropbox Secret" 107 | msgstr "" 108 | 109 | msgctxt "#30030" 110 | msgid "User Addons" 111 | msgstr "" 112 | 113 | msgctxt "#30031" 114 | msgid "Addon Data" 115 | msgstr "" 116 | 117 | msgctxt "#30032" 118 | msgid "Database" 119 | msgstr "" 120 | 121 | msgctxt "#30033" 122 | msgid "Playlist" 123 | msgstr "" 124 | 125 | msgctxt "#30034" 126 | msgid "Thumbnails/Fanart" 127 | msgstr "" 128 | 129 | msgctxt "#30035" 130 | msgid "Config Files" 131 | msgstr "" 132 | 133 | msgctxt "#30036" 134 | msgid "Disclaimer" 135 | msgstr "" 136 | 137 | msgctxt "#30037" 138 | msgid "Canceling this menu will close and save changes" 139 | msgstr "" 140 | 141 | msgctxt "#30038" 142 | msgid "Advanced Settings Detected" 143 | msgstr "" 144 | 145 | msgctxt "#30039" 146 | msgid "The advancedsettings file should be restored first" 147 | msgstr "" 148 | 149 | msgctxt "#30040" 150 | msgid "Select Yes to restore this file and restart Kodi" 151 | msgstr "" 152 | 153 | msgctxt "#30041" 154 | msgid "Select No to continue" 155 | msgstr "" 156 | 157 | msgctxt "#30042" 158 | msgid "Resume Restore" 159 | msgstr "" 160 | 161 | msgctxt "#30043" 162 | msgid "The Backup addon has detected an unfinished restore" 163 | msgstr "" 164 | 165 | msgctxt "#30044" 166 | msgid "Would you like to continue?" 167 | msgstr "" 168 | 169 | msgctxt "#30045" 170 | msgid "Error: Remote or zip file path doesn't exist" 171 | msgstr "" 172 | 173 | msgctxt "#30046" 174 | msgid "Starting" 175 | msgstr "" 176 | 177 | msgctxt "#30047" 178 | msgid "Local Dir" 179 | msgstr "" 180 | 181 | msgctxt "#30048" 182 | msgid "Remote Dir" 183 | msgstr "" 184 | 185 | msgctxt "#30049" 186 | msgid "Gathering file list" 187 | msgstr "" 188 | 189 | msgctxt "#30050" 190 | msgid "Remote Path exists - may have old files in it!" 191 | msgstr "" 192 | 193 | msgctxt "#30051" 194 | msgid "Creating Files List" 195 | msgstr "" 196 | 197 | msgctxt "#30052" 198 | msgid "Writing file" 199 | msgstr "" 200 | 201 | msgctxt "#30053" 202 | msgid "Starting scheduled backup" 203 | msgstr "" 204 | 205 | msgctxt "#30054" 206 | msgid "Removing backup" 207 | msgstr "" 208 | 209 | msgctxt "#30056" 210 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 211 | msgstr "" 212 | 213 | msgctxt "#30057" 214 | msgid "Click OK AFTER completion" 215 | msgstr "" 216 | 217 | msgctxt "#30058" 218 | msgid "Developer Code Needed" 219 | msgstr "" 220 | 221 | msgctxt "#30059" 222 | msgid "Visit https://www.dropbox.com/developers" 223 | msgstr "" 224 | 225 | msgctxt "#30060" 226 | msgid "Enable Scheduler" 227 | msgstr "" 228 | 229 | msgctxt "#30061" 230 | msgid "Schedule" 231 | msgstr "" 232 | 233 | msgctxt "#30062" 234 | msgid "Hour of Day" 235 | msgstr "" 236 | 237 | msgctxt "#30063" 238 | msgid "Day of Week" 239 | msgstr "" 240 | 241 | msgctxt "#30064" 242 | msgid "Cron Schedule" 243 | msgstr "" 244 | 245 | msgctxt "#30065" 246 | msgid "Sunday" 247 | msgstr "" 248 | 249 | msgctxt "#30066" 250 | msgid "Monday" 251 | msgstr "" 252 | 253 | msgctxt "#30067" 254 | msgid "Tuesday" 255 | msgstr "" 256 | 257 | msgctxt "#30068" 258 | msgid "Wednesday" 259 | msgstr "" 260 | 261 | msgctxt "#30069" 262 | msgid "Thursday" 263 | msgstr "" 264 | 265 | msgctxt "#30070" 266 | msgid "Friday" 267 | msgstr "" 268 | 269 | msgctxt "#30071" 270 | msgid "Saturday" 271 | msgstr "" 272 | 273 | msgctxt "#30072" 274 | msgid "Every Day" 275 | msgstr "" 276 | 277 | msgctxt "#30073" 278 | msgid "Every Week" 279 | msgstr "" 280 | 281 | msgctxt "#30074" 282 | msgid "First Day of Month" 283 | msgstr "" 284 | 285 | msgctxt "#30075" 286 | msgid "Custom Schedule" 287 | msgstr "" 288 | 289 | msgctxt "#30076" 290 | msgid "Shutdown After Backup" 291 | msgstr "" 292 | 293 | msgctxt "#30077" 294 | msgid "Restart Kodi" 295 | msgstr "" 296 | 297 | msgctxt "#30078" 298 | msgid "You should restart Kodi to continue" 299 | msgstr "" 300 | 301 | msgctxt "#30079" 302 | msgid "Just Today" 303 | msgstr "" 304 | 305 | msgctxt "#30080" 306 | msgid "Profiles" 307 | msgstr "" 308 | 309 | msgctxt "#30081" 310 | msgid "Scheduler will run again on" 311 | msgstr "" 312 | 313 | msgctxt "#30082" 314 | msgid "Progress Bar" 315 | msgstr "" 316 | 317 | msgctxt "#30083" 318 | msgid "Background Progress Bar" 319 | msgstr "" 320 | 321 | msgctxt "#30084" 322 | msgid "None (Silent)" 323 | msgstr "" 324 | 325 | msgctxt "#30085" 326 | msgid "Version Warning" 327 | msgstr "" 328 | 329 | msgctxt "#30086" 330 | msgid "This version of Kodi is different than the one used to create the archive" 331 | msgstr "" 332 | 333 | msgctxt "#30087" 334 | msgid "Compress Archives" 335 | msgstr "" 336 | 337 | msgctxt "#30088" 338 | msgid "Copying Zip Archive" 339 | msgstr "" 340 | 341 | msgctxt "#30089" 342 | msgid "Write Error Detected" 343 | msgstr "" 344 | 345 | msgctxt "#30090" 346 | msgid "The destination may not be writeable" 347 | msgstr "" 348 | 349 | msgctxt "#30091" 350 | msgid "Zip archive could not be copied" 351 | msgstr "" 352 | 353 | msgctxt "#30092" 354 | msgid "Not all files were copied" 355 | msgstr "" 356 | 357 | msgctxt "#30093" 358 | msgid "Delete Authorization Info" 359 | msgstr "" 360 | 361 | msgctxt "#30094" 362 | msgid "This will delete any OAuth token files" 363 | msgstr "" 364 | 365 | msgctxt "#30095" 366 | msgid "Do you want to do this?" 367 | msgstr "" 368 | 369 | msgctxt "#30096" 370 | msgid "Old Zip Archive could not be deleted" 371 | msgstr "" 372 | 373 | msgctxt "#30097" 374 | msgid "This needs to happen before a backup can run" 375 | msgstr "" 376 | 377 | msgctxt "#30098" 378 | msgid "Google Drive" 379 | msgstr "" 380 | 381 | msgctxt "#30099" 382 | msgid "Open Settings" 383 | msgstr "" 384 | 385 | msgctxt "#30100" 386 | msgid "Extracting Archive" 387 | msgstr "" 388 | 389 | msgctxt "#30101" 390 | msgid "Error extracting the zip archive" 391 | msgstr "" 392 | 393 | msgctxt "#30102" 394 | msgid "Click OK to enter code" 395 | msgstr "" 396 | 397 | msgctxt "#30103" 398 | msgid "Validation Code" 399 | msgstr "" 400 | 401 | msgctxt "#30104" 402 | msgid "Authorize Now" 403 | msgstr "" 404 | 405 | msgctxt "#30105" 406 | msgid "Authorize this remote service in the settings first" 407 | msgstr "" 408 | 409 | msgctxt "#30106" 410 | msgid "is authorized" 411 | msgstr "" 412 | 413 | msgctxt "#30107" 414 | msgid "error authorizing" 415 | msgstr "" 416 | 417 | msgctxt "#30108" 418 | msgid "Visit https://console.developers.google.com/" 419 | msgstr "" 420 | 421 | msgctxt "#30109" 422 | msgid "Run on startup if missed" 423 | msgstr "" 424 | 425 | msgctxt "#30110" 426 | msgid "Set Name" 427 | msgstr "" 428 | 429 | msgctxt "#30111" 430 | msgid "Root folder selection" 431 | msgstr "" 432 | 433 | msgctxt "#30112" 434 | msgid "Browse Folder" 435 | msgstr "" 436 | 437 | msgctxt "#30113" 438 | msgid "Enter Own" 439 | msgstr "" 440 | 441 | msgctxt "#30114" 442 | msgid "starts in Kodi home" 443 | msgstr "" 444 | 445 | msgctxt "#30115" 446 | msgid "enter path to start there" 447 | msgstr "" 448 | 449 | msgctxt "#30116" 450 | msgid "Enter root path" 451 | msgstr "" 452 | 453 | msgctxt "#30117" 454 | msgid "Path Error" 455 | msgstr "" 456 | 457 | msgctxt "#30118" 458 | msgid "Path does not exist" 459 | msgstr "" 460 | 461 | msgctxt "#30119" 462 | msgid "Select root" 463 | msgstr "" 464 | 465 | msgctxt "#30120" 466 | msgid "Add Exclude Folder" 467 | msgstr "" 468 | 469 | msgctxt "#30121" 470 | msgid "Root Folder" 471 | msgstr "" 472 | 473 | msgctxt "#30122" 474 | msgid "Edit" 475 | msgstr "" 476 | 477 | msgctxt "#30123" 478 | msgid "Delete" 479 | msgstr "" 480 | 481 | msgctxt "#30124" 482 | msgid "Choose Action" 483 | msgstr "" 484 | 485 | msgctxt "#30125" 486 | msgid "Advanced Editor" 487 | msgstr "" 488 | 489 | msgctxt "#30126" 490 | msgid "Add Set" 491 | msgstr "" 492 | 493 | msgctxt "#30127" 494 | msgid "Delete Set" 495 | msgstr "" 496 | 497 | msgctxt "#30128" 498 | msgid "Are you sure you want to delete?" 499 | msgstr "" 500 | 501 | msgctxt "#30129" 502 | msgid "Exclude" 503 | msgstr "" 504 | 505 | msgctxt "#30130" 506 | msgid "The root folder cannot be changed" 507 | msgstr "" 508 | 509 | msgctxt "#30131" 510 | msgid "Choose Sets to Restore" 511 | msgstr "" 512 | 513 | msgctxt "#30132" 514 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 515 | msgstr "" 516 | 517 | msgctxt "#30133" 518 | msgid "Game Saves" 519 | msgstr "" 520 | 521 | msgctxt "#30134" 522 | msgid "Include" 523 | msgstr "" 524 | 525 | msgctxt "#30135" 526 | msgid "Add Include Folder" 527 | msgstr "" 528 | 529 | msgctxt "#30136" 530 | msgid "Path must be within root folder" 531 | msgstr "" 532 | 533 | msgctxt "#30137" 534 | msgid "This path is part of a rule already" 535 | msgstr "" 536 | 537 | msgctxt "#30138" 538 | msgid "Set Name exists already" 539 | msgstr "" 540 | 541 | msgctxt "#30139" 542 | msgid "Copy Simple Config" 543 | msgstr "" 544 | 545 | msgctxt "#30140" 546 | msgid "This will copy the default Simple file selection to the Advanced Editor" 547 | msgstr "" 548 | 549 | msgctxt "#30141" 550 | msgid "This will erase any current Advanced Editor settings" 551 | msgstr "" 552 | 553 | msgctxt "#30142" 554 | msgid "Enable Verbose Logging" 555 | msgstr "" 556 | 557 | msgctxt "#30143" 558 | msgid "Exclude a specific folder from this backup set" 559 | msgstr "" 560 | 561 | msgctxt "#30144" 562 | msgid "Include a specific folder to this backup set" 563 | msgstr "" 564 | 565 | msgctxt "#30145" 566 | msgid "Type" 567 | msgstr "" 568 | 569 | msgctxt "#30146" 570 | msgid "Include Sub Folders" 571 | msgstr "" 572 | 573 | msgctxt "#30147" 574 | msgid "Toggle Sub Folders" 575 | msgstr "" 576 | 577 | msgctxt "#30148" 578 | msgid "Ask before restoring Kodi UI settings" 579 | msgstr "" 580 | 581 | msgctxt "#30149" 582 | msgid "Restore Kodi UI Settings" 583 | msgstr "" 584 | 585 | msgctxt "#30150" 586 | msgid "Restore saved Kodi system settings from backup?" 587 | msgstr "" 588 | 589 | msgctxt "#30151" 590 | msgid "Enable Verbose Logging" 591 | msgstr "" 592 | 593 | msgctxt "#30152" 594 | msgid "Set Zip File Location" 595 | msgstr "" 596 | 597 | msgctxt "#30153" 598 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 599 | msgstr "" 600 | 601 | msgctxt "#30154" 602 | msgid "Always prompt if Kodi settings should be restored - no by default" 603 | msgstr "" 604 | 605 | msgctxt "#30155" 606 | msgid "Adds additional information to the log file" 607 | msgstr "" 608 | 609 | msgctxt "#30156" 610 | msgid "Must save key/secret first, then return to settings to authorize" 611 | msgstr "" 612 | 613 | msgctxt "#30157" 614 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 615 | msgstr "" 616 | 617 | msgctxt "#30158" 618 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 619 | msgstr "" 620 | 621 | msgctxt "#30159" 622 | msgid "Backup started with unknown mode" 623 | msgstr "" 624 | 625 | msgctxt "#30160" 626 | msgid "Backup Filename Suffix" 627 | msgstr "" 628 | 629 | msgctxt "#30161" 630 | msgid "Amend a string to the end of each backup folder or ZIP file" 631 | msgstr "" 632 | -------------------------------------------------------------------------------- /resources/language/resource.language.tg_tj/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2022-04-04 00:13+0000\n" 12 | "Last-Translator: Christian Gade \n" 13 | "Language-Team: Tajik \n" 14 | "Language: tg_tj\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=1; plural=0;\n" 19 | "X-Generator: Weblate 4.11.2\n" 20 | 21 | msgctxt "Addon Summary" 22 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 23 | msgstr "" 24 | 25 | msgctxt "Addon Description" 26 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 27 | msgstr "" 28 | 29 | msgctxt "#30010" 30 | msgid "Backup" 31 | msgstr "" 32 | 33 | msgctxt "#30011" 34 | msgid "General" 35 | msgstr "Умумӣ" 36 | 37 | msgctxt "#30012" 38 | msgid "File Selection" 39 | msgstr "" 40 | 41 | msgctxt "#30013" 42 | msgid "Scheduling" 43 | msgstr "" 44 | 45 | msgctxt "#30014" 46 | msgid "Simple" 47 | msgstr "" 48 | 49 | msgctxt "#30015" 50 | msgid "Advanced" 51 | msgstr "" 52 | 53 | msgctxt "#30016" 54 | msgid "Backup" 55 | msgstr "" 56 | 57 | msgctxt "#30017" 58 | msgid "Restore" 59 | msgstr "" 60 | 61 | msgctxt "#30018" 62 | msgid "Browse Path" 63 | msgstr "" 64 | 65 | msgctxt "#30019" 66 | msgid "Type Path" 67 | msgstr "" 68 | 69 | msgctxt "#30020" 70 | msgid "Browse Remote Path" 71 | msgstr "" 72 | 73 | msgctxt "#30021" 74 | msgid "Backup Folder Name" 75 | msgstr "" 76 | 77 | msgctxt "#30022" 78 | msgid "Progress Display" 79 | msgstr "" 80 | 81 | msgctxt "#30023" 82 | msgid "Mode" 83 | msgstr "" 84 | 85 | msgctxt "#30024" 86 | msgid "Type Remote Path" 87 | msgstr "" 88 | 89 | msgctxt "#30025" 90 | msgid "Remote Path Type" 91 | msgstr "" 92 | 93 | msgctxt "#30026" 94 | msgid "Backups to keep (0 for all)" 95 | msgstr "" 96 | 97 | msgctxt "#30027" 98 | msgid "Dropbox" 99 | msgstr "" 100 | 101 | msgctxt "#30028" 102 | msgid "Dropbox Key" 103 | msgstr "" 104 | 105 | msgctxt "#30029" 106 | msgid "Dropbox Secret" 107 | msgstr "" 108 | 109 | msgctxt "#30030" 110 | msgid "User Addons" 111 | msgstr "" 112 | 113 | msgctxt "#30031" 114 | msgid "Addon Data" 115 | msgstr "" 116 | 117 | msgctxt "#30032" 118 | msgid "Database" 119 | msgstr "" 120 | 121 | msgctxt "#30033" 122 | msgid "Playlist" 123 | msgstr "" 124 | 125 | msgctxt "#30034" 126 | msgid "Thumbnails/Fanart" 127 | msgstr "" 128 | 129 | msgctxt "#30035" 130 | msgid "Config Files" 131 | msgstr "" 132 | 133 | msgctxt "#30036" 134 | msgid "Disclaimer" 135 | msgstr "" 136 | 137 | msgctxt "#30037" 138 | msgid "Canceling this menu will close and save changes" 139 | msgstr "" 140 | 141 | msgctxt "#30038" 142 | msgid "Advanced Settings Detected" 143 | msgstr "" 144 | 145 | msgctxt "#30039" 146 | msgid "The advancedsettings file should be restored first" 147 | msgstr "" 148 | 149 | msgctxt "#30040" 150 | msgid "Select Yes to restore this file and restart Kodi" 151 | msgstr "" 152 | 153 | msgctxt "#30041" 154 | msgid "Select No to continue" 155 | msgstr "" 156 | 157 | msgctxt "#30042" 158 | msgid "Resume Restore" 159 | msgstr "" 160 | 161 | msgctxt "#30043" 162 | msgid "The Backup addon has detected an unfinished restore" 163 | msgstr "" 164 | 165 | msgctxt "#30044" 166 | msgid "Would you like to continue?" 167 | msgstr "" 168 | 169 | msgctxt "#30045" 170 | msgid "Error: Remote or zip file path doesn't exist" 171 | msgstr "" 172 | 173 | msgctxt "#30046" 174 | msgid "Starting" 175 | msgstr "" 176 | 177 | msgctxt "#30047" 178 | msgid "Local Dir" 179 | msgstr "" 180 | 181 | msgctxt "#30048" 182 | msgid "Remote Dir" 183 | msgstr "" 184 | 185 | msgctxt "#30049" 186 | msgid "Gathering file list" 187 | msgstr "" 188 | 189 | msgctxt "#30050" 190 | msgid "Remote Path exists - may have old files in it!" 191 | msgstr "" 192 | 193 | msgctxt "#30051" 194 | msgid "Creating Files List" 195 | msgstr "" 196 | 197 | msgctxt "#30052" 198 | msgid "Writing file" 199 | msgstr "" 200 | 201 | msgctxt "#30053" 202 | msgid "Starting scheduled backup" 203 | msgstr "" 204 | 205 | msgctxt "#30054" 206 | msgid "Removing backup" 207 | msgstr "" 208 | 209 | msgctxt "#30056" 210 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 211 | msgstr "" 212 | 213 | msgctxt "#30057" 214 | msgid "Click OK AFTER completion" 215 | msgstr "" 216 | 217 | msgctxt "#30058" 218 | msgid "Developer Code Needed" 219 | msgstr "" 220 | 221 | msgctxt "#30059" 222 | msgid "Visit https://www.dropbox.com/developers" 223 | msgstr "" 224 | 225 | msgctxt "#30060" 226 | msgid "Enable Scheduler" 227 | msgstr "" 228 | 229 | msgctxt "#30061" 230 | msgid "Schedule" 231 | msgstr "" 232 | 233 | msgctxt "#30062" 234 | msgid "Hour of Day" 235 | msgstr "" 236 | 237 | msgctxt "#30063" 238 | msgid "Day of Week" 239 | msgstr "" 240 | 241 | msgctxt "#30064" 242 | msgid "Cron Schedule" 243 | msgstr "" 244 | 245 | msgctxt "#30065" 246 | msgid "Sunday" 247 | msgstr "" 248 | 249 | msgctxt "#30066" 250 | msgid "Monday" 251 | msgstr "" 252 | 253 | msgctxt "#30067" 254 | msgid "Tuesday" 255 | msgstr "" 256 | 257 | msgctxt "#30068" 258 | msgid "Wednesday" 259 | msgstr "" 260 | 261 | msgctxt "#30069" 262 | msgid "Thursday" 263 | msgstr "" 264 | 265 | msgctxt "#30070" 266 | msgid "Friday" 267 | msgstr "" 268 | 269 | msgctxt "#30071" 270 | msgid "Saturday" 271 | msgstr "" 272 | 273 | msgctxt "#30072" 274 | msgid "Every Day" 275 | msgstr "" 276 | 277 | msgctxt "#30073" 278 | msgid "Every Week" 279 | msgstr "" 280 | 281 | msgctxt "#30074" 282 | msgid "First Day of Month" 283 | msgstr "" 284 | 285 | msgctxt "#30075" 286 | msgid "Custom Schedule" 287 | msgstr "" 288 | 289 | msgctxt "#30076" 290 | msgid "Shutdown After Backup" 291 | msgstr "" 292 | 293 | msgctxt "#30077" 294 | msgid "Restart Kodi" 295 | msgstr "" 296 | 297 | msgctxt "#30078" 298 | msgid "You should restart Kodi to continue" 299 | msgstr "" 300 | 301 | msgctxt "#30079" 302 | msgid "Just Today" 303 | msgstr "" 304 | 305 | msgctxt "#30080" 306 | msgid "Profiles" 307 | msgstr "" 308 | 309 | msgctxt "#30081" 310 | msgid "Scheduler will run again on" 311 | msgstr "" 312 | 313 | msgctxt "#30082" 314 | msgid "Progress Bar" 315 | msgstr "" 316 | 317 | msgctxt "#30083" 318 | msgid "Background Progress Bar" 319 | msgstr "" 320 | 321 | msgctxt "#30084" 322 | msgid "None (Silent)" 323 | msgstr "" 324 | 325 | msgctxt "#30085" 326 | msgid "Version Warning" 327 | msgstr "" 328 | 329 | msgctxt "#30086" 330 | msgid "This version of Kodi is different than the one used to create the archive" 331 | msgstr "" 332 | 333 | msgctxt "#30087" 334 | msgid "Compress Archives" 335 | msgstr "" 336 | 337 | msgctxt "#30088" 338 | msgid "Copying Zip Archive" 339 | msgstr "" 340 | 341 | msgctxt "#30089" 342 | msgid "Write Error Detected" 343 | msgstr "" 344 | 345 | msgctxt "#30090" 346 | msgid "The destination may not be writeable" 347 | msgstr "" 348 | 349 | msgctxt "#30091" 350 | msgid "Zip archive could not be copied" 351 | msgstr "" 352 | 353 | msgctxt "#30092" 354 | msgid "Not all files were copied" 355 | msgstr "" 356 | 357 | msgctxt "#30093" 358 | msgid "Delete Authorization Info" 359 | msgstr "" 360 | 361 | msgctxt "#30094" 362 | msgid "This will delete any OAuth token files" 363 | msgstr "" 364 | 365 | msgctxt "#30095" 366 | msgid "Do you want to do this?" 367 | msgstr "" 368 | 369 | msgctxt "#30096" 370 | msgid "Old Zip Archive could not be deleted" 371 | msgstr "" 372 | 373 | msgctxt "#30097" 374 | msgid "This needs to happen before a backup can run" 375 | msgstr "" 376 | 377 | msgctxt "#30098" 378 | msgid "Google Drive" 379 | msgstr "" 380 | 381 | msgctxt "#30099" 382 | msgid "Open Settings" 383 | msgstr "" 384 | 385 | msgctxt "#30100" 386 | msgid "Extracting Archive" 387 | msgstr "" 388 | 389 | msgctxt "#30101" 390 | msgid "Error extracting the zip archive" 391 | msgstr "" 392 | 393 | msgctxt "#30102" 394 | msgid "Click OK to enter code" 395 | msgstr "" 396 | 397 | msgctxt "#30103" 398 | msgid "Validation Code" 399 | msgstr "" 400 | 401 | msgctxt "#30104" 402 | msgid "Authorize Now" 403 | msgstr "" 404 | 405 | msgctxt "#30105" 406 | msgid "Authorize this remote service in the settings first" 407 | msgstr "" 408 | 409 | msgctxt "#30106" 410 | msgid "is authorized" 411 | msgstr "" 412 | 413 | msgctxt "#30107" 414 | msgid "error authorizing" 415 | msgstr "" 416 | 417 | msgctxt "#30108" 418 | msgid "Visit https://console.developers.google.com/" 419 | msgstr "" 420 | 421 | msgctxt "#30109" 422 | msgid "Run on startup if missed" 423 | msgstr "" 424 | 425 | msgctxt "#30110" 426 | msgid "Set Name" 427 | msgstr "" 428 | 429 | msgctxt "#30111" 430 | msgid "Root folder selection" 431 | msgstr "" 432 | 433 | msgctxt "#30112" 434 | msgid "Browse Folder" 435 | msgstr "" 436 | 437 | msgctxt "#30113" 438 | msgid "Enter Own" 439 | msgstr "" 440 | 441 | msgctxt "#30114" 442 | msgid "starts in Kodi home" 443 | msgstr "" 444 | 445 | msgctxt "#30115" 446 | msgid "enter path to start there" 447 | msgstr "" 448 | 449 | msgctxt "#30116" 450 | msgid "Enter root path" 451 | msgstr "" 452 | 453 | msgctxt "#30117" 454 | msgid "Path Error" 455 | msgstr "" 456 | 457 | msgctxt "#30118" 458 | msgid "Path does not exist" 459 | msgstr "" 460 | 461 | msgctxt "#30119" 462 | msgid "Select root" 463 | msgstr "" 464 | 465 | msgctxt "#30120" 466 | msgid "Add Exclude Folder" 467 | msgstr "" 468 | 469 | msgctxt "#30121" 470 | msgid "Root Folder" 471 | msgstr "" 472 | 473 | msgctxt "#30122" 474 | msgid "Edit" 475 | msgstr "" 476 | 477 | msgctxt "#30123" 478 | msgid "Delete" 479 | msgstr "" 480 | 481 | msgctxt "#30124" 482 | msgid "Choose Action" 483 | msgstr "" 484 | 485 | msgctxt "#30125" 486 | msgid "Advanced Editor" 487 | msgstr "" 488 | 489 | msgctxt "#30126" 490 | msgid "Add Set" 491 | msgstr "" 492 | 493 | msgctxt "#30127" 494 | msgid "Delete Set" 495 | msgstr "" 496 | 497 | msgctxt "#30128" 498 | msgid "Are you sure you want to delete?" 499 | msgstr "" 500 | 501 | msgctxt "#30129" 502 | msgid "Exclude" 503 | msgstr "" 504 | 505 | msgctxt "#30130" 506 | msgid "The root folder cannot be changed" 507 | msgstr "" 508 | 509 | msgctxt "#30131" 510 | msgid "Choose Sets to Restore" 511 | msgstr "" 512 | 513 | msgctxt "#30132" 514 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 515 | msgstr "" 516 | 517 | msgctxt "#30133" 518 | msgid "Game Saves" 519 | msgstr "" 520 | 521 | msgctxt "#30134" 522 | msgid "Include" 523 | msgstr "" 524 | 525 | msgctxt "#30135" 526 | msgid "Add Include Folder" 527 | msgstr "" 528 | 529 | msgctxt "#30136" 530 | msgid "Path must be within root folder" 531 | msgstr "" 532 | 533 | msgctxt "#30137" 534 | msgid "This path is part of a rule already" 535 | msgstr "" 536 | 537 | msgctxt "#30138" 538 | msgid "Set Name exists already" 539 | msgstr "" 540 | 541 | msgctxt "#30139" 542 | msgid "Copy Simple Config" 543 | msgstr "" 544 | 545 | msgctxt "#30140" 546 | msgid "This will copy the default Simple file selection to the Advanced Editor" 547 | msgstr "" 548 | 549 | msgctxt "#30141" 550 | msgid "This will erase any current Advanced Editor settings" 551 | msgstr "" 552 | 553 | msgctxt "#30142" 554 | msgid "Enable Verbose Logging" 555 | msgstr "" 556 | 557 | msgctxt "#30143" 558 | msgid "Exclude a specific folder from this backup set" 559 | msgstr "" 560 | 561 | msgctxt "#30144" 562 | msgid "Include a specific folder to this backup set" 563 | msgstr "" 564 | 565 | msgctxt "#30145" 566 | msgid "Type" 567 | msgstr "" 568 | 569 | msgctxt "#30146" 570 | msgid "Include Sub Folders" 571 | msgstr "" 572 | 573 | msgctxt "#30147" 574 | msgid "Toggle Sub Folders" 575 | msgstr "" 576 | 577 | msgctxt "#30148" 578 | msgid "Ask before restoring Kodi UI settings" 579 | msgstr "" 580 | 581 | msgctxt "#30149" 582 | msgid "Restore Kodi UI Settings" 583 | msgstr "" 584 | 585 | msgctxt "#30150" 586 | msgid "Restore saved Kodi system settings from backup?" 587 | msgstr "" 588 | 589 | msgctxt "#30151" 590 | msgid "Enable Verbose Logging" 591 | msgstr "" 592 | 593 | msgctxt "#30152" 594 | msgid "Set Zip File Location" 595 | msgstr "" 596 | 597 | msgctxt "#30153" 598 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 599 | msgstr "" 600 | 601 | msgctxt "#30154" 602 | msgid "Always prompt if Kodi settings should be restored - no by default" 603 | msgstr "" 604 | 605 | msgctxt "#30155" 606 | msgid "Adds additional information to the log file" 607 | msgstr "" 608 | 609 | msgctxt "#30156" 610 | msgid "Must save key/secret first, then return to settings to authorize" 611 | msgstr "" 612 | 613 | msgctxt "#30157" 614 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 615 | msgstr "" 616 | 617 | msgctxt "#30158" 618 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 619 | msgstr "" 620 | 621 | msgctxt "#30159" 622 | msgid "Backup started with unknown mode" 623 | msgstr "" 624 | 625 | msgctxt "#30160" 626 | msgid "Backup Filename Suffix" 627 | msgstr "" 628 | 629 | msgctxt "#30161" 630 | msgid "Amend a string to the end of each backup folder or ZIP file" 631 | msgstr "" 632 | -------------------------------------------------------------------------------- /resources/language/resource.language.zh_tw/strings.po: -------------------------------------------------------------------------------- 1 | # Kodi Media Center language file 2 | # Addon Name: Backup 3 | # Addon id: script.xbmcbackup 4 | # Addon Provider: robweber 5 | # Translators: 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: XBMC Addons\n" 9 | "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" 10 | "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" 11 | "PO-Revision-Date: 2022-02-23 12:13+0000\n" 12 | "Last-Translator: Christian Gade \n" 13 | "Language-Team: Chinese (Taiwan) \n" 14 | "Language: zh_tw\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=1; plural=0;\n" 19 | "X-Generator: Weblate 4.10.1\n" 20 | 21 | msgctxt "Addon Summary" 22 | msgid "Backup and restore your Kodi database and configuration files in the event of a crash or file corruption." 23 | msgstr "" 24 | 25 | msgctxt "Addon Description" 26 | msgid "Ever hosed your Kodi configuration and wished you'd had a backup? Now you can with one easy click. You can export your database, playlist, thumbnails, addons and other configuration details to any source writeable by Kodi or directly to Dropbox cloud storage. Backups can be run on demand or via a scheduler. " 27 | msgstr "" 28 | 29 | msgctxt "#30010" 30 | msgid "Backup" 31 | msgstr "" 32 | 33 | msgctxt "#30011" 34 | msgid "General" 35 | msgstr "一般設定" 36 | 37 | msgctxt "#30012" 38 | msgid "File Selection" 39 | msgstr "" 40 | 41 | msgctxt "#30013" 42 | msgid "Scheduling" 43 | msgstr "" 44 | 45 | msgctxt "#30014" 46 | msgid "Simple" 47 | msgstr "" 48 | 49 | msgctxt "#30015" 50 | msgid "Advanced" 51 | msgstr "" 52 | 53 | msgctxt "#30016" 54 | msgid "Backup" 55 | msgstr "" 56 | 57 | msgctxt "#30017" 58 | msgid "Restore" 59 | msgstr "" 60 | 61 | msgctxt "#30018" 62 | msgid "Browse Path" 63 | msgstr "" 64 | 65 | msgctxt "#30019" 66 | msgid "Type Path" 67 | msgstr "" 68 | 69 | msgctxt "#30020" 70 | msgid "Browse Remote Path" 71 | msgstr "" 72 | 73 | msgctxt "#30021" 74 | msgid "Backup Folder Name" 75 | msgstr "" 76 | 77 | msgctxt "#30022" 78 | msgid "Progress Display" 79 | msgstr "" 80 | 81 | msgctxt "#30023" 82 | msgid "Mode" 83 | msgstr "模式" 84 | 85 | msgctxt "#30024" 86 | msgid "Type Remote Path" 87 | msgstr "" 88 | 89 | msgctxt "#30025" 90 | msgid "Remote Path Type" 91 | msgstr "" 92 | 93 | msgctxt "#30026" 94 | msgid "Backups to keep (0 for all)" 95 | msgstr "" 96 | 97 | msgctxt "#30027" 98 | msgid "Dropbox" 99 | msgstr "" 100 | 101 | msgctxt "#30028" 102 | msgid "Dropbox Key" 103 | msgstr "" 104 | 105 | msgctxt "#30029" 106 | msgid "Dropbox Secret" 107 | msgstr "" 108 | 109 | msgctxt "#30030" 110 | msgid "User Addons" 111 | msgstr "" 112 | 113 | msgctxt "#30031" 114 | msgid "Addon Data" 115 | msgstr "" 116 | 117 | msgctxt "#30032" 118 | msgid "Database" 119 | msgstr "資料庫" 120 | 121 | msgctxt "#30033" 122 | msgid "Playlist" 123 | msgstr "播放列表" 124 | 125 | msgctxt "#30034" 126 | msgid "Thumbnails/Fanart" 127 | msgstr "" 128 | 129 | msgctxt "#30035" 130 | msgid "Config Files" 131 | msgstr "" 132 | 133 | msgctxt "#30036" 134 | msgid "Disclaimer" 135 | msgstr "" 136 | 137 | msgctxt "#30037" 138 | msgid "Canceling this menu will close and save changes" 139 | msgstr "" 140 | 141 | msgctxt "#30038" 142 | msgid "Advanced Settings Detected" 143 | msgstr "" 144 | 145 | msgctxt "#30039" 146 | msgid "The advancedsettings file should be restored first" 147 | msgstr "" 148 | 149 | msgctxt "#30040" 150 | msgid "Select Yes to restore this file and restart Kodi" 151 | msgstr "" 152 | 153 | msgctxt "#30041" 154 | msgid "Select No to continue" 155 | msgstr "" 156 | 157 | msgctxt "#30042" 158 | msgid "Resume Restore" 159 | msgstr "" 160 | 161 | msgctxt "#30043" 162 | msgid "The Backup addon has detected an unfinished restore" 163 | msgstr "" 164 | 165 | msgctxt "#30044" 166 | msgid "Would you like to continue?" 167 | msgstr "" 168 | 169 | msgctxt "#30045" 170 | msgid "Error: Remote or zip file path doesn't exist" 171 | msgstr "" 172 | 173 | msgctxt "#30046" 174 | msgid "Starting" 175 | msgstr "" 176 | 177 | msgctxt "#30047" 178 | msgid "Local Dir" 179 | msgstr "" 180 | 181 | msgctxt "#30048" 182 | msgid "Remote Dir" 183 | msgstr "" 184 | 185 | msgctxt "#30049" 186 | msgid "Gathering file list" 187 | msgstr "" 188 | 189 | msgctxt "#30050" 190 | msgid "Remote Path exists - may have old files in it!" 191 | msgstr "" 192 | 193 | msgctxt "#30051" 194 | msgid "Creating Files List" 195 | msgstr "" 196 | 197 | msgctxt "#30052" 198 | msgid "Writing file" 199 | msgstr "" 200 | 201 | msgctxt "#30053" 202 | msgid "Starting scheduled backup" 203 | msgstr "" 204 | 205 | msgctxt "#30054" 206 | msgid "Removing backup" 207 | msgstr "" 208 | 209 | msgctxt "#30056" 210 | msgid "Scan or click this URL to authorize, click OK AFTER completion" 211 | msgstr "" 212 | 213 | msgctxt "#30057" 214 | msgid "Click OK AFTER completion" 215 | msgstr "" 216 | 217 | msgctxt "#30058" 218 | msgid "Developer Code Needed" 219 | msgstr "" 220 | 221 | msgctxt "#30059" 222 | msgid "Visit https://www.dropbox.com/developers" 223 | msgstr "" 224 | 225 | msgctxt "#30060" 226 | msgid "Enable Scheduler" 227 | msgstr "" 228 | 229 | msgctxt "#30061" 230 | msgid "Schedule" 231 | msgstr "時間表" 232 | 233 | msgctxt "#30062" 234 | msgid "Hour of Day" 235 | msgstr "" 236 | 237 | msgctxt "#30063" 238 | msgid "Day of Week" 239 | msgstr "" 240 | 241 | msgctxt "#30064" 242 | msgid "Cron Schedule" 243 | msgstr "" 244 | 245 | msgctxt "#30065" 246 | msgid "Sunday" 247 | msgstr "星期日" 248 | 249 | msgctxt "#30066" 250 | msgid "Monday" 251 | msgstr "星期一" 252 | 253 | msgctxt "#30067" 254 | msgid "Tuesday" 255 | msgstr "星期二" 256 | 257 | msgctxt "#30068" 258 | msgid "Wednesday" 259 | msgstr "星期三" 260 | 261 | msgctxt "#30069" 262 | msgid "Thursday" 263 | msgstr "星期四" 264 | 265 | msgctxt "#30070" 266 | msgid "Friday" 267 | msgstr "星期五" 268 | 269 | msgctxt "#30071" 270 | msgid "Saturday" 271 | msgstr "星期六" 272 | 273 | msgctxt "#30072" 274 | msgid "Every Day" 275 | msgstr "" 276 | 277 | msgctxt "#30073" 278 | msgid "Every Week" 279 | msgstr "" 280 | 281 | msgctxt "#30074" 282 | msgid "First Day of Month" 283 | msgstr "" 284 | 285 | msgctxt "#30075" 286 | msgid "Custom Schedule" 287 | msgstr "" 288 | 289 | msgctxt "#30076" 290 | msgid "Shutdown After Backup" 291 | msgstr "" 292 | 293 | msgctxt "#30077" 294 | msgid "Restart Kodi" 295 | msgstr "" 296 | 297 | msgctxt "#30078" 298 | msgid "You should restart Kodi to continue" 299 | msgstr "" 300 | 301 | msgctxt "#30079" 302 | msgid "Just Today" 303 | msgstr "" 304 | 305 | msgctxt "#30080" 306 | msgid "Profiles" 307 | msgstr "設定檔" 308 | 309 | msgctxt "#30081" 310 | msgid "Scheduler will run again on" 311 | msgstr "" 312 | 313 | msgctxt "#30082" 314 | msgid "Progress Bar" 315 | msgstr "" 316 | 317 | msgctxt "#30083" 318 | msgid "Background Progress Bar" 319 | msgstr "" 320 | 321 | msgctxt "#30084" 322 | msgid "None (Silent)" 323 | msgstr "" 324 | 325 | msgctxt "#30085" 326 | msgid "Version Warning" 327 | msgstr "" 328 | 329 | msgctxt "#30086" 330 | msgid "This version of Kodi is different than the one used to create the archive" 331 | msgstr "" 332 | 333 | msgctxt "#30087" 334 | msgid "Compress Archives" 335 | msgstr "" 336 | 337 | msgctxt "#30088" 338 | msgid "Copying Zip Archive" 339 | msgstr "" 340 | 341 | msgctxt "#30089" 342 | msgid "Write Error Detected" 343 | msgstr "" 344 | 345 | msgctxt "#30090" 346 | msgid "The destination may not be writeable" 347 | msgstr "" 348 | 349 | msgctxt "#30091" 350 | msgid "Zip archive could not be copied" 351 | msgstr "" 352 | 353 | msgctxt "#30092" 354 | msgid "Not all files were copied" 355 | msgstr "" 356 | 357 | msgctxt "#30093" 358 | msgid "Delete Authorization Info" 359 | msgstr "" 360 | 361 | msgctxt "#30094" 362 | msgid "This will delete any OAuth token files" 363 | msgstr "" 364 | 365 | msgctxt "#30095" 366 | msgid "Do you want to do this?" 367 | msgstr "" 368 | 369 | msgctxt "#30096" 370 | msgid "Old Zip Archive could not be deleted" 371 | msgstr "" 372 | 373 | msgctxt "#30097" 374 | msgid "This needs to happen before a backup can run" 375 | msgstr "" 376 | 377 | msgctxt "#30098" 378 | msgid "Google Drive" 379 | msgstr "" 380 | 381 | msgctxt "#30099" 382 | msgid "Open Settings" 383 | msgstr "" 384 | 385 | msgctxt "#30100" 386 | msgid "Extracting Archive" 387 | msgstr "" 388 | 389 | msgctxt "#30101" 390 | msgid "Error extracting the zip archive" 391 | msgstr "" 392 | 393 | msgctxt "#30102" 394 | msgid "Click OK to enter code" 395 | msgstr "" 396 | 397 | msgctxt "#30103" 398 | msgid "Validation Code" 399 | msgstr "" 400 | 401 | msgctxt "#30104" 402 | msgid "Authorize Now" 403 | msgstr "" 404 | 405 | msgctxt "#30105" 406 | msgid "Authorize this remote service in the settings first" 407 | msgstr "" 408 | 409 | msgctxt "#30106" 410 | msgid "is authorized" 411 | msgstr "" 412 | 413 | msgctxt "#30107" 414 | msgid "error authorizing" 415 | msgstr "" 416 | 417 | msgctxt "#30108" 418 | msgid "Visit https://console.developers.google.com/" 419 | msgstr "" 420 | 421 | msgctxt "#30109" 422 | msgid "Run on startup if missed" 423 | msgstr "" 424 | 425 | msgctxt "#30110" 426 | msgid "Set Name" 427 | msgstr "" 428 | 429 | msgctxt "#30111" 430 | msgid "Root folder selection" 431 | msgstr "" 432 | 433 | msgctxt "#30112" 434 | msgid "Browse Folder" 435 | msgstr "" 436 | 437 | msgctxt "#30113" 438 | msgid "Enter Own" 439 | msgstr "" 440 | 441 | msgctxt "#30114" 442 | msgid "starts in Kodi home" 443 | msgstr "" 444 | 445 | msgctxt "#30115" 446 | msgid "enter path to start there" 447 | msgstr "" 448 | 449 | msgctxt "#30116" 450 | msgid "Enter root path" 451 | msgstr "" 452 | 453 | msgctxt "#30117" 454 | msgid "Path Error" 455 | msgstr "" 456 | 457 | msgctxt "#30118" 458 | msgid "Path does not exist" 459 | msgstr "" 460 | 461 | msgctxt "#30119" 462 | msgid "Select root" 463 | msgstr "" 464 | 465 | msgctxt "#30120" 466 | msgid "Add Exclude Folder" 467 | msgstr "" 468 | 469 | msgctxt "#30121" 470 | msgid "Root Folder" 471 | msgstr "" 472 | 473 | msgctxt "#30122" 474 | msgid "Edit" 475 | msgstr "" 476 | 477 | msgctxt "#30123" 478 | msgid "Delete" 479 | msgstr "刪除" 480 | 481 | msgctxt "#30124" 482 | msgid "Choose Action" 483 | msgstr "" 484 | 485 | msgctxt "#30125" 486 | msgid "Advanced Editor" 487 | msgstr "" 488 | 489 | msgctxt "#30126" 490 | msgid "Add Set" 491 | msgstr "" 492 | 493 | msgctxt "#30127" 494 | msgid "Delete Set" 495 | msgstr "" 496 | 497 | msgctxt "#30128" 498 | msgid "Are you sure you want to delete?" 499 | msgstr "" 500 | 501 | msgctxt "#30129" 502 | msgid "Exclude" 503 | msgstr "" 504 | 505 | msgctxt "#30130" 506 | msgid "The root folder cannot be changed" 507 | msgstr "" 508 | 509 | msgctxt "#30131" 510 | msgid "Choose Sets to Restore" 511 | msgstr "" 512 | 513 | msgctxt "#30132" 514 | msgid "Version 1.5.0 requires you to setup your file selections again - this is a breaking change" 515 | msgstr "" 516 | 517 | msgctxt "#30133" 518 | msgid "Game Saves" 519 | msgstr "" 520 | 521 | msgctxt "#30134" 522 | msgid "Include" 523 | msgstr "" 524 | 525 | msgctxt "#30135" 526 | msgid "Add Include Folder" 527 | msgstr "" 528 | 529 | msgctxt "#30136" 530 | msgid "Path must be within root folder" 531 | msgstr "" 532 | 533 | msgctxt "#30137" 534 | msgid "This path is part of a rule already" 535 | msgstr "" 536 | 537 | msgctxt "#30138" 538 | msgid "Set Name exists already" 539 | msgstr "" 540 | 541 | msgctxt "#30139" 542 | msgid "Copy Simple Config" 543 | msgstr "" 544 | 545 | msgctxt "#30140" 546 | msgid "This will copy the default Simple file selection to the Advanced Editor" 547 | msgstr "" 548 | 549 | msgctxt "#30141" 550 | msgid "This will erase any current Advanced Editor settings" 551 | msgstr "" 552 | 553 | msgctxt "#30142" 554 | msgid "Enable Verbose Logging" 555 | msgstr "" 556 | 557 | msgctxt "#30143" 558 | msgid "Exclude a specific folder from this backup set" 559 | msgstr "" 560 | 561 | msgctxt "#30144" 562 | msgid "Include a specific folder to this backup set" 563 | msgstr "" 564 | 565 | msgctxt "#30145" 566 | msgid "Type" 567 | msgstr "" 568 | 569 | msgctxt "#30146" 570 | msgid "Include Sub Folders" 571 | msgstr "" 572 | 573 | msgctxt "#30147" 574 | msgid "Toggle Sub Folders" 575 | msgstr "" 576 | 577 | msgctxt "#30148" 578 | msgid "Ask before restoring Kodi UI settings" 579 | msgstr "" 580 | 581 | msgctxt "#30149" 582 | msgid "Restore Kodi UI Settings" 583 | msgstr "" 584 | 585 | msgctxt "#30150" 586 | msgid "Restore saved Kodi system settings from backup?" 587 | msgstr "" 588 | 589 | msgctxt "#30151" 590 | msgid "Enable Verbose Logging" 591 | msgstr "" 592 | 593 | msgctxt "#30152" 594 | msgid "Set Zip File Location" 595 | msgstr "" 596 | 597 | msgctxt "#30153" 598 | msgid "Full path to where the zip file will be staged during backup or restore - must be local to this device" 599 | msgstr "" 600 | 601 | msgctxt "#30154" 602 | msgid "Always prompt if Kodi settings should be restored - no by default" 603 | msgstr "" 604 | 605 | msgctxt "#30155" 606 | msgid "Adds additional information to the log file" 607 | msgstr "" 608 | 609 | msgctxt "#30156" 610 | msgid "Must save key/secret first, then return to settings to authorize" 611 | msgstr "" 612 | 613 | msgctxt "#30157" 614 | msgid "Simple uses pre-defined folder locations, use Advanced Editor to define custom paths" 615 | msgstr "" 616 | 617 | msgctxt "#30158" 618 | msgid "Run backup on daily, weekly, monthly, or custom schedule" 619 | msgstr "" 620 | 621 | msgctxt "#30159" 622 | msgid "Backup started with unknown mode" 623 | msgstr "" 624 | 625 | msgctxt "#30160" 626 | msgid "Backup Filename Suffix" 627 | msgstr "" 628 | 629 | msgctxt "#30161" 630 | msgid "Amend a string to the end of each backup folder or ZIP file" 631 | msgstr "" 632 | -------------------------------------------------------------------------------- /resources/lib/advanced_editor.py: -------------------------------------------------------------------------------- 1 | import json 2 | import xbmcgui 3 | import xbmcvfs 4 | import os.path 5 | from . import utils as utils 6 | 7 | 8 | class BackupSetManager: 9 | jsonFile = xbmcvfs.translatePath(utils.data_dir() + "custom_paths.json") 10 | paths = None 11 | 12 | def __init__(self): 13 | self.paths = {} 14 | 15 | # try and read in the custom file 16 | self._readFile() 17 | 18 | def addSet(self, aSet): 19 | self.paths[aSet['name']] = {'root': aSet['root'], 'dirs': [{"type": "include", "path": aSet['root'], 'recurse': True}]} 20 | 21 | # save the file 22 | self._writeFile() 23 | 24 | def updateSet(self, name, aSet): 25 | self.paths[name] = aSet 26 | 27 | # save the file 28 | self._writeFile() 29 | 30 | def deleteSet(self, index): 31 | # match the index to a key 32 | keys = self.getSets() 33 | 34 | # delete this set 35 | del self.paths[keys[index]] 36 | 37 | # save the file 38 | self._writeFile() 39 | 40 | def getSets(self): 41 | # list all current sets by name 42 | keys = list(self.paths.keys()) 43 | keys.sort() 44 | 45 | return keys 46 | 47 | def getSet(self, index): 48 | keys = self.getSets() 49 | 50 | # return the set at this index 51 | return {'name': keys[index], 'set': self.paths[keys[index]]} 52 | 53 | def validateSetName(self, name): 54 | return (name not in self.getSets()) 55 | 56 | def _writeFile(self): 57 | # create the custom file 58 | aFile = xbmcvfs.File(self.jsonFile, 'w') 59 | aFile.write(json.dumps(self.paths)) 60 | aFile.close() 61 | 62 | def _readFile(self): 63 | 64 | if(xbmcvfs.exists(self.jsonFile)): 65 | 66 | # read in the custom file 67 | aFile = xbmcvfs.File(self.jsonFile) 68 | 69 | # load custom dirs 70 | self.paths = json.loads(aFile.read()) 71 | aFile.close() 72 | else: 73 | # write a blank file 74 | self._writeFile() 75 | 76 | 77 | class AdvancedBackupEditor: 78 | dialog = None 79 | 80 | def __init__(self): 81 | self.dialog = xbmcgui.Dialog() 82 | 83 | def _cleanPath(self, root, path): 84 | return path[len(root) - 1:] 85 | 86 | def _validatePath(self, root, path): 87 | return path.startswith(root) 88 | 89 | def createSet(self): 90 | backupSet = None 91 | 92 | name = self.dialog.input(utils.getString(30110), defaultt='Backup Set') 93 | 94 | if(name is not None): 95 | 96 | # give a choice to start in home or enter a root path 97 | enterHome = self.dialog.yesno(utils.getString(30111), message=utils.getString(30112) + " - " + utils.getString(30114) + "\n" + utils.getString(30113) + " - " + utils.getString(30115), nolabel=utils.getString(30112), yeslabel=utils.getString(30113)) 98 | 99 | rootFolder = 'special://home' 100 | if(enterHome): 101 | rootFolder = self.dialog.input(utils.getString(30116), defaultt=rootFolder) 102 | 103 | # direcotry has to end in slash 104 | if(rootFolder[:-1] != '/'): 105 | rootFolder = rootFolder + '/' 106 | 107 | # check that this path even exists 108 | if(not xbmcvfs.exists(xbmcvfs.translatePath(rootFolder))): 109 | self.dialog.ok(utils.getString(30117), utils.getString(30118), rootFolder) 110 | return None 111 | else: 112 | # select path to start set 113 | rootFolder = self.dialog.browse(type=0, heading=utils.getString(30119), shares='files', defaultt=rootFolder) 114 | 115 | backupSet = {'name': name, 'root': rootFolder} 116 | 117 | return backupSet 118 | 119 | def editSet(self, name, backupSet): 120 | optionSelected = '' 121 | rootPath = backupSet['root'] 122 | 123 | while(optionSelected != -1): 124 | options = [xbmcgui.ListItem(utils.getString(30120), utils.getString(30143)), xbmcgui.ListItem(utils.getString(30135), utils.getString(30144)), xbmcgui.ListItem(rootPath, utils.getString(30121))] 125 | 126 | for aDir in backupSet['dirs']: 127 | if(aDir['type'] == 'exclude'): 128 | options.append(xbmcgui.ListItem(self._cleanPath(rootPath, aDir['path']), "%s: %s" % (utils.getString(30145), utils.getString(30129)))) 129 | elif(aDir['type'] == 'include'): 130 | options.append(xbmcgui.ListItem(self._cleanPath(rootPath, aDir['path']), "%s: %s | %s: %s" % (utils.getString(30145), utils.getString(30134), utils.getString(30146), str(aDir['recurse'])))) 131 | 132 | optionSelected = self.dialog.select(utils.getString(30122) + ' ' + name, options, useDetails=True) 133 | 134 | if(optionSelected == 0 or optionSelected == 1): 135 | # add a folder, will equal root if cancel is hit 136 | addFolder = self.dialog.browse(type=0, heading=utils.getString(30120), shares='files', defaultt=backupSet['root']) 137 | 138 | if(addFolder.startswith(rootPath)): 139 | 140 | if(not any(addFolder == aDir['path'] for aDir in backupSet['dirs'])): 141 | # cannot add root as an exclusion 142 | if(optionSelected == 0 and addFolder != backupSet['root']): 143 | backupSet['dirs'].append({"path": addFolder, "type": "exclude"}) 144 | elif(optionSelected == 1): 145 | # can add root as inclusion 146 | backupSet['dirs'].append({"path": addFolder, "type": "include", "recurse": True}) 147 | else: 148 | # this path is already part of another include/exclude rule 149 | self.dialog.ok(utils.getString(30117), utils.getString(30137), addFolder) 150 | else: 151 | # folder must be under root folder 152 | self.dialog.ok(utils.getString(30117), utils.getString(30136), rootPath) 153 | elif(optionSelected == 2): 154 | self.dialog.ok(utils.getString(30121), utils.getString(30130), backupSet['root']) 155 | elif(optionSelected > 2): 156 | 157 | cOptions = ['Delete'] 158 | if(backupSet['dirs'][optionSelected - 3]['type'] == 'include'): 159 | cOptions.append(utils.getString(30147)) 160 | 161 | contextOption = self.dialog.contextmenu(cOptions) 162 | 163 | if(contextOption == 0): 164 | if(self.dialog.yesno(heading=utils.getString(30123), message=utils.getString(30128))): 165 | # remove folder 166 | del backupSet['dirs'][optionSelected - 3] 167 | elif(contextOption == 1 and backupSet['dirs'][optionSelected - 3]['type'] == 'include'): 168 | # toggle if this folder should be recursive 169 | backupSet['dirs'][optionSelected - 3]['recurse'] = not backupSet['dirs'][optionSelected - 3]['recurse'] 170 | 171 | return backupSet 172 | 173 | def showMainScreen(self): 174 | exitCondition = "" 175 | customPaths = BackupSetManager() 176 | 177 | # show this every time 178 | self.dialog.ok(utils.getString(30036), utils.getString(30037)) 179 | 180 | while(exitCondition != -1): 181 | # load the custom paths 182 | listItem = xbmcgui.ListItem(utils.getString(30126), '') 183 | listItem.setArt({'icon': os.path.join(utils.addon_dir(), 'resources', 'images', 'plus-icon.png')}) 184 | options = [listItem] 185 | 186 | for index in range(0, len(customPaths.getSets())): 187 | aSet = customPaths.getSet(index) 188 | 189 | listItem = xbmcgui.ListItem(aSet['name'], utils.getString(30121) + ': ' + aSet['set']['root']) 190 | listItem.setArt({'icon': os.path.join(utils.addon_dir(), 'resources', 'images', 'folder-icon.png')}) 191 | options.append(listItem) 192 | 193 | # show the gui 194 | exitCondition = self.dialog.select(utils.getString(30125), options, useDetails=True) 195 | 196 | if(exitCondition >= 0): 197 | if(exitCondition == 0): 198 | newSet = self.createSet() 199 | 200 | # check that the name is unique 201 | if(customPaths.validateSetName(newSet['name'])): 202 | customPaths.addSet(newSet) 203 | else: 204 | self.dialog.ok(utils.getString(30117), utils.getString(30138), newSet['name']) 205 | else: 206 | # bring up a context menu 207 | menuOption = self.dialog.contextmenu([utils.getString(30122), utils.getString(30123)]) 208 | 209 | if(menuOption == 0): 210 | # get the set 211 | aSet = customPaths.getSet(exitCondition - 1) 212 | 213 | # edit the set 214 | updatedSet = self.editSet(aSet['name'], aSet['set']) 215 | 216 | # save it 217 | customPaths.updateSet(aSet['name'], updatedSet) 218 | 219 | elif(menuOption == 1): 220 | if(self.dialog.yesno(heading=utils.getString(30127), message=utils.getString(30128))): 221 | # delete this path - subtract one because of "add" item 222 | customPaths.deleteSet(exitCondition - 1) 223 | 224 | def copySimpleConfig(self): 225 | # disclaimer in case the user hit this on accident 226 | shouldContinue = self.dialog.yesno(heading=utils.getString(30139), message=utils.getString(30140) + "\n" + utils.getString(30141)) 227 | 228 | if(shouldContinue): 229 | source = xbmcvfs.translatePath(os.path.join(utils.addon_dir(), 'resources', 'data', 'default_files.json')) 230 | dest = xbmcvfs.translatePath(os.path.join(utils.data_dir(), 'custom_paths.json')) 231 | 232 | xbmcvfs.copy(source, dest) 233 | -------------------------------------------------------------------------------- /resources/lib/authorizers.py: -------------------------------------------------------------------------------- 1 | import xbmcgui 2 | import xbmcvfs 3 | import json 4 | import pyqrcode 5 | import resources.lib.tinyurl as tinyurl 6 | import resources.lib.utils as utils 7 | from datetime import datetime 8 | 9 | # don't die on import error yet, these might not even get used 10 | try: 11 | from dropbox import dropbox 12 | from dropbox import oauth 13 | except ImportError: 14 | pass 15 | 16 | 17 | class QRCode(xbmcgui.WindowXMLDialog): 18 | def __init__(self, *args, **kwargs): 19 | self.image = kwargs["image"] 20 | self.text = kwargs["text"] 21 | self.url = kwargs['url'] 22 | 23 | def onInit(self): 24 | self.imagecontrol = 501 25 | self.textbox1 = 502 26 | self.textbox2 = 504 27 | self.okbutton = 503 28 | self.showdialog() 29 | 30 | def showdialog(self): 31 | self.getControl(self.imagecontrol).setImage(self.image) 32 | self.getControl(self.textbox1).setText(self.text) 33 | self.getControl(self.textbox2).setText(self.url) 34 | self.setFocus(self.getControl(self.okbutton)) 35 | 36 | def onClick(self, controlId): 37 | if (controlId == self.okbutton): 38 | self.close() 39 | 40 | 41 | class DropboxAuthorizer: 42 | TOKEN_FILE = "tokens.json" 43 | APP_KEY = "" 44 | APP_SECRET = "" 45 | 46 | def __init__(self): 47 | self.APP_KEY = utils.getSettingStringStripped('dropbox_key') 48 | self.APP_SECRET = utils.getSettingStringStripped('dropbox_secret') 49 | 50 | def setup(self): 51 | result = True 52 | 53 | if(self.APP_KEY == '' and self.APP_SECRET == ''): 54 | # we can't go any farther, need these for sure 55 | xbmcgui.Dialog().ok(utils.getString(30010), '%s %s\n%s' % (utils.getString(30027), utils.getString(30058), utils.getString(30059))) 56 | 57 | result = False 58 | 59 | return result 60 | 61 | def isAuthorized(self): 62 | user_token = self._getToken() 63 | 64 | return 'access_token' in user_token 65 | 66 | def authorize(self): 67 | result = True 68 | 69 | if(not self.setup()): 70 | return False 71 | 72 | if(self.isAuthorized()): 73 | # delete the token to start over 74 | self._deleteToken() 75 | 76 | # copied flow from http://dropbox-sdk-python.readthedocs.io/en/latest/moduledoc.html#dropbox.oauth.DropboxOAuth2FlowNoRedirect 77 | flow = oauth.DropboxOAuth2FlowNoRedirect(consumer_key=self.APP_KEY, consumer_secret=self.APP_SECRET, token_access_type="offline") 78 | 79 | url = flow.start() 80 | 81 | # print url in log 82 | utils.log("Authorize URL: " + url) 83 | 84 | # create a QR Code 85 | shortUrl = str(tinyurl.shorten(url), 'utf-8') 86 | imageFile = xbmcvfs.translatePath(utils.data_dir() + '/qrcode.png') 87 | qrIMG = pyqrcode.create(shortUrl) 88 | qrIMG.png(imageFile, scale=10) 89 | 90 | # show the dialog prompt to authorize 91 | qr = QRCode("script-backup-qrcode.xml", utils.addon_dir(), "default", image=imageFile, text=utils.getString(30056), url=shortUrl) 92 | qr.doModal() 93 | 94 | # cleanup 95 | del qr 96 | xbmcvfs.delete(imageFile) 97 | 98 | # get the auth code 99 | code = xbmcgui.Dialog().input(utils.getString(30027) + ' ' + utils.getString(30103)) 100 | 101 | # if user authorized this will work 102 | 103 | try: 104 | user_token = flow.finish(code) 105 | self._setToken(user_token) 106 | except Exception as e: 107 | utils.log("Error: %s" % (e,)) 108 | result = False 109 | 110 | return result 111 | 112 | # return the DropboxClient, or None if can't be created 113 | def getClient(self): 114 | result = None 115 | 116 | user_token = self._getToken() 117 | 118 | if(user_token != ''): 119 | # create the client 120 | result = dropbox.Dropbox(oauth2_access_token=user_token['access_token'], oauth2_refresh_token=user_token['refresh_token'], 121 | oauth2_access_token_expiration=user_token['expiration'], app_key=self.APP_KEY, app_secret=self.APP_SECRET) 122 | try: 123 | result.users_get_current_account() 124 | except: 125 | # this didn't work, delete the token file 126 | self._deleteToken() 127 | result = None 128 | 129 | return result 130 | 131 | def _setToken(self, token): 132 | # write the token files 133 | token_file = open(xbmcvfs.translatePath(utils.data_dir() + self.TOKEN_FILE), 'w') 134 | 135 | token_file.write(json.dumps({"access_token": token.access_token, "refresh_token": token.refresh_token, "expiration": str(token.expires_at)})) 136 | token_file.close() 137 | 138 | def _getToken(self): 139 | result = {} 140 | # get token, if it exists 141 | if(xbmcvfs.exists(xbmcvfs.translatePath(utils.data_dir() + self.TOKEN_FILE))): 142 | token_file = open(xbmcvfs.translatePath(utils.data_dir() + self.TOKEN_FILE)) 143 | token = token_file.read() 144 | 145 | if(token.strip() != ""): 146 | result = json.loads(token) 147 | # convert expiration back to a datetime object 148 | result['expiration'] = datetime.strptime(result['expiration'], "%Y-%m-%d %H:%M:%S.%f") 149 | 150 | token_file.close() 151 | 152 | return result 153 | 154 | def _deleteToken(self): 155 | if(xbmcvfs.exists(xbmcvfs.translatePath(utils.data_dir() + self.TOKEN_FILE))): 156 | xbmcvfs.delete(xbmcvfs.translatePath(utils.data_dir() + self.TOKEN_FILE)) 157 | -------------------------------------------------------------------------------- /resources/lib/croniter.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | import re 5 | from time import time, mktime 6 | from datetime import datetime 7 | from dateutil.relativedelta import relativedelta 8 | 9 | search_re = re.compile(r'^([^-]+)-([^-/]+)(/(.*))?$') 10 | only_int_re = re.compile(r'^\d+$') 11 | any_int_re = re.compile(r'^\d+') 12 | star_or_int_re = re.compile(r'^(\d+|\*)$') 13 | 14 | __all__ = ('croniter',) 15 | 16 | 17 | class croniter(object): 18 | RANGES = ( 19 | (0, 59), 20 | (0, 23), 21 | (1, 31), 22 | (1, 12), 23 | (0, 6), 24 | (0, 59) 25 | ) 26 | DAYS = ( 27 | 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 28 | ) 29 | 30 | ALPHACONV = ( 31 | { }, 32 | { }, 33 | { }, 34 | { 'jan':1, 'feb':2, 'mar':3, 'apr':4, 'may':5, 'jun':6, 35 | 'jul':7, 'aug':8, 'sep':9, 'oct':10, 'nov':11, 'dec':12 }, 36 | { 'sun':0, 'mon':1, 'tue':2, 'wed':3, 'thu':4, 'fri':5, 'sat':6 }, 37 | { } 38 | ) 39 | 40 | LOWMAP = ( 41 | {}, 42 | {}, 43 | {0: 1}, 44 | {0: 1}, 45 | {7: 0}, 46 | {}, 47 | ) 48 | 49 | bad_length = 'Exactly 5 or 6 columns has to be specified for iterator' \ 50 | 'expression.' 51 | 52 | def __init__(self, expr_format, start_time=time()): 53 | if isinstance(start_time, datetime): 54 | start_time = mktime(start_time.timetuple()) 55 | 56 | self.cur = start_time 57 | self.exprs = expr_format.split() 58 | 59 | if len(self.exprs) != 5 and len(self.exprs) != 6: 60 | raise ValueError(self.bad_length) 61 | 62 | expanded = [] 63 | 64 | for i, expr in enumerate(self.exprs): 65 | e_list = expr.split(',') 66 | res = [] 67 | 68 | while len(e_list) > 0: 69 | e = e_list.pop() 70 | t = re.sub(r'^\*(/.+)$', r'%d-%d\1' % (self.RANGES[i][0], 71 | self.RANGES[i][1]), 72 | str(e)) 73 | m = search_re.search(t) 74 | 75 | if m: 76 | (low, high, step) = m.group(1), m.group(2), m.group(4) or 1 77 | 78 | if not any_int_re.search(low): 79 | low = self.ALPHACONV[i][low.lower()] 80 | 81 | if not any_int_re.search(high): 82 | high = self.ALPHACONV[i][high.lower()] 83 | 84 | if (not low or not high or int(low) > int(high) 85 | or not only_int_re.search(str(step))): 86 | raise ValueError("[%s] is not acceptable" %expr_format) 87 | 88 | for j in range(int(low), int(high)+1): 89 | if j % int(step) == 0: 90 | e_list.append(j) 91 | else: 92 | if not star_or_int_re.search(t): 93 | t = self.ALPHACONV[i][t.lower()] 94 | 95 | try: 96 | t = int(t) 97 | except: 98 | pass 99 | 100 | if t in self.LOWMAP[i]: 101 | t = self.LOWMAP[i][t] 102 | 103 | if t != '*' and (int(t) < self.RANGES[i][0] or 104 | int(t) > self.RANGES[i][1]): 105 | raise ValueError("[%s] is not acceptable, out of range" % expr_format) 106 | 107 | res.append(t) 108 | 109 | res.sort() 110 | expanded.append(['*'] if (len(res) == 1 and res[0] == '*') else res) 111 | self.expanded = expanded 112 | 113 | def get_next(self, ret_type=float): 114 | return self._get_next(ret_type, is_prev=False) 115 | 116 | def get_prev(self, ret_type=float): 117 | return self._get_next(ret_type, is_prev=True) 118 | 119 | def _get_next(self, ret_type=float, is_prev=False): 120 | expanded = self.expanded[:] 121 | 122 | if ret_type not in (float, datetime): 123 | raise TypeError("Invalid ret_type, only 'float' or 'datetime' " \ 124 | "is acceptable.") 125 | 126 | if expanded[2][0] != '*' and expanded[4][0] != '*': 127 | bak = expanded[4] 128 | expanded[4] = ['*'] 129 | t1 = self._calc(self.cur, expanded, is_prev) 130 | expanded[4] = bak 131 | expanded[2] = ['*'] 132 | 133 | t2 = self._calc(self.cur, expanded, is_prev) 134 | if not is_prev: 135 | result = t1 if t1 < t2 else t2 136 | else: 137 | result = t1 if t1 > t2 else t2 138 | else: 139 | result = self._calc(self.cur, expanded, is_prev) 140 | self.cur = result 141 | 142 | if ret_type == datetime: 143 | result = datetime.fromtimestamp(result) 144 | return result 145 | 146 | def _calc(self, now, expanded, is_prev): 147 | if is_prev: 148 | nearest_method = self._get_prev_nearest 149 | nearest_diff_method = self._get_prev_nearest_diff 150 | sign = -1 151 | else: 152 | nearest_method = self._get_next_nearest 153 | nearest_diff_method = self._get_next_nearest_diff 154 | sign = 1 155 | 156 | offset = len(expanded) == 6 and 1 or 60 157 | dst = now = datetime.fromtimestamp(now + sign * offset) 158 | 159 | day, month, year = dst.day, dst.month, dst.year 160 | current_year = now.year 161 | DAYS = self.DAYS 162 | 163 | def proc_month(d): 164 | if expanded[3][0] != '*': 165 | diff_month = nearest_diff_method(month, expanded[3], 12) 166 | days = DAYS[month - 1] 167 | if month == 2 and self.is_leap(year) == True: 168 | days += 1 169 | 170 | reset_day = days if is_prev else 1 171 | 172 | if diff_month != None and diff_month != 0: 173 | if is_prev: 174 | d += relativedelta(months=diff_month) 175 | else: 176 | d += relativedelta(months=diff_month, day=reset_day, 177 | hour=0, minute=0, second=0) 178 | return True, d 179 | return False, d 180 | 181 | def proc_day_of_month(d): 182 | if expanded[2][0] != '*': 183 | days = DAYS[month - 1] 184 | if month == 2 and self.is_leap(year) == True: 185 | days += 1 186 | 187 | diff_day = nearest_diff_method(d.day, expanded[2], days) 188 | 189 | if diff_day != None and diff_day != 0: 190 | if is_prev: 191 | d += relativedelta(days=diff_day) 192 | else: 193 | d += relativedelta(days=diff_day, hour=0, minute=0, second=0) 194 | return True, d 195 | return False, d 196 | 197 | def proc_day_of_week(d): 198 | if expanded[4][0] != '*': 199 | diff_day_of_week = nearest_diff_method(d.isoweekday() % 7, expanded[4], 7) 200 | if diff_day_of_week != None and diff_day_of_week != 0: 201 | if is_prev: 202 | d += relativedelta(days=diff_day_of_week) 203 | else: 204 | d += relativedelta(days=diff_day_of_week, hour=0, minute=0, second=0) 205 | return True, d 206 | return False, d 207 | 208 | def proc_hour(d): 209 | if expanded[1][0] != '*': 210 | diff_hour = nearest_diff_method(d.hour, expanded[1], 24) 211 | if diff_hour != None and diff_hour != 0: 212 | if is_prev: 213 | d += relativedelta(hours = diff_hour) 214 | else: 215 | d += relativedelta(hours = diff_hour, minute=0, second=0) 216 | return True, d 217 | return False, d 218 | 219 | def proc_minute(d): 220 | if expanded[0][0] != '*': 221 | diff_min = nearest_diff_method(d.minute, expanded[0], 60) 222 | if diff_min != None and diff_min != 0: 223 | if is_prev: 224 | d += relativedelta(minutes = diff_min) 225 | else: 226 | d += relativedelta(minutes = diff_min, second=0) 227 | return True, d 228 | return False, d 229 | 230 | def proc_second(d): 231 | if len(expanded) == 6: 232 | if expanded[5][0] != '*': 233 | diff_sec = nearest_diff_method(d.second, expanded[5], 60) 234 | if diff_sec != None and diff_sec != 0: 235 | dst += relativedelta(seconds = diff_sec) 236 | return True, d 237 | else: 238 | d += relativedelta(second = 0) 239 | return False, d 240 | 241 | if is_prev: 242 | procs = [proc_second, 243 | proc_minute, 244 | proc_hour, 245 | proc_day_of_week, 246 | proc_day_of_month, 247 | proc_month] 248 | else: 249 | procs = [proc_month, 250 | proc_day_of_month, 251 | proc_day_of_week, 252 | proc_hour, 253 | proc_minute, 254 | proc_second] 255 | 256 | while abs(year - current_year) <= 1: 257 | next = False 258 | for proc in procs: 259 | (changed, dst) = proc(dst) 260 | if changed: 261 | next = True 262 | break 263 | if next: 264 | continue 265 | return mktime(dst.timetuple()) 266 | 267 | raise "failed to find prev date" 268 | 269 | def _get_next_nearest(self, x, to_check): 270 | small = [item for item in to_check if item < x] 271 | large = [item for item in to_check if item >= x] 272 | large.extend(small) 273 | return large[0] 274 | 275 | def _get_prev_nearest(self, x, to_check): 276 | small = [item for item in to_check if item <= x] 277 | large = [item for item in to_check if item > x] 278 | small.reverse() 279 | large.reverse() 280 | small.extend(large) 281 | return small[0] 282 | 283 | def _get_next_nearest_diff(self, x, to_check, range_val): 284 | for i, d in enumerate(to_check): 285 | if d >= x: 286 | return d - x 287 | return to_check[0] - x + range_val 288 | 289 | def _get_prev_nearest_diff(self, x, to_check, range_val): 290 | candidates = to_check[:] 291 | candidates.reverse() 292 | for d in candidates: 293 | if d <= x: 294 | return d - x 295 | return (candidates[0]) - x - range_val 296 | 297 | def is_leap(self, year): 298 | if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0): 299 | return True 300 | else: 301 | return False -------------------------------------------------------------------------------- /resources/lib/extractor.py: -------------------------------------------------------------------------------- 1 | from . import utils as utils 2 | 3 | 4 | class ZipExtractor: 5 | 6 | def extract(self, zipFile, outLoc, progressBar): 7 | utils.log("extracting zip archive") 8 | 9 | result = True # result is true unless we fail 10 | 11 | # update the progress bar 12 | progressBar.updateProgress(0, utils.getString(30100)) 13 | 14 | # list the files 15 | fileCount = float(len(zipFile.listFiles())) 16 | currentFile = 0 17 | 18 | try: 19 | for aFile in zipFile.listFiles(): 20 | # update the progress bar 21 | currentFile += 1 22 | progressBar.updateProgress(int((currentFile / fileCount) * 100), utils.getString(30100)) 23 | 24 | # extract the file 25 | zipFile.extract(aFile, outLoc) 26 | 27 | except Exception: 28 | utils.log("Error extracting file") 29 | result = False 30 | 31 | return result 32 | -------------------------------------------------------------------------------- /resources/lib/guisettings.py: -------------------------------------------------------------------------------- 1 | import json 2 | import xbmc 3 | from . import utils as utils 4 | 5 | 6 | class GuiSettingsManager: 7 | filename = 'kodi_settings.json' 8 | systemSettings = None 9 | 10 | def __init__(self): 11 | # get all of the current Kodi settings 12 | json_response = json.loads(xbmc.executeJSONRPC('{"jsonrpc":"2.0", "id":1, "method":"Settings.GetSettings","params":{"level":"expert"}}')) 13 | 14 | self.systemSettings = json_response['result']['settings'] 15 | 16 | def list_addons(self): 17 | # list all currently installed addons 18 | addons = json.loads(xbmc.executeJSONRPC('{"jsonrpc":"2.0", "method":"Addons.GetAddons", "params":{"properties":["version","author"]}, "id":2}')) 19 | 20 | return addons['result']['addons'] 21 | 22 | def backup(self): 23 | utils.log('Backing up Kodi settings') 24 | 25 | # return all current settings 26 | return self.systemSettings 27 | 28 | def restore(self, restoreSettings): 29 | utils.log('Restoring Kodi settings') 30 | 31 | updateJson = {"jsonrpc": "2.0", "id": 1, "method": "Settings.SetSettingValue", "params": {"setting": "", "value": ""}} 32 | 33 | # create a setting=value dict of the current settings 34 | settingsDict = {} 35 | for aSetting in self.systemSettings: 36 | # ignore action types, no value 37 | if(aSetting['type'] != 'action'): 38 | settingsDict[aSetting['id']] = aSetting['value'] 39 | 40 | restoreCount = 0 41 | for aSetting in restoreSettings: 42 | # Ensure key exists before referencing 43 | if(aSetting['id'] in settingsDict.values()): 44 | # only update a setting if its different than the current (action types have no value) 45 | if(aSetting['type'] != 'action' and settingsDict[aSetting['id']] != aSetting['value']): 46 | if(utils.getSettingBool('verbose_logging')): 47 | utils.log('%s different than current: %s' % (aSetting['id'], str(aSetting['value']))) 48 | 49 | updateJson['params']['setting'] = aSetting['id'] 50 | updateJson['params']['value'] = aSetting['value'] 51 | 52 | xbmc.executeJSONRPC(json.dumps(updateJson)) 53 | restoreCount = restoreCount + 1 54 | 55 | utils.log('Update %d settings' % restoreCount) 56 | -------------------------------------------------------------------------------- /resources/lib/progressbar.py: -------------------------------------------------------------------------------- 1 | import xbmcgui 2 | from . import utils as utils 3 | 4 | 5 | class BackupProgressBar: 6 | NONE = 2 7 | DIALOG = 0 8 | BACKGROUND = 1 9 | 10 | mode = 2 11 | progressBar = None 12 | override = False 13 | 14 | def __init__(self, progressOverride): 15 | self.override = progressOverride 16 | 17 | # check if we should use the progress bar 18 | if(utils.getSettingInt('progress_mode') != 2): 19 | # check if background or normal 20 | if(utils.getSettingInt('progress_mode') == 0 and not self.override): 21 | self.mode = self.DIALOG 22 | self.progressBar = xbmcgui.DialogProgress() 23 | else: 24 | self.mode = self.BACKGROUND 25 | self.progressBar = xbmcgui.DialogProgressBG() 26 | 27 | def create(self, heading, message): 28 | if(self.mode != self.NONE): 29 | self.progressBar.create(heading, message) 30 | 31 | def updateProgress(self, percent, message=None): 32 | 33 | # update the progress bar 34 | if(self.mode != self.NONE): 35 | if(message is not None): 36 | # need different calls for dialog and background bars 37 | if(self.mode == self.DIALOG): 38 | self.progressBar.update(percent, message) 39 | else: 40 | self.progressBar.update(percent, message=message) 41 | else: 42 | self.progressBar.update(percent) 43 | 44 | def checkCancel(self): 45 | result = False 46 | 47 | if(self.mode == self.DIALOG): 48 | result = self.progressBar.iscanceled() 49 | 50 | return result 51 | 52 | def close(self): 53 | if(self.mode != self.NONE): 54 | self.progressBar.close() 55 | -------------------------------------------------------------------------------- /resources/lib/scheduler.py: -------------------------------------------------------------------------------- 1 | import time 2 | from datetime import datetime 3 | import xbmc 4 | import xbmcvfs 5 | import xbmcgui 6 | from . import utils as utils 7 | from resources.lib.croniter import croniter 8 | from resources.lib.backup import XbmcBackup 9 | 10 | UPGRADE_INT = 2 # to keep track of any upgrade notifications 11 | 12 | 13 | class BackupScheduler: 14 | monitor = None 15 | enabled = False 16 | next_run = 0 17 | next_run_path = None 18 | restore_point = None 19 | 20 | def __init__(self): 21 | self.monitor = UpdateMonitor(update_method=self.settingsChanged) 22 | self.enabled = utils.getSettingBool("enable_scheduler") 23 | self.next_run_path = xbmcvfs.translatePath(utils.data_dir()) + 'next_run.txt' 24 | 25 | # display upgrade messages if they exist 26 | if(utils.getSettingInt('upgrade_notes') < UPGRADE_INT): 27 | xbmcgui.Dialog().ok(utils.getString(30010), utils.getString(30132)) 28 | utils.setSetting('upgrade_notes', str(UPGRADE_INT)) 29 | 30 | # check if a backup should be resumed 31 | resumeRestore = self._resumeCheck() 32 | 33 | if(resumeRestore): 34 | restore = XbmcBackup() 35 | restore.selectRestore(self.restore_point) 36 | # skip the advanced settings check 37 | restore.skipAdvanced() 38 | restore.restore() 39 | 40 | if(self.enabled): 41 | 42 | # sleep for 2 minutes so Kodi can start and time can update correctly 43 | xbmc.Monitor().waitForAbort(120) 44 | 45 | nr = 0 46 | if(xbmcvfs.exists(self.next_run_path)): 47 | 48 | with xbmcvfs.File(self.next_run_path) as fh: 49 | try: 50 | # check if we saved a run time from the last run 51 | nr = float(fh.read()) 52 | except ValueError: 53 | nr = 0 54 | 55 | # if we missed and the user wants to play catch-up 56 | if(0 < nr <= time.time() and utils.getSettingBool('schedule_miss')): 57 | utils.log("scheduled backup was missed, doing it now...") 58 | progress_mode = utils.getSettingInt('progress_mode') 59 | 60 | if(progress_mode == 0): 61 | progress_mode = 1 # Kodi just started, don't block it with a foreground progress bar 62 | 63 | self.doScheduledBackup(progress_mode) 64 | 65 | self.setup() 66 | 67 | def setup(self): 68 | # scheduler was turned on, find next run time 69 | utils.log("scheduler enabled, finding next run time") 70 | self.findNextRun(time.time()) 71 | 72 | def start(self): 73 | 74 | while(not self.monitor.abortRequested()): 75 | 76 | if(self.enabled): 77 | # scheduler is still on 78 | now = time.time() 79 | 80 | if(self.next_run <= now): 81 | progress_mode = utils.getSettingInt('progress_mode') 82 | self.doScheduledBackup(progress_mode) 83 | 84 | # check if we should shut the computer down 85 | if(utils.getSettingBool("cron_shutdown")): 86 | # wait 10 seconds to make sure all backup processes and files are completed 87 | time.sleep(10) 88 | xbmc.executebuiltin('ShutDown()') 89 | else: 90 | # find the next run time like normal 91 | self.findNextRun(now) 92 | 93 | xbmc.sleep(500) 94 | 95 | # delete monitor to free up memory 96 | del self.monitor 97 | 98 | def doScheduledBackup(self, progress_mode): 99 | if(progress_mode != 2): 100 | utils.showNotification(utils.getString(30053)) 101 | 102 | backup = XbmcBackup() 103 | 104 | if(backup.remoteConfigured()): 105 | 106 | if(utils.getSettingInt('progress_mode') in [0, 1]): 107 | backup.backup(True) 108 | else: 109 | backup.backup(False) 110 | 111 | # check if this is a "one-off" 112 | if(utils.getSettingInt("schedule_interval") == 0): 113 | # disable the scheduler after this run 114 | self.enabled = False 115 | utils.setSetting('enable_scheduler', 'false') 116 | else: 117 | utils.showNotification(utils.getString(30045)) 118 | 119 | def findNextRun(self, now): 120 | progress_mode = utils.getSettingInt('progress_mode') 121 | 122 | # find the cron expression and get the next run time 123 | cron_exp = self.parseSchedule() 124 | 125 | cron_ob = croniter(cron_exp, datetime.fromtimestamp(now)) 126 | new_run_time = cron_ob.get_next(float) 127 | 128 | if(new_run_time != self.next_run): 129 | self.next_run = new_run_time 130 | utils.log("scheduler will run again on " + utils.getRegionalTimestamp(datetime.fromtimestamp(self.next_run), ['dateshort', 'time'])) 131 | 132 | # write the next time to a file 133 | with xbmcvfs.File(self.next_run_path, 'w') as fh: 134 | fh.write(str(self.next_run)) 135 | 136 | # only show when not in silent mode 137 | if(progress_mode != 2): 138 | utils.showNotification(utils.getString(30081) + " " + utils.getRegionalTimestamp(datetime.fromtimestamp(self.next_run), ['dateshort', 'time'])) 139 | 140 | def settingsChanged(self): 141 | current_enabled = utils.getSettingBool("enable_scheduler") 142 | 143 | if(current_enabled and not self.enabled): 144 | # scheduler was just turned on 145 | self.enabled = current_enabled 146 | self.setup() 147 | elif (not current_enabled and self.enabled): 148 | # schedule was turn off 149 | self.enabled = current_enabled 150 | 151 | if(self.enabled): 152 | # always recheck the next run time after an update 153 | self.findNextRun(time.time()) 154 | 155 | def parseSchedule(self): 156 | schedule_type = utils.getSettingInt("schedule_interval") 157 | cron_exp = utils.getSetting("cron_schedule") 158 | 159 | hour_of_day = utils.getSetting("schedule_time") 160 | hour_of_day = int(hour_of_day[0:2]) 161 | if(schedule_type == 0 or schedule_type == 1): 162 | # every day 163 | cron_exp = "0 " + str(hour_of_day) + " * * *" 164 | elif(schedule_type == 2): 165 | # once a week 166 | day_of_week = utils.getSetting("day_of_week") 167 | cron_exp = "0 " + str(hour_of_day) + " * * " + day_of_week 168 | elif(schedule_type == 3): 169 | # first day of month 170 | cron_exp = "0 " + str(hour_of_day) + " 1 * *" 171 | 172 | return cron_exp 173 | 174 | def _resumeCheck(self): 175 | shouldContinue = False 176 | if(xbmcvfs.exists(xbmcvfs.translatePath(utils.data_dir() + "resume.txt"))): 177 | rFile = xbmcvfs.File(xbmcvfs.translatePath(utils.data_dir() + "resume.txt"), 'r') 178 | self.restore_point = rFile.read() 179 | rFile.close() 180 | xbmcvfs.delete(xbmcvfs.translatePath(utils.data_dir() + "resume.txt")) 181 | shouldContinue = xbmcgui.Dialog().yesno(utils.getString(30042), "%s\n%s" % (utils.getString(30043), utils.getString(30044))) 182 | 183 | return shouldContinue 184 | 185 | 186 | class UpdateMonitor(xbmc.Monitor): 187 | update_method = None 188 | 189 | def __init__(self, *args, **kwargs): 190 | xbmc.Monitor.__init__(self) 191 | self.update_method = kwargs['update_method'] 192 | 193 | def onSettingsChanged(self): 194 | self.update_method() 195 | -------------------------------------------------------------------------------- /resources/lib/tinyurl.py: -------------------------------------------------------------------------------- 1 | # this is duplicated in snipppets of code from all over the web, credit to no one 2 | # in particular - to all those that have gone before me! 3 | from future.moves.urllib.request import urlopen 4 | 5 | 6 | def shorten(aUrl): 7 | tinyurl = 'http://tinyurl.com/api-create.php?url=' 8 | req = urlopen(tinyurl + aUrl) 9 | data = req.read() 10 | 11 | # should be a tiny url 12 | return data 13 | -------------------------------------------------------------------------------- /resources/lib/utils.py: -------------------------------------------------------------------------------- 1 | import xbmc 2 | import xbmcgui 3 | import xbmcaddon 4 | import xbmcvfs 5 | 6 | __addon_id__ = 'script.xbmcbackup' 7 | __Addon = xbmcaddon.Addon(__addon_id__) 8 | 9 | 10 | def data_dir(): 11 | return __Addon.getAddonInfo('profile') 12 | 13 | 14 | def addon_dir(): 15 | return __Addon.getAddonInfo('path') 16 | 17 | 18 | def openSettings(): 19 | __Addon.openSettings() 20 | 21 | 22 | def log(message, loglevel=xbmc.LOGDEBUG): 23 | xbmc.log(__addon_id__ + "-" + __Addon.getAddonInfo('version') + ": " + message, level=loglevel) 24 | 25 | 26 | def showNotification(message): 27 | xbmcgui.Dialog().notification(getString(30010), message, time=4000, icon=xbmcvfs.translatePath(__Addon.getAddonInfo('path') + "/resources/images/icon.png")) 28 | 29 | 30 | def getSetting(name): 31 | return __Addon.getSetting(name) 32 | 33 | def getSettingStringStripped(name): 34 | return __Addon.getSettingString(name).strip() 35 | 36 | def getSettingBool(name): 37 | return bool(__Addon.getSettingBool(name)) 38 | 39 | 40 | def getSettingInt(name): 41 | return __Addon.getSettingInt(name) 42 | 43 | 44 | def setSetting(name, value): 45 | __Addon.setSetting(name, value) 46 | 47 | 48 | def getString(string_id): 49 | return __Addon.getLocalizedString(string_id) 50 | 51 | 52 | def getRegionalTimestamp(date_time, dateformat=['dateshort']): 53 | result = '' 54 | 55 | for aFormat in dateformat: 56 | result = result + ("%s " % date_time.strftime(xbmc.getRegion(aFormat))) 57 | 58 | return result.strip() 59 | 60 | 61 | def diskString(fSize): 62 | # convert a size in kilobytes to the best possible match and return as a string 63 | fSize = float(fSize) 64 | i = 0 65 | sizeNames = ['KB', 'MB', 'GB', 'TB'] 66 | 67 | while(fSize > 1024): 68 | fSize = fSize / 1024 69 | i = i + 1 70 | 71 | return "%0.2f%s" % (fSize, sizeNames[i]) 72 | -------------------------------------------------------------------------------- /resources/lib/vfs.py: -------------------------------------------------------------------------------- 1 | from __future__ import unicode_literals 2 | import zipfile 3 | import os.path 4 | import sys 5 | import xbmcvfs 6 | import xbmcgui 7 | from dropbox import dropbox 8 | from . import utils as utils 9 | from dropbox.files import WriteMode, CommitInfo, UploadSessionCursor 10 | from . authorizers import DropboxAuthorizer 11 | 12 | 13 | class Vfs: 14 | root_path = None 15 | 16 | def __init__(self, rootString): 17 | self.set_root(rootString) 18 | 19 | def clean_path(self, path): 20 | # fix slashes 21 | path = path.replace("\\", "/") 22 | 23 | # check if trailing slash is included 24 | if(path[-1:] != '/'): 25 | path = path + '/' 26 | 27 | return path 28 | 29 | def set_root(self, rootString): 30 | old_root = self.root_path 31 | self.root_path = self.clean_path(rootString) 32 | 33 | # return the old root 34 | return old_root 35 | 36 | def listdir(self, directory): 37 | return {} 38 | 39 | def mkdir(self, directory): 40 | return True 41 | 42 | def put(self, source, dest): 43 | return True 44 | 45 | def rmdir(self, directory): 46 | return True 47 | 48 | def rmfile(self, aFile): 49 | return True 50 | 51 | def exists(self, aFile): 52 | return True 53 | 54 | def rename(self, aFile, newName): 55 | return True 56 | 57 | def cleanup(self): 58 | return True 59 | 60 | def fileSize(self, filename): 61 | return 0 # result should be in KB 62 | 63 | 64 | class XBMCFileSystem(Vfs): 65 | 66 | def listdir(self, directory): 67 | return xbmcvfs.listdir(directory) 68 | 69 | def mkdir(self, directory): 70 | return xbmcvfs.mkdir(xbmcvfs.translatePath(directory)) 71 | 72 | def put(self, source, dest): 73 | return xbmcvfs.copy(xbmcvfs.translatePath(source), xbmcvfs.translatePath(dest)) 74 | 75 | def rmdir(self, directory): 76 | return xbmcvfs.rmdir(directory, force=True) # use force=True to make sure it works recursively 77 | 78 | def rmfile(self, aFile): 79 | return xbmcvfs.delete(aFile) 80 | 81 | def rename(self, aFile, newName): 82 | return xbmcvfs.rename(aFile, newName) 83 | 84 | def exists(self, aFile): 85 | return xbmcvfs.exists(aFile) 86 | 87 | def fileSize(self, filename): 88 | with xbmcvfs.File(filename) as f: 89 | result = f.size() / 1024 # bytes to kilobytes 90 | 91 | return result 92 | 93 | 94 | class ZipFileSystem(Vfs): 95 | zip = None 96 | 97 | def __init__(self, rootString, mode): 98 | self.root_path = "" 99 | self.zip = zipfile.ZipFile(rootString, mode=mode, compression=zipfile.ZIP_DEFLATED, allowZip64=True) 100 | 101 | def listdir(self, directory): 102 | return [[], []] 103 | 104 | def mkdir(self, directory): 105 | # self.zip.write(directory[len(self.root_path):]) 106 | return False 107 | 108 | def put(self, source, dest): 109 | 110 | aFile = xbmcvfs.File(xbmcvfs.translatePath(source), 'r') 111 | 112 | self.zip.writestr(dest, aFile.readBytes()) 113 | 114 | return True 115 | 116 | def rmdir(self, directory): 117 | return False 118 | 119 | def exists(self, aFile): 120 | return False 121 | 122 | def cleanup(self): 123 | self.zip.close() 124 | 125 | def extract(self, aFile, path): 126 | # extract zip file to path 127 | self.zip.extract(aFile, path) 128 | 129 | def listFiles(self): 130 | return self.zip.infolist() 131 | 132 | 133 | class DropboxFileSystem(Vfs): 134 | MAX_CHUNK = 50 * 1000 * 1000 # dropbox uses 150, reduced to 50 for small mem systems 135 | client = None 136 | APP_KEY = '' 137 | APP_SECRET = '' 138 | 139 | def __init__(self, rootString): 140 | self.set_root(rootString) 141 | 142 | authorizer = DropboxAuthorizer() 143 | 144 | if(authorizer.isAuthorized()): 145 | self.client = authorizer.getClient() 146 | else: 147 | # tell the user to go back and run the authorizer 148 | xbmcgui.Dialog().ok(utils.getString(30010), utils.getString(30105)) 149 | sys.exit() 150 | 151 | def listdir(self, directory): 152 | directory = self._fix_slashes(directory) 153 | 154 | if(self.client is not None and self.exists(directory)): 155 | files = [] 156 | dirs = [] 157 | metadata = self.client.files_list_folder(directory) 158 | 159 | for aFile in metadata.entries: 160 | if(isinstance(aFile, dropbox.files.FolderMetadata)): 161 | dirs.append(aFile.name) 162 | else: 163 | files.append(aFile.name) 164 | 165 | return [dirs, files] 166 | else: 167 | return [[], []] 168 | 169 | def mkdir(self, directory): 170 | directory = self._fix_slashes(directory) 171 | if(self.client is not None): 172 | # sort of odd but always return true, folder create is implicit with file upload 173 | return True 174 | else: 175 | return False 176 | 177 | def rmdir(self, directory): 178 | directory = self._fix_slashes(directory) 179 | if(self.client is not None and self.exists(directory)): 180 | # dropbox is stupid and will refuse to do this sometimes, need to delete recursively 181 | dirs, files = self.listdir(directory) 182 | 183 | for aDir in dirs: 184 | self.rmdir(aDir) 185 | 186 | # finally remove the root directory 187 | self.client.files_delete(directory) 188 | 189 | return True 190 | else: 191 | return False 192 | 193 | def rmfile(self, aFile): 194 | aFile = self._fix_slashes(aFile) 195 | 196 | if(self.client is not None and self.exists(aFile)): 197 | self.client.files_delete(aFile) 198 | return True 199 | else: 200 | return False 201 | 202 | def exists(self, aFile): 203 | aFile = self._fix_slashes(aFile) 204 | 205 | if(self.client is not None): 206 | # can't list root metadata 207 | if(aFile == ''): 208 | return True 209 | 210 | try: 211 | self.client.files_get_metadata(aFile) 212 | # if we make it here the file does exist 213 | return True 214 | except: 215 | return False 216 | else: 217 | return False 218 | 219 | def put(self, source, dest, retry=True): 220 | dest = self._fix_slashes(dest) 221 | 222 | if(self.client is not None): 223 | # open the file and get its size 224 | f = open(source, 'rb') 225 | f_size = os.path.getsize(source) 226 | 227 | try: 228 | if(f_size < self.MAX_CHUNK): 229 | # use the regular upload 230 | self.client.files_upload(f.read(), dest, mode=WriteMode('overwrite')) 231 | else: 232 | # start the upload session 233 | upload_session = self.client.files_upload_session_start(f.read(self.MAX_CHUNK)) 234 | upload_cursor = UploadSessionCursor(upload_session.session_id, f.tell()) 235 | 236 | while(f.tell() < f_size): 237 | # check if we should finish the upload 238 | if((f_size - f.tell()) <= self.MAX_CHUNK): 239 | # upload and close 240 | self.client.files_upload_session_finish(f.read(self.MAX_CHUNK), upload_cursor, CommitInfo(dest, mode=WriteMode('overwrite'))) 241 | else: 242 | # upload a part and store the offset 243 | self.client.files_upload_session_append_v2(f.read(self.MAX_CHUNK), upload_cursor) 244 | upload_cursor.offset = f.tell() 245 | 246 | # if no errors we're good! 247 | return True 248 | except Exception as anError: 249 | utils.log(str(anError)) 250 | 251 | # if we have an exception retry 252 | if(retry): 253 | return self.put(source, dest, False) 254 | else: 255 | # tried once already, just quit 256 | return False 257 | else: 258 | return False 259 | 260 | def fileSize(self, filename): 261 | result = 0 262 | aFile = self._fix_slashes(filename) 263 | 264 | if(self.client is not None): 265 | metadata = self.client.files_get_metadata(aFile) 266 | result = metadata.size / 1024 # bytes to KB 267 | 268 | return result 269 | 270 | def get_file(self, source, dest): 271 | if(self.client is not None): 272 | # write the file locally 273 | self.client.files_download_to_file(dest, source) 274 | return True 275 | else: 276 | return False 277 | 278 | def _fix_slashes(self, filename): 279 | result = filename.replace('\\', '/') 280 | 281 | # root needs to be a blank string 282 | if(result == '/'): 283 | result = "" 284 | 285 | # if dir ends in slash, remove it 286 | if(result[-1:] == "/"): 287 | result = result[:-1] 288 | 289 | return result 290 | -------------------------------------------------------------------------------- /resources/skins/default/1080i/script-backup-qrcode.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 502 5 | 345 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -1920 18 | -1080 19 | 5760 20 | 3240 21 | WindowOpen 22 | WindowClose 23 | background-black.png 24 | 25 | 26 | 0 27 | 0 28 | 915 29 | 450 30 | dialog-bg.png 31 | 32 | 33 | 0 34 | 20 35 | 915 36 | 300 37 | font12_title 38 | center 39 | top 40 | FF000000 41 | 42 | 43 | 0 44 | 60 45 | 915 46 | 300 47 | font12_title 48 | center 49 | top 50 | FF000000 51 | 52 | 53 | 300 54 | 80 55 | 300 56 | 300 57 | keep 58 | 59 | 60 | 302 61 | 350 62 | 300 63 | 90 64 | font12_title 65 | FFF0F0F0 66 | 20 67 | 68 | center 69 | center 70 | dialogbutton-fo.png 71 | dialogbutton-nofo.png 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /resources/skins/default/media/background-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/skins/default/media/background-black.png -------------------------------------------------------------------------------- /resources/skins/default/media/dialog-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/skins/default/media/dialog-bg.png -------------------------------------------------------------------------------- /resources/skins/default/media/dialogbutton-fo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/skins/default/media/dialogbutton-fo.png -------------------------------------------------------------------------------- /resources/skins/default/media/dialogbutton-nofo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/robweber/xbmcbackup/1559df4d4c72547424a5d2b8dbfe7fc09c2d17c5/resources/skins/default/media/dialogbutton-nofo.png -------------------------------------------------------------------------------- /service.py: -------------------------------------------------------------------------------- 1 | from resources.lib.scheduler import BackupScheduler 2 | 3 | # start the backup scheduler 4 | BackupScheduler().start() 5 | --------------------------------------------------------------------------------