WWDC23’te Apple, Xcode’a RemafoX uygulamamın büyük bölümünü sherlocklamış yeni bir özellik tanıttı. Elbette yeni özelliği detaylıca test ettim ve ilgili Slack etkinliğinde onu geliştiren ekibe tüm sorularımı sordum. String Catalogs konusunda gerçekten harika bir iş çıkardılar, o kadar ki alt seviye işlerin çoğunu üstlendikleri için uygulamamı yeniden tasarlayacağım.
Ama Dub Dub’dan beri konuştuğum çoğu kişi hâlâ String Catalogs’un projeleri üzerindeki etkilerinin farkında değil. Bu yüzden String Catalogs’un gerçekten ne kadar muhteşem olduğunu daha net anlatmak için en sık sorulan soruları yanıtlamam gerektiğini düşündüm.
String Catalogs nedir? Strings(dict) dosyaları ne olacak?
String Catalogs, .xcstrings uzantılı dosyalardır ve içeriklerini özel bir JSON formatında saklar. Kesin format belgelenmemiş (bunu değiştirmek için geri bildirim gönderdim: FB12264877) ve geliştirici olarak hiçbir zaman JSON koduyla uğraşman gerekmeyecek çünkü Xcode 15 görsel bir editörle geliyor:

String Catalogs, hem .strings hem de .stringsdict dosyalarının yerini alıyor ve dolayısıyla çoğullaştırmayı hazır olarak destekliyor. Dile özgü en.lproj gibi klasörlere yerleştirilen .strings(dict) dosyalarının aksine, String Catalogs desteklenen tüm dillerin çevirilerini tek bir dosyada kapsülüyor. Bu, belirli çevirilerin ilerlemesini doğrudan Xcode’da göstermek gibi güvenlik kontrollerine olanak tanıyor, böylece eksik çevirilerden haberdar oluyorsun (RemafoX Linter’ın yerini alıyor). Aynı şekilde, yeni key’leri tüm dillere otomatik olarak ekleyerek sana çok zaman kazandırıyor (RemafoX Normalizer’ın yerini alıyor). Ve gelecek güncellemelerde daha fazla özellik gelebilir, örneğin yerelleştirmelerinin kaynak dilindeki parametrelerle aynı parametrelere (örn. %@) sahip olup olmadığını kontrol etme (RemafoX için planladığım bir özellik, geri bildirim gönderdim: FB12264614).
Strings(dict) dosyaları olan bir projem var. Geçiş kolay mı?
Evet, kesinlikle! String Catalogs’a geçiş çok basit: .strings(dict) dosyalarından birine sağ tıkla ve “Migrate to String Catalog…” butonuna bas. Bu, projedeki tüm .strings(dict) dosyalarının listesini içeren bir pencere açarak hangilerinin tek bir String Catalog’da birleştirilmesi gerektiğini seçmeni sağlar. Projenin farklı bölümleri için ayrı Strings dosyaların varsa, bunlar için ayrı String Catalog’lar tutabilirsin, her şeyi tek bir String Catalog’a koymak zorunda değilsin.
Ama projem eski işletim sistemi sürümlerini destekliyor. Yine de geçiş yapabilir miyim?
Evet, kesinlikle! Apple mühendisleri burada çok akıllıca bir şey yaptı: Geliştiriciler olarak String Catalog’un tüm özelliklerinden tam olarak yararlanabilirken, uygulamalarımız .xcstrings gibi yeni bir dosya formatı görmeyecek. Bunun yerine, derleme sürecinde Xcode String Catalog’u eski güzel .strings ve .stringsdict dosyalarına geri dönüştürecek ve böylece hedefleyebileceğin tüm işletim sistemi sürümleriyle uyumluluğu sağlayacak. Bu şu anlama geliyor: projen için Xcode 15’e geçebildiğin anda, String Catalogs’u hiç arkana bakmadan tam olarak kullanabilirsin!
💁♂️ Koddaki yerelleştirilmiş String’ler için SF Symbols benzeri bir uygulama, iOS’un mevcut olduğu tüm dillerde resmi çevirilerle ister misin? Tam olarak bunu yaptım ve bu özellik tamamen ücretsiz! TranslateKit’i indir ve menü çubuğunu kontrol et. 🌐 👍
Güvenli yerelleştirme key referansları ve derleyici kontrolleri için SwiftGen/RemafoX kullanıyorum. Bu güvenliği kaybedecek miyim?
Hayır, kesinlikle hayır. Xcode sadece yerelleştirmeler için yeni bir dosya formatı tanıtmakla kalmıyor, aynı zamanda projenizden yeni yerelleştirme key’lerini otomatik olarak çıkarmak için araçlarla birlikte geliyor. LocalizedStringKey veya LocalizedStringResource ile SwiftUI’nin yerelleştirme API’lerinden herhangi birini kullanırsan, bunlar otomatik olarak algılanır ve String Catalog’una eklenir. Ama bu SwiftUI ile sınırlı değil, String(localized:) gibi düz Swift String API’leriyle, NSLocalizedString() gibi düz Obj-C tarzı API’lerle (özel isimler de destekleniyor) ve hatta .storyboard ve .xib dosyaları gibi Interface Builder dosyalarıyla da çalışıyor. Info.plist dosyaları için InfoPlist.xcstrings adında özel bir String Catalog oluşturman gerekiyor ve çıkarım orada da otomatik olarak çalışacak.
Kodda key’lerin için otomatik tamamlama alamayacağını unutma, Xcode 15’te Asset Catalog’larındaki resimler ve renkler için aldığın gibi. Bunun nedeni, Asset Catalog’larda doğruluk kaynağının varlıkların yerleştirildiği kataloğun kendisinde olması. Ama Xcode eklenen yerelleştirmeleri otomatik olarak kaynak kodundan çıkardığı için, yerelleştirmelerinin doğruluk kaynağı ters yöndedir ve kodunda bulunur. Bu nedenle koduna Strings dosyasında karşılığı olmayan bir metin eklemen imkansızdır (eskiden mümkündü ve bozuk çevirilere yol açıyordu). Bunun yerine, projenize yerelleştirilmiş bir String eklediğinde, Xcode otomatik olarak desteklenen tüm diller için yeni bir çeviri key’i oluşturur ve String Catalog’da çevirilerinin eksik olduğunu görürsün.

Almanca dil için yeşil onay işaretinin olmaması çevirinin tamamlanmadığını gösteriyor.
Ya yazım hataları? Geliştirme sırasında key’i değiştirebilir miyim?
Xcode sadece yeni key’leri çıkarıp otomatik olarak String Catalog’una eklemekle kalmaz, aynı zamanda katalogundaki projende artık referans verilmeyen key’lerin silinmesini de sağlar. Bunu güvenli bir şekilde yapar: Herhangi bir dilde henüz çeviri sağlamadığın bir key’in varsa, projende artık bulamazsa key’i otomatik olarak siler. Bu genellikle key’inde bir yazım hatası olduğunda veya geliştirme sırasında key’i iyileştirmek isteyip değiştirdiğinde olan şeydir. Ama zaten bazı çevirilerin varsa, Xcode bunun yerine String Catalog’daki key’i sarı bir uyarı simgesiyle “stale” (eski) olarak işaretler. Bu, artık referans verilmeyen key’leri kolayca tespit etmeni, gerekirse çevirilerini yeni key’e kopyalamanı ve ardından silmeni sağlar.

Kod/IB dosyasındaki belirli bir metni yerelleştirmek istemiyorsam ne olur?
Şu anda doğruluk kaynağından çıkarımı kontrol etmenin doğrudan bir yolu yok gibi görünüyor. Özellikle IB dosyaları için bir geri bildirim gönderdim (FB12264777) çünkü RemafoX (ve önceki sürümü BartyCrouch) araçlarım orada hariç tutmayı destekliyor, bu nedenle String Catalogs’a geçiş ancak Apple tarafından bir çözüm sağlanırsa bunları kullanan kişiler için mümkün olabilir. Koddaki bir String’i “çevrilmez” olarak işaretlemenin açık bir yolunu da bulamadım ama çoğu SwiftUI view’ında aynı API’nin String yerine Text view’ı alan bir aşırı yüklemesini bulacaksın. Bunun geçerli olduğu view’larda, metni çıkarılmayacak şekilde oluşturmak için Text(verbatim: "Your Text") kullanabilirsin çünkü verbatim anahtar kelimesi onu çevrilmez olarak işaretler. Ama Text ile bir aşırı yükleme her zaman mevcut olmadığı için, çıkarımı kontrol etmenin daha doğrudan bir yolu için bir geri bildirim gönderdim (FB12469163). Şimdilik, LocalizedStringKey aşırı yüklemesini tercih eden SwiftUI API’lerinde basitçe bir String başlatıcısı kullanarak bir geçici çözüm buldum, sadece String("Your Text") gibi bir şey geç.
Sonuç
Xcode 15’te String Catalogs’un tanıtılması, çeviri dosyalarının yönetimini basitleştirerek yerelleştirme iş akışına önemli iyileştirmeler getiriyor. Geliştiriciler projelerini kolayca String Catalogs’a taşıyabilir ve yerelleştirme key referanslarının güvenliğini koruyabilir, aynı zamanda eski işletim sistemi sürümlerini desteklemeye ve key değişiklikleri ile yazım hataları üzerinde kontrol sahibi olmaya devam edebilir. Bazı sınırlamalar ve iyileştirme alanları olsa da, String Catalogs eski Strings dosya sistemine kıyasla büyük bir adım ileri ve gerçek bir dezavantajı yok. Hemen geçiş yap!

