|
| 1 | +#!/usr/bin/env swift |
| 2 | + |
| 3 | +import Foundation |
| 4 | + |
| 5 | +let glotPressSubtitleKey = "app_store_subtitle" |
| 6 | +let glotPressWhatsNewKey = "v1.0-whats-new" |
| 7 | +let glotPressDescriptionKey = "app_store_desc" |
| 8 | +let glotPressKeywordsKey = "app_store_keywords" |
| 9 | +let baseFolder = "./metadata" |
| 10 | + |
| 11 | +// iTunes Connect language code: GlotPress code |
| 12 | +let languages = [ |
| 13 | + "de-DE": "de", |
| 14 | + "default": "en-us", // Technically not a real GlotPress language |
| 15 | + "en-US": "en-us", // Technically not a real GlotPress language |
| 16 | + "es-ES": "es", |
| 17 | + "fr-FR": "fr", |
| 18 | + "id": "id", |
| 19 | + "it": "it", |
| 20 | + "ja": "ja", |
| 21 | + "ko": "ko", |
| 22 | + "nl-NL": "nl", |
| 23 | + "pt-BR": "pt-br", |
| 24 | + "ru": "ru", |
| 25 | + "sv": "sv", |
| 26 | + "tr": "tr", |
| 27 | + "zh-Hans": "zh-cn", |
| 28 | + "zh-Hant": "zh-tw", |
| 29 | +] |
| 30 | + |
| 31 | +func downloadTranslation(languageCode: String, folderName: String) { |
| 32 | + let languageCodeOverride = languageCode == "en-us" ? "es" : languageCode |
| 33 | + let glotPressURL = "https://translate.wordpress.com/projects/woocommerce/woocommerce-ios/release-notes/\(languageCodeOverride)/default/export-translations?format=json" |
| 34 | + let requestURL: URL = URL(string: glotPressURL)! |
| 35 | + let urlRequest: URLRequest = URLRequest(url: requestURL) |
| 36 | + let session = URLSession.shared |
| 37 | + |
| 38 | + let sema = DispatchSemaphore( value: 0) |
| 39 | + |
| 40 | + print("Downloading Language: \(languageCode)") |
| 41 | + |
| 42 | + let task = session.dataTask(with: urlRequest) { |
| 43 | + (data, response, error) -> Void in |
| 44 | + |
| 45 | + defer { |
| 46 | + sema.signal() |
| 47 | + } |
| 48 | + |
| 49 | + guard let data = data else { |
| 50 | + print(" Invalid data downloaded.") |
| 51 | + return |
| 52 | + } |
| 53 | + |
| 54 | + guard let json = try? JSONSerialization.jsonObject(with: data, options: []), |
| 55 | + let jsonDict = json as? [String: Any] else { |
| 56 | + print(" JSON was not returned") |
| 57 | + return |
| 58 | + } |
| 59 | + |
| 60 | + var subtitle: String? |
| 61 | + var whatsNew: String? |
| 62 | + var keywords: String? |
| 63 | + var storeDescription: String? |
| 64 | + |
| 65 | + jsonDict.forEach({ (key: String, value: Any) in |
| 66 | + |
| 67 | + guard let index = key.index(of: Character(UnicodeScalar(0004))) else { |
| 68 | + return |
| 69 | + } |
| 70 | + |
| 71 | + let keyFirstPart = String(key[..<index]) |
| 72 | + |
| 73 | + guard let value = value as? [String], |
| 74 | + let firstValue = value.first else { |
| 75 | + print(" No translation for \(keyFirstPart)") |
| 76 | + return |
| 77 | + } |
| 78 | + |
| 79 | + var originalLanguage = String(key[index...]) |
| 80 | + originalLanguage.remove(at: originalLanguage.startIndex) |
| 81 | + let translation = languageCode == "en-us" ? originalLanguage : firstValue |
| 82 | + |
| 83 | + switch keyFirstPart { |
| 84 | + case glotPressSubtitleKey: |
| 85 | + subtitle = translation |
| 86 | + case glotPressKeywordsKey: |
| 87 | + keywords = translation |
| 88 | + case glotPressWhatsNewKey: |
| 89 | + whatsNew = translation |
| 90 | + case glotPressDescriptionKey: |
| 91 | + storeDescription = translation |
| 92 | + default: |
| 93 | + print(" Unknown key: \(keyFirstPart)") |
| 94 | + } |
| 95 | + }) |
| 96 | + |
| 97 | + let languageFolder = "\(baseFolder)/\(folderName)" |
| 98 | + |
| 99 | + let fileManager = FileManager.default |
| 100 | + try? fileManager.createDirectory(atPath: languageFolder, withIntermediateDirectories: true, attributes: nil) |
| 101 | + |
| 102 | + /// This sort of hack-ey – we're not actually downloading anything here, but the idea is |
| 103 | + /// to keep all of the metadata generation code in the same place. By keeping this in the |
| 104 | + /// same file, it should be easier to find, and update if necessary. |
| 105 | + let marketingURL = "https://woocommerce.com/mobile/" |
| 106 | + |
| 107 | + do { |
| 108 | + try subtitle?.write(toFile: "\(languageFolder)/subtitle.txt", atomically: true, encoding: .utf8) |
| 109 | + try whatsNew?.write(toFile: "\(languageFolder)/release_notes.txt", atomically: true, encoding: .utf8) |
| 110 | + try keywords?.write(toFile: "\(languageFolder)/keywords.txt", atomically: true, encoding: .utf8) |
| 111 | + try storeDescription?.write(toFile: "\(languageFolder)/description.txt", atomically: true, encoding: .utf8) |
| 112 | + |
| 113 | + // Don't add the marketing URL unless there's other metadata that's been downloaded |
| 114 | + if try fileManager.contentsOfDirectory(atPath: languageFolder).count > 0 { |
| 115 | + try marketingURL.write(toFile: "\(languageFolder)/marketing_url.txt", atomically: true, encoding: .utf8) |
| 116 | + } |
| 117 | + } catch { |
| 118 | + print(" Error writing: \(error)") |
| 119 | + } |
| 120 | + } |
| 121 | + |
| 122 | + task.resume() |
| 123 | + sema.wait() |
| 124 | +} |
| 125 | + |
| 126 | +func deleteExistingMetadata() { |
| 127 | + let fileManager = FileManager.default |
| 128 | + let url = URL(fileURLWithPath: baseFolder, isDirectory: true) |
| 129 | + try? fileManager.removeItem(at: url) |
| 130 | + try? fileManager.createDirectory(at: url, withIntermediateDirectories: false) |
| 131 | +} |
| 132 | + |
| 133 | + |
| 134 | +deleteExistingMetadata() |
| 135 | + |
| 136 | +languages.forEach( { (key: String, value: String) in |
| 137 | + downloadTranslation(languageCode: value, folderName: key) |
| 138 | +}) |
| 139 | + |
0 commit comments