StringCatalogKit provides model types for .xcstrings files and a provider-agnostic translation engine.
StringCatalog: Codable model types for Xcode string catalogs.CatalogTranslation: Translation engine + file planning/apply API.CatalogTranslationLLM: LLM adapter with customizable prompt templates.
import CatalogTranslation
import StringCatalog
struct MyTranslator: CatalogTextTranslator {
func translate(_ request: TranslationRequest) async throws -> String {
// Your API call here (OpenAI, DeepL, custom service...)
return "translated: \(request.text)"
}
}
let translator = MyTranslator()
let engine = CatalogTranslationEngine(translator: translator)
let catalog = try StringCatalog(contentsOf: URL(fileURLWithPath: "/path/Localizable.xcstrings"))
let result = try await engine.translateCatalog(catalog, to: .german)
print(result.report.stats)let service = CatalogFileTranslationService(engine: engine)
let plan = try await service.plan(
in: [URL(fileURLWithPath: "/path/to/project")],
targetLanguages: [.german, .french]
)
// Dry run first:
print(plan.items.filter(\.changed).count)
// Explicitly apply:
let applyReport = try service.apply(plan)
print(applyReport.writtenFiles)CatalogTranslationLLM provides LLMTranslator, which adapts system/user prompts to any model provider:
import CatalogTranslation
import CatalogTranslationLLM
let translator = LLMTranslator { _, systemPrompt, userPrompt in
// Call your LLM API here and return translated text.
try await myLLMClient.complete(system: systemPrompt, user: userPrompt)
}
let engine = CatalogTranslationEngine(translator: translator)For a full runnable example with OpenAI integration, see:
examples/README.mdexamples/Sources/TranslateCatalogWithOpenAI/main.swift