Localizable.strings'ten String Catalog'a (.xcstrings) geçiş

Güncelleme: · LocalePilot

Xcode 15'ten beri Apple herkesi String Catalog'lara yönlendiriyor: tüm diller için tek bir JSON dosyası, çoğullar ve cihaz varyasyonlarıyla birlikte. Geçiş iki tıklama sürer. Asıl dikkat isteyen, ardından gelen diff'tir.

Aceleniz varsa bağımsız .strings dosyalarını doğrudan tarayıcınızda bir kataloğa dönüştürün. Araç ücretsizdir, kayıt istemez ve hiçbir şey yüklemez.

Geçişten önce

Sürprizlerin çoğunu önleyen iki önlem:

  • Temiz bir Git çalışma ağacı, ayrı bir dalda. Sonrasında kontrol edilmesi gereken her şey diff'tedir; bu diff'in başka değişikliklerle karışmamasını istersiniz.
  • Geçişten önce başarılı bir derleme. Xcode kataloğu derleme sırasında kodunuzu tarayarak doldurur. Proje derlenmiyorsa katalog eksik kalır ve nedenini bilemezsiniz.

Geçişin kendisi

Project navigator'da Localizable.strings'e sağ tıklayın, ardından Migrate to String Catalog'u seçin. Xcode ilgili dosyaları ve target'ları listeler; tam ifadeler Xcode sürümleri arasında değişebilir, mantık değişmez.

fr.lproj/Localizable.strings, de.lproj/Localizable.strings… dosyalarının yerini tüm dilleri içeren tek bir Localizable.xcstrings alır. .strings dosyalarındaki yorumlar, her anahtarın yorumu olur.

Dosya neye benziyor

String Catalog bir JSON dosyasıdır. Basit bir anahtar:

{
  "sourceLanguage" : "en",
  "strings" : {
    "welcome_user" : {
      "comment" : "Home screen greeting",
      "localizations" : {
        "fr" : {
          "stringUnit" : {
            "state" : "translated",
            "value" : "Bon retour, %@ !"
          }
        }
      }
    }
  },
  "version" : "1.0"
}

Ve variations altında saklanan bir çoğul:

"items_left" : {
  "localizations" : {
    "fr" : {
      "variations" : {
        "plural" : {
          "one" : { "stringUnit" : { "state" : "translated", "value" : "%lld article restant" } },
          "other" : { "stringUnit" : { "state" : "translated", "value" : "%lld articles restants" } }
        }
      }
    }
  }
}

Biçime dikkat edin: Xcode'un yazdığı gibi her iki nokta üst üsteden önce bir boşluk var. Dosyayı "standart" JSON olarak yeniden yazan bir araç, tek bir çeviriyi değiştirmeden devasa bir diff üretir.

Diff'te neleri kontrol etmeli

Stale olarak işaretlenen anahtarlar. Derlemeden sonra Xcode, kodunuzda artık bulamadığı anahtarları işaretler. Bunlar mutlaka ölü değildir: çalışma zamanında oluşturulan bir anahtar (NSLocalizedString(variable, comment: ""), bir yapılandırma dosyasından okunan anahtar) tarama için görünmezdir. Silmeden önce kontrol edin.

Koddan çıkarılan yeni anahtarlar. Derleme, Localizable.strings'e hiç koymadığınız metinler ekleyebilir; tipik olarak varsayılan olarak yerelleştirilebilir olan SwiftUI Text("…") literal'leri. Bunlar çevrilmemiş olarak gelir, bu yüzden Xcode'un her dil için gösterdiği yüzde düşer; bu beklenen bir durumdur.

Durumlar. Her değerin bir durumu vardır: translated, needs_review ya da henüz kimsenin çevirmediği bir metin için new. Üç ay sonra neyin gerçekten gözden geçirildiğini bu sayede bileceksiniz.

Format belirteçleri. Text("\(count) items left") gibi bir SwiftUI metni %lld items left anahtarını üretir. Eski .strings dosyanız aynı cümle için %d kullanıyorsa, artık birbirine çok benzeyen iki anahtarınız olur; kodunuzun gerçekten kullandığını tutun.

Eski iOS sürümleri ne olacak?

iOS 17'ye gerek yok. Katalog bir kaynak biçimidir: derleme sırasında Xcode onu uygulama paketinin içinde normal .strings dosyalarına dönüştürür. Deployment target'ınız değişmez.

Kataloğu Xcode dışında düzenlemek

Xcode'un editörü birkaç metin için yeterlidir. Bütün bir dili gözden geçirmek, toplu çeviri yapmak ya da placeholder'ları kontrol etmek için özel bir araç işinizi kolaylaştırır. LocalePilot .xcstrings dosyalarını açar ve Xcode stilinde geri yazar: değişmemiş bir katalog bayt bayt aynı çıkar, bir düzenleme yalnızca kendi satırlarını değiştirir ve düzenlenen bir değer translated durumuna geçer. Çoğullar ve cihaz varyasyonları düzenlenebilir; substitution içeren anahtarlar (%#@count@) ve shouldTranslate: false olarak işaretlenen anahtarlar olduğu gibi korunur, bunları Xcode'da düzenlersiniz.

Sık sorulan sorular

String Catalog'lar iOS 17 gerektirir mi?

Hayır. Xcode, derleme sırasında kataloğu normal yerelleştirme dosyalarına dönüştürür; uygulamanızın deployment target'ı değişmez.

String Catalog'da Stale ne anlama gelir?

Xcode, son derlemede anahtarı kodunuzda bulamadı. Silmeden önce anahtarın çalışma zamanında oluşturulmadığından emin olun.

Geçişi nasıl geri alırım?

Geçişi, hemen öncesinde bir commit bulunan ayrı bir dalda yapın: Git'te geri almak .strings dosyalarını geri getirir.