├── README.md └── android-resources-export.gs /README.md: -------------------------------------------------------------------------------- 1 | # Android iOS Drive Export 2 | 3 | This script aims to help you to manage your strings resources for Android & iOS. 4 | 5 | ##How it works? 6 | 7 | 1. Create a spreadsheet on Google Drive with this model: 8 | https://docs.google.com/spreadsheets/d/1H3QRgSZC_27smVWyLGmQlqPwcvyXOO24Sth3-97jkHc 9 | 2. Go to Tools => Script Editor and paste the script. 10 | 3. Run the method "exportResources". 11 | 12 | The script will generate the next folders & files: 13 | ``` 14 | My Drive 15 | /Export 16 | /App Name 17 | /Android 18 | /values-en 19 | /strings.xml 20 | /values-fr 21 | /strings.xml 22 | ... 23 | /iOS 24 | /Localizable_EN.strings 25 | /Localizable_FR.strings 26 | ... 27 | ``` 28 | 29 | -------------------------------------------------------------------------------- /android-resources-export.gs: -------------------------------------------------------------------------------- 1 | var appName = "appName"; 2 | 3 | // Export resources function 4 | function exportResources() { 5 | 6 | // Folders 7 | // Data are exported here => My Drive/Export/$appName/... 8 | var parentFolder = DriveApp.getFolderById(DriveApp.getRootFolder().getId()); 9 | var exportFolder = createOrGetFolder("Export", parentFolder); 10 | var appExportFolder = createOrGetFolder(appName, exportFolder); 11 | var androidFolder = createOrGetFolder("Android", appExportFolder); 12 | var iOSFolder = createOrGetFolder("iOS", appExportFolder); 13 | 14 | // Data 15 | var sheet = SpreadsheetApp.getActiveSheet(); 16 | var data = sheet.getDataRange().getValues(); 17 | 18 | var i = 2; 19 | while (data[1][i] != null && data[1][i].length > 0) { 20 | 21 | var results = data[1][i].match(/\((\w\w)\)/g); 22 | if (results.length > 0) { 23 | var language = results[0].replace("(", "").replace(")", ""); 24 | createAndroidResources(language, data, androidFolder, i); 25 | createIOSResources(language, data, iOSFolder, i); 26 | } 27 | 28 | i++; 29 | } 30 | 31 | } 32 | 33 | function getThisScriptInDrive() { 34 | return DriveApp.getFileById("some unique string that wont be anywhere else / bZjxcps4UfBZfnc.E")[0]; 35 | } 36 | 37 | // Create an XML file for Android 38 | // language: Current language 39 | // data: Spreadsheet data array 40 | // folder: Folder where create the file 41 | // column: Index of the column 42 | function createAndroidResources(language, data, folder, column) { 43 | 44 | var folderName = "values-" + language; 45 | var languageFolder = createOrGetFolder(folderName, folder); 46 | 47 | var content = ""; 48 | 49 | for (var i = 3; i < data.length; i++) { 50 | 51 | if (data[i][1].length == 0) { 52 | continue; 53 | } 54 | 55 | if (data[i][0].length > 0) { 56 | content += "\n\n\t"; 57 | } 58 | 59 | var formatted = ""; 60 | if (data[i][2].indexOf("%s") > -1 || data[i][2].indexOf("%d") > -1) { 61 | formatted = ' formatted="false"'; 62 | } 63 | 64 | var escapedContent = data[i][column] 65 | .replace("&", "&") 66 | .replace(new RegExp("\'", 'g'), "\\'") 67 | .replace(new RegExp("\\.\\.\\.", 'g'), "…"); 68 | 69 | content += '\n\t' + escapedContent + ''; 70 | } 71 | 72 | content += "\n\n"; 73 | 74 | var file = createOrGetFile("strings.xml", languageFolder); 75 | file.setContent(content); 76 | } 77 | 78 | // Create a localizable file for iOS 79 | // language: Current language 80 | // data: Spreadsheet data array 81 | // folder: Folder where create the file 82 | // column: Index of the column 83 | function createIOSResources(language, data, folder, column) { 84 | 85 | var content = "// App"; 86 | 87 | for (var i = 3; i < data.length; i++) { 88 | 89 | if (data[i][1].length == 0) { 90 | continue; 91 | } 92 | 93 | if (data[i][0].length > 0) { 94 | content += "\n\n// " + data[i][0] + ""; 95 | } 96 | 97 | var value = data[i][column]; 98 | value = value.replace(/%s/g, "%@"); 99 | value = value.replace(/"/g, '\\"'); 100 | value = value.replace(/(?:\r\n|\r|\n)/g, '\\n'); 101 | 102 | content += '\n"' + data[i][1] + '" = "' + value + '";'; 103 | } 104 | 105 | var fileName = "Localizable_" + language.toUpperCase() + ".strings"; 106 | var file = createOrGetFile(fileName, folder); 107 | file.setContent(content); 108 | } 109 | 110 | 111 | 112 | //////////// 113 | // HELPER // 114 | //////////// 115 | 116 | // Check folder 117 | function createOrGetFolder(name, folder) { 118 | var folders; 119 | if (folder == undefined) { 120 | folders = DriveApp.getFoldersByName(name) 121 | } else { 122 | folders = folder.getFoldersByName(name) 123 | } 124 | 125 | var mainFolder; 126 | if (folders.hasNext()) { 127 | mainFolder = folders.next(); 128 | } else { 129 | if (folder == undefined) { 130 | mainFolder = DriveApp.createFolder(name); 131 | } else { 132 | mainFolder = folder.createFolder(name); 133 | } 134 | } 135 | 136 | return mainFolder; 137 | } 138 | 139 | 140 | // Check file 141 | function createOrGetFile(name, folder) { 142 | var files; 143 | if (folder == undefined) { 144 | files = DriveApp.getFilesByName(name) 145 | } else { 146 | files = folder.getFilesByName(name) 147 | } 148 | 149 | var file; 150 | if (files.hasNext()) { 151 | file = files.next(); 152 | } else { 153 | if (folder == undefined) { 154 | file = DriveApp.createFile(name, ""); 155 | } else { 156 | file = folder.createFile(name, ""); 157 | } 158 | } 159 | 160 | return file; 161 | } 162 | --------------------------------------------------------------------------------