Skip to content

Commit 0cebd55

Browse files
committed
Add a script to download translated metadata from GlotPress
1 parent a61f5bc commit 0cebd55

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed

fastlane/download_metadata.swift

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
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

Comments
 (0)