- 8 Haz 2024
- 8,540
- 4,325
- 3,424

Xcode'da Dize Katalogları ile Uygulama Yerelleştirme
Xcode'da yazılım oluştururken metni özelleştirmek uzun zamandır mümkündü, ancak Şimdi, Dize Katalogları, uygulamanızı birden fazla dilde yerelleştirmeyi daha da kolaylaştırıyor.2000 yılında Mac OS X olarak piyasaya sürüldüğünden beri, Apple'ın geliştirme ortamları geliştiricilere iki Apple teknolojisini kullanarak uygulama metinlerini (dizeleri) kolayca yerelleştirmelerine izin verdi: dil özel kümeler ve .strings dosyaları.
Yerelleştirme, bir uygulama dizesi dosyasının birçok ülkede kullanılmak üzere birden çok dile çevrilmesi sürecidir. Geliştiriciler, bir uygulama çalıştığında, mevcut sistem diline göre doğru .strings dosyasını otomatik olarak yükleyecek şekilde dize dosyalarını hangi dillere yerelleştireceklerine karar verebilirler.
Apple, 1997 yılında NeXT Computer, Inc.'i satın aldığında bu teknolojileri devraldı. NeXT'teki kişiler, uygulamaları yerelleştirmeyi kolaylaştırmak ve uygulamalara daha sonra yeniden derleme projelerine gerek duymadan ek dillerin eklenmesine izin vermek için dikkatlice düşünmüştü.
Bunu, her bir uygulama içinde bulunan paketlenmiş kaynaklar kullanarak başardılar.
Apple teknolojisi terimleriyle, bir demet sadece işletim sistemine, bir uygulama, bir çerçeve, bir sürücü veya sistem uzantısı veya bir yükleyici olarak işlem görmesi gerektiğini belirten bazı özel dosya sistemine ait özel bir klasördür. Ayrıca diğer türlerde demetler de vardır.
Apple programlamasında, demetler diskteki her demette depolanan ve .strings dosyalarında dil özel demetlerle ve .strings dosyaları aracılığıyla gerçekleştirilir.
Demetler, başka demetler içerebilir ve yerelleştirme açısından, dil özel bir uzantı ile uygulamanın içine demetler saklamak yaygındır - örneğin İngilizce için ".en", Japonca için ".jp" veya Almanca için ".de".
Her dil demeti, farklı dillerde paralel kaynakları içerebilir.
.strings dosyaları aslında XML dosyalarıdır Apple ayrıca anahtar-değer çiftlerini içeren özel bir dosya türü olan .plist (Özellik Listesi) dosyasını da tanımlar, bu aslında yalnızca bir XML dosyasıdır. Xcode'un .plist dosyaları için yerleşik bir düzenleyicisi olduğu için, anahtar-değer çiftlerini grafiksel bir düzenleyicide düzenlemek için nasıl yapılacağını bilir.
.plist dosyaları ayrıca yerelleştirilebilecek dizeleri içerebilir veya demetin içinde başka bir yerdeki başka bir dize dosyasına işaret edebilir.
Info.plist adında özel bir dosya, bir uygulama açıldığında Finder'ın okuduğu Apple tarafından tanımlanan anahtarları içerir. Info.plist dosyası, bir uygulamayı başlatırken işletim sistemine hangi ayarların kullanılacağını söyleyen özel anahtarlar ve değerler içerir.
Bir dizeler dosyası "" ve XML etiketlerini kullanarak anahtarları ve karşılık gelen dizeleri içerir.
Örneğin:"kAlertOKButtonStringKey"
"Tamam" Metin genellikle bir geliştirici tanımlı sabit bir değerdir ve XML ile çakışmadığı sürece herhangi bir şey olabilir.
Değer, çalışma zamanında kullanıcı arayüzünde gösterilecek gerçek dize metnidir.
Bir .strings dosyası oluşturulduktan sonra, dosya kendisi tercüman birine teslim edilerek çeşitli farklı dillere kopyalanabilir.
Bu tasarım, bir uygulamanın veya demetin tamamını yerelleştirmeyi kolaylaştırır.
Geleneksel olarak, Apple platformlarında bir uygulamadaki varsayılan .strings dosyasının adı "Localizable.strings" olarak adlandırılır.
NeXT'in programlama dili Objective-C idi ve Apple tarafından hala kullanılıyor.
Objective-C, 1980'lerin sonlarına kadar uzanır ve o zamanlar NeXT'te geliştirilen bir bilgisayar platformu için geliştirildi. Objective-C, daha önce Bell Labs'te UNIX'u geliştirmek için kullanılan C adlı daha eski bir dilden türemiştir.
Aslında, C, UNIX'u yazmak için oluşturulmuştur.
Objective-C tabanlı uygulamalarda, geliştiriciler genellikle her dize dosyası için bir .h (başlık) dosyası eklerler, bu dosya .strings dosyasında tanımlanan anahtarlarla eşleşen sabit tanımları içerir. Bu, Objective-C uygulamalarındaki anahtarları değiştirmeyi kolaylaştırır.
Çoğu modern TCI/IP ağ yığını hala C'de yazılmıştır. .h dosyaları C dili için oluşturulmuştur. Bunların hepsi nesne yönelimli programlamanın (OOP) icat edilmeden önce oluşturulduğu zamanlardır.
Objective-C ve NeXT'in geliştirme ortamından önce, yazılımın yerelleştirilmesi ve yeniden yerelleştirilmesi her bir dize değiştirildiğinde uygulamanın tamamen yeniden derlenmesini gerektirirdi.
Apple'ın daha yeni bir programlama dili olan Swift, C başlık dosyalarını ortadan kaldırır, ancak dizeler hala önce olduğu gibi yerelleştirilir ve yüklenir.
Apple'dan özel dize sınıfları Bir uygulama Apple platformları için oluşturulduğunda, sonuç olarak oluşturulan uygulama demeti, program yürütmesi için gereken tüm kodları, kaynakları ve dizeleri içerir.
OOP'de, derlenmemiş bir nesnenin kod tanımına bir sınıf denir. Sınıflar, hem kodu hem de veriyi yeniden kullanım kolaylığı için bir araya getiren kod demetleridir. Sınıflar alt sınıflandırılabilir - miras alan sınıfların özelliklerini ve yöntemlerini miras almasına izin verilir.
Apple programlamasındaki merkezi dize sınıfı NSString (Objective-C) veya basitçe String (Swift)'tir.
Her iki sınıf da benzer şekilde çalışır ve aynı fonksiyonlara (OOP'daki yöntemler olarak adlandırılır) sahiptir. Swift ayrıca kendi Standart Kütüphanesine sahiptir, bu kütüphane geleneksel C Standart Kütüphanesinden büyük ölçüde farklıdır.
Apple dize sınıfları, dizeler oluşturmak için birkaç yönteme sahiptir. .strings dosyalarından yükleyebilir, bir C dizisinden veya bir Unicode dizisinden oluşturabilirsiniz ve bir NSString'i veya String'i onlarca "init" yöntemi kullanarak başlatabilirsiniz.
Ayrıca, diğer Apple veri türlerini de dönüştürebilirsiniz; tarihler, ham veri, baytlar veya URL'lerden veya .txt ve .rtf gibi diğer dosya türlerinden veya başka yerlerden dize dosyalarından.
Apple dize sınıflarının nasıl oluşturulacağını görmek için Apple'ın Geliştirici web sitesindeki NSString sınıfı başvuru sayfasına gidin. Oradan Swift ve Objective-C sözdizimi arasında geçiş yapabilirsiniz.
NSString, önceden dize dosyalarını NSString'lere dönüştürmek için onlarca yönteme sahipti, ancak bu yöntemler artık önerilmediği için artık kullanılmıyor. Apple, C dizilerini uyumluluk nedenleriyle kullanmanızı önermediği için bu yöntemleri artık kullanmıyor.
Objective-C'de bir NSString sabiti tanımlayabilirsiniz @"" sözdizimi kullanarak:
@"NSVisualEffectView"
Bu, derleyiciye, derleme sırasında doğrudan dizeyi kodda saklamasını söyler. Sabitler genellikle yalnızca yöntem parametrelerine bayrak olarak kullanılır, ancak bir NSString veya String gerektiren herhangi bir yerde de geçebilirsiniz.
Bir nesnenin derlenmiş Objective-C veya Swift nesnesinin sınıfını çalışma zamanında almak için ayrıca Class anahtar kelimesini kullanarak bir dize sabiti kullanabilirsiniz, örneğin:
Class parlakSınıf = NSClassFromString( @"NSVisualEffectView" );
Yukarıdaki örnekte, NSClassFromString() sabit @"NSVisualEffectView" geçirilir ve işlev, sınıfı döndürür ve tanımladığınız 'parlakSınıf' adlı Class değişkenine saklar.
NSClassFromString() işlevine ilettiğiniz dize sabiti, sınıfın adıdır ve Apple'ın belgelerinde tanımlandığı şekilde adlandırılır. Swift için NSClassFromString() için bir versiyon da vardır:
NSClassFromString(_
Apple ayrıca nesneler hakkında daha ileri düzeyde bilgiler sağlamak için uygulayabileceğiniz bir NSClassDescription adlı bir sınıf da sağlar.
Apple'dan bir kardeş dize sınıfı olan NSMutableString'i kullanarak dize içeriğini değiştirebilir ve düzenleyebilirsiniz. Dizeler ayrıca, dizelerdeki verilerin nasıl işleneceğini yazılımın nasıl belirleneceğini söyleyen kodlamalara sahiptir.
Roman, Kiril, Asyalı, Arap ve diğer diller için kodlama vardır.
Çoğu diğer NSObjects'un miras aldığı temel sınıfa NSObject denir.
NSString oldukça geniş bir sınıftır ve belgeleri dikkatlice kontrol etmek isteyeceksiniz.
Apple uygulamalarında dizeleri programlı yükleme Apple uygulamalarında dizeleri yüklemenin birkaç yolu vardır.
.strings dosyalarıyla çalışırken kullanılan tipik yol, NSLocalizedString() işlevini kullanmaktır. Bu C işlevi (aslında bir C makrosu) iki parametre alır:
// Yerelleştirilmiş mesaj dizesini yükle
NSString *tavsiyeDizesi = NSLocalizedString( mesajDizeAnahtarı, kBosDizeAnahtarı );
Bu, ilk parametre olarak iletilen anahtara karşılık gelen diziyi uygulamanın demetindeki Localizable.strings dosyasından yükler. İlk parametre, yüklenmek istenen .strings dosyasındaki dize anahtarıdır. Bu, bir dize sabiti, bir C veya Swift derleyici tanımı sabiti veya anahtarı içeren bir NSString değişkeni olarak geçirilebilir.
Her durumda da, NSLocalizedString() istenen dizeyi .strings dosyasından alır ve sağ taraftaki NSString değişkenine saklar.
NSLocalizedString() tarafından döndürülen NSString değişkeni "*" sözdizimini kullanarak bir işaretçi değişken olarak bildirilmelidir.
NSLocalizedString()'in ikinci parametresi, "öneri" veya yorum dizesidir ve boş dize (@""), seçtiğiniz bir şey veya nil olabilir. Objective-C ve Swift'te nil "hiçbir şey" - boş bir işaretçi anlamına gelir.
Yukarıdaki örnekte, kBosDizeAnahtarı, aşağıdaki gibi bir başlık dosyasında önceden derlenmiş bir makroda tanımlanır:
#define kBosDizeAnahtarı @""
Bu, derleyiciye: derleme sırasında 'kBosDizeAnahtarı' ifadesiyle karşılaştığınız her yerde, kodda @"" ile değiştirin. #define C'de bir "pound-define" ( '#' simgesi için) denir.
Aynı satırı aşağıdaki gibi kolayca yazabilirdiniz:
NSString *tavsiyeDizesi = NSLocalizedString( mesajDizeAnahtarı, @"" );
#tanımların bir sabit değeri değiştiğinde yalnızca başlıkta bir yerde değiştirilmesi gerektiğinden kullanılır ve sonraki derlemede #define'in her yerde değişmesini sağlar.
Swift'te, NSLocalizedString() çağrısı şu şekilde görünür:
let tavsiyeDizesi = NSLocalizedString( mesajDizeAnahtarı, nil )
Her iki dilde de NSLocalizedString(), gerçekte Xcode'daki NSBundle sınıfındaki bir makroda tanımlanmış bir C işlevi gibi görünse de:
#define NSLocalizedString(key, comment) \
[NSBundle.mainBundle localizedStringForKey
NSBundle'ın, üçüncü parametre olarak başka bir .strings dosyasının adını ileterek, ana demetden dize yüklemek için kendi yöntemi vardır. Bu, uygulamanın ana demetinden dize yüklemek için NSBundle'ın kendi yöntemini kullanırken, isteğe bağlı ikinci parametreyi ve bir masa parametresini alır. Masa parametresi, üçüncü parametre olarak başka bir .strings dosyasının adını ileterek, ana .strings dosyası yerine başka bir .strings dosyasından dizeler yüklemek için kullanılabilir.
Bu, yalnızca kodu kısaltmak ve düz bir C işlevi gibi görünmesini sağlamak için makroyu derleme öncesi tüm makro işlevini sıkıştırır.
NSBundle kullanarak dize dosyalarından programlı yükleme Dosyadan dizeleri yüklemenin başka bir yolu NSBundle'ı doğrudan kullanmaktır, dizeleri bir metin dosyasından yüklemek için pathForResource
NSString *dosyaAdı = [ [ NSBundle mainBundle ] pathForResource
if (dosyaAdı)
{
NSString *içerikDizesi = [ NSString stringWithContentsOfFile:dosyaAdı ];
}
Bu yöntemi kullanırken, ikinci parametre olarak bir NSString olarak adını veya yolunu ve ikinci parametre olarak uzantıyı geçirirsiniz. Belirtilen konumda ve adı ile okunabilir bir metin dosyası varsa, NSBundle bu dosyayı yükler ve bunu bir NSString olarak döndürür.
pathForResource
Her şey planlandığı gibi giderse, stringWithContentsOfFile: döndüğünde yukarıda bildirilen *içerikDizesi değişkeni, metin dosyasının tam içeriğini bir dize olarak gösterecektir.
NSBundle, biraz alışması gereken bir şeydir, ancak bir kez ustalaştığınızda çok güçlüdür.
NSBundle üzerinde birkaç benzer makro vardır ve bunlar dize demetlerinden dizeleri yüklemek için varyantlardır. .strings dosyalarındaki dizeleri başka bir demetten bile yükleyebilirsiniz:
NSLocalizedStringFromTable NSLocalizedStringFromTableInBundle NSLocalizedStringWithDefaultValue NSLocalizedAttributedString NSLocalizedAttributedStringFromTable NSLocalizedAttributedStringFromTableInBundle NSLocalizedAttributedStringWithDefaultValue Bir NSAttributedString, font, yüz, bağlantı ve diğer tipografik ayrıntılar gibi özelliklere sahip bir metin dizesidir.
NSAttributedString sınıfı, metin ve bağlantıları özelleştirmenin yanı sıra, kullanıcı arayüzünde metni biçimlendirme olanağı sağlar. NSAttributedString nesneleri, metin özelliklerini uygulamanın görüntüleme durumuna göre dinamik olarak ayarlamak için kullanışlıdır.
Örneğin, gizli bir uygulama içi web tarayıcısını veya metin editörünü başlatmak için NSAttributedString nesneleri kullanabilirsiniz.
Birleştirilmiş nesneler ve C++ sınıfları Apple ayrıca nesnelerin belirli hafıza yollarında nasıl birleştirileceğini belirleyen özel hafıza işaretçilerine ve başvuru sayılarına (retain count) sahiptir. Ayrıca, bir nesneye birden fazla işaretçi tanımlama ve değiştirme işlevlerine sahip birleştirme ve nesne yönlendirmesi yapıyor.
Nesnelerin özel birleştirme kuralları vardır, bu nedenle özel C++ nesneleri ve başka bir yerden veya Apple demetinden gelen C++ nesneleriyle kullanırken dikkatli olmalısınız. Herhangi bir işaretçi veya yönlendirme hataları, uygulamanın hafıza korumasını dışarı çıkarabilir ve ciddi sorunlara neden olabilir.
Objective-C ve Swift, kodunuzu parçalara bölmek ve yeniden kullanmak için çok güçlü araçlara sahiptir. Yerelleştirme, kodunuzu dünya genelindeki pazarlar için hızla genişletmenin ve uyarlamanın harika bir yoludur. Bir kez yerelleştirildiğinde, uygulamanız veya demetiniz herhangi bir dilde çalışabilir ve yeni bir dili eklemek birkaç basit adımdan ibarettir.
Yerelleştirmeyi unutmamalısınız. Yerelleştirme, genellikle bir uygulamanın başarısını veya başarısızlığını belirler.
Diller arası bariz bir pazarlama fırsatı ve geniş bir kullanıcı tabanı olabilir.
Yerelleştirme, uygulamanızın veya demetinizin genellikle küresel çapta satılabilir hale getirilmesini sağlar.