Smartling exposes a simple REST API that’s fairly easy to adopt. Some differences from the old approach: - We get UTF-8 back instead of UTF-16, so there’s no need to use iconv. - We don’t support “nb_NO”, so we don’t need to remove it each time we fetch translations. - We get back English fallbacks for .stringsdict files, so there’s no need to merge them manually ourselves. - We no longer support country-specific locales *and* the root language, so we don’t need to merge, for example, “es” into “es-MX”. - We handle language mapping & duplication inside the Swift script, which will hopefully be more reliable than cp’ing directories.
30 lines
1.0 KiB
Swift
30 lines
1.0 KiB
Swift
//
|
|
// Copyright (c) 2022 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
struct LimitedThrowingTaskGroup {
|
|
var taskGroup: ThrowingTaskGroup<Void, Error>
|
|
var remainingCapacity: Int
|
|
|
|
mutating func addTask(operation: @escaping @Sendable () async throws -> Void) async throws {
|
|
if remainingCapacity > 0 {
|
|
remainingCapacity -= 1
|
|
} else {
|
|
// Once we've kicked off the maximum number of concurrent tasks, we always
|
|
// wait for one to finish before starting the next one.
|
|
try await taskGroup.next()
|
|
}
|
|
taskGroup.addTask(operation: operation)
|
|
}
|
|
}
|
|
|
|
func withLimitedThrowingTaskGroup(limit: Int, body: (inout LimitedThrowingTaskGroup) async throws -> Void) async rethrows {
|
|
try await withThrowingTaskGroup(of: Void.self) { taskGroup in
|
|
var limitedTaskGroup = LimitedThrowingTaskGroup(taskGroup: taskGroup, remainingCapacity: limit)
|
|
try await body(&limitedTaskGroup)
|
|
try await taskGroup.waitForAll()
|
|
}
|
|
}
|