Xamarin.iOS'ta yerelleştirme
Bu belge, iOS SDK'sının yerelleştirme özelliklerini ve bunlara Xamarin ile nasıl erişeceklerini kapsar.
Unicode olmayan verileri işlemesi gereken uygulamalara karakter kümeleri/kod sayfaları ekleme yönergeleri için Uluslararasılaştırma Kodlamaları'na bakın.
iOS platform özellikleri
Bu bölümde iOS'taki bazı yerelleştirme özellikleri açıklanmaktadır. Belirli kodu ve örnekleri görmek için sonraki bölüme geçin.
Dil
Kullanıcılar Ayarlar uygulamasında dillerini seçer. Bu ayar, işletim sistemi tarafından ve uygulamalarda görüntülenen dil dizelerini ve görüntüleri etkiler.
Bir uygulamada kullanılan dili belirlemek için öğesinin ilk öğesini NSBundle.MainBundle.PreferredLocalizations
alın:
var lang = NSBundle.MainBundle.PreferredLocalizations[0];
Bu değer, İngilizce, İspanyolca, es
ja
Japonca vb. için gibi en
bir dil kodu olacaktır. Döndürülen değer, uygulama tarafından desteklenen yerelleştirmelerden biriyle sınırlıdır (en iyi eşleşmeyi belirlemek için geri dönüş kuralları kullanılır).
Uygulama kodunun her zaman bu değeri denetlemesi gerekmez: Xamarin ve iOS, kullanıcının dili için doğru dizeyi veya kaynağı otomatik olarak sağlamaya yardımcı olan özellikler sağlar. Bu özellikler bu belgenin geri kalanında açıklanmıştır.
Not
Uygulamanın desteklediği yerelleştirmelerden bağımsız olarak kullanıcının dil tercihlerini belirlemek için kullanın NSLocale.PreferredLanguages
. Bu yöntem tarafından döndürülen değerler iOS 9'da değiştirildi; Ayrıntılar için bkz . Teknik Not TN2418 .
Yerel ayar
Kullanıcılar Ayarlar uygulamasında yerel ayarlarını seçer. Bu ayar tarihlerin, saatlerin, sayıların ve para biriminin biçimlendirilme biçimini etkiler.
Bu, kullanıcıların 12 saat veya 24 saatlik zaman biçimlerini, ondalık ayırıcılarının virgül mü yoksa nokta mı olduğunu ve tarih olarak gün, ay ve yıl sırasının görüntülenip görüntülenmeyeceğini seçmesine olanak tanır.
Xamarin ile hem Apple'ın iOS sınıflarına (NSNumberFormatter
) hem de System.Globalization'daki .NET sınıflarına erişebilirsiniz. Geliştiriciler, her birinde farklı özellikler bulunduğu için gereksinimleri için hangisinin daha uygun olduğunu değerlendirmelidir. Özellikle StoreKit kullanarak Uygulama İçi Satın Alma fiyatlarını alıyor ve görüntülüyorsanız, döndürülen fiyat bilgileri için Apple'ın biçimlendirme sınıflarını kullanmanız gerekir.
Geçerli yerel ayar iki yoldan biriyle sorgulanabilir:
NSLocale.CurrentLocale.LocaleIdentifier
NSLocale.AutoUpdatingCurrentLocale.LocaleIdentifier
İlk değer işletim sistemi tarafından önbelleğe alınabileceğinden her zaman kullanıcının o anda seçili olan yerel ayarını yansıtmayabilir. Seçili durumdaki yerel ayarı almak için ikinci değeri kullanın.
Not
Mono (Xamarin.iOS'un temel aldığı .NET çalışma zamanı) ve Apple'ın iOS API'leri aynı dil/bölge birleşim kümelerini desteklemez. Bu nedenle, iOS Ayarlar uygulamasında Mono'da geçerli bir değerle eşlenmeyen bir dil/bölge bileşimi seçmek mümkündür. Örneğin, i Telefon dilini İngilizce ve bölgesini İspanya olarak ayarlamak aşağıdaki API'lerin farklı değerler vermesine neden olur:
CurrentThead.CurrentCulture
: en-US (Mono API)CurrentThread.CurrentUICulture
: en-US (Mono API)NSLocale.CurrentLocale.LocaleIdentifier
: en_ES (Apple API)
Mono kaynakları seçmek ve tarihleri ve CurrentThread.CurrentCulture
para birimlerini biçimlendirmek için kullandığındanCurrentThread.CurrentUICulture
, Mono tabanlı yerelleştirme (örneğin, .resx dosyalarıyla) bu dil/bölge birleşimleri için beklenen sonuçları vermeyebilir. Bu durumlarda, gerektiğinde yerelleştirmek için Apple'ın API'lerine güvenin.
NSCurrentLocaleDidChangeNotification
iOS, kullanıcı yerel ayarını güncelleştirdiğinde bir NSCurrentLocaleDidChangeNotification
oluşturur. Uygulamalar çalışırken bu bildirimi dinleyebilir ve kullanıcı arabiriminde uygun değişiklikler yapabilir.
iOS'ta yerelleştirme temelleri
Kullanıcıya görüntülenmesi için yerelleştirilmiş kaynaklar sağlamak için Xamarin'de aşağıdaki iOS özelliklerinden kolayca yararlanılır. Bu fikirleri nasıl uygulayacaklarını görmek için TaskyL10n örneğine bakın.
Info.plist dosyasında varsayılan ve desteklenen dilleri belirtme
Teknik Soru-Cevap1828: iOS Uygulamanızın Dilini Nasıl Belirler? bölümünde Apple, iOS'un bir uygulamada kullanılacak dili nasıl seçtiğini açıklar. Aşağıdaki faktörler hangi dilin görüntüleneceğini etkiler:
- Kullanıcının tercih ettiği diller (Ayarlar uygulamasında bulunur)
- Uygulamayla birlikte gelen yerelleştirmeler (.lproj klasörleri)
CFBundleDevelopmentRegion
(Uygulama için varsayılan dili belirten Info.plist değeri)CFBundleLocalizations
(Desteklenen tüm yerelleştirmeleri belirten Info.plist dizisi)
Teknik Soru-Cevap'ta belirtildiği gibi, CFBundleDevelopmentRegion
bir uygulamanın varsayılan bölgesini ve dilini temsil eder. Uygulama, kullanıcının tercih ettiği dilleri açıkça desteklemiyorsa, bu alan tarafından belirtilen dili kullanır.
Önemli
iOS 11, bu dil seçim mekanizmasını işletim sisteminin önceki sürümlerinden daha katı bir şekilde uygular. Bu nedenle, desteklenen yerelleştirmelerini açıkça bildirmeyen tüm iOS 11 uygulamaları (.lproj klasörleri dahil ederek veya için CFBundleLocalizations
bir değer ayarlayarak) iOS 11'de iOS 10'dakinden farklı bir dil görüntüleyebilir.
Info.plist dosyasında belirtilmemişse CFBundleDevelopmentRegion
, Xamarin.iOS derleme araçları şu anda varsayılan değerini en_US
kullanır. Bu, gelecekteki bir sürümde değişebilir ancak varsayılan dilin İngilizce olduğu anlamına gelir.
Uygulamanızın beklenen bir dili seçtiğinden emin olmak için aşağıdaki adımları izleyin:
- Varsayılan bir dil belirtin. Info.plist dosyasını açın ve anahtar için bir değer ayarlamak için
CFBundleDevelopmentRegion
Kaynak görünümünü kullanın; XML'de aşağıdakine benzer görünmelidir:
<key>CFBundleDevelopmentRegion</key>
<string>es</string>
Bu örnekte, kullanıcının tercih edilen dillerinden hiçbiri desteklenmediğinde varsayılan olarak İspanyolca olarak belirtilmesi için "es" kullanılır.
- Desteklenen tüm yerelleştirmeleri bildirin. Info.plist dosyasında, anahtar için bir dizi ayarlamak için
CFBundleLocalizations
Kaynak görünümünü kullanın; XML'de aşağıdakine benzer görünmelidir:
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>es</string>
...
</array>
.resx dosyaları gibi .NET mekanizmaları kullanılarak yerelleştirilmiş Xamarin.iOS uygulamalarının da bu Info.plist değerlerini sağlaması gerekir.
Bu Info.plist anahtarları hakkında daha fazla bilgi için Apple'ın Bilgi Özellik Listesi Anahtar Başvurusu'nda bir göz atın.
GetLocalizedString yöntemi
yöntemi, NSBundle.MainBundle.GetLocalizedString
projedeki .strings dosyalarında depolanan yerelleştirilmiş metni arar. Bu dosyalar dile göre, özel olarak adlandırılmış dizinlerde .lproj soneki ile düzenlenir (uzantının ilk harfinin küçük harf "L" olduğuna dikkat edin).
.strings dosya konumları
- Base.lproj , varsayılan dil için kaynakları içeren dizindir. Genellikle proje kökünde bulunur (ancak Kaynaklar klasörüne de yerleştirilebilir).
- <language.lproj> dizinleri desteklenen her dil için, genellikle Kaynaklar klasöründe oluşturulur.
Her dil dizininde bir dizi farklı .strings dosyası olabilir:
- Localizable.strings – yerelleştirilmiş metnin ana listesi.
- InfoPlist.strings – Uygulama adı gibi öğeleri çevirmek için bu dosyada belirli anahtarlara izin verilir.
- <storyboard-name.strings> – görsel taslaktaki kullanıcı arabirimi öğeleri için çeviriler içeren isteğe bağlı dosya.
Bu dosyalar için Derleme Eylemi Paket Kaynağı olmalıdır.
.strings dosya biçimi
Yerelleştirilmiş dize değerlerinin söz dizimi şöyledir:
/* comment */
"key"="localized-value";
Dizelerde aşağıdaki karakterlerden kaçmalısınız:
\"
teklif\\
Ters eğik çizgi\n
Newline
Bu örnek bir es/Localizable.strings (örn. İspanyolca) dosyasından alınmalıdır:
"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";
Görüntüler
iOS'ta bir görüntüyü yerelleştirmek için:
Koddaki resme bakın, örneğin:
UIImage.FromBundle("flag");
Varsayılan görüntü dosyasını flag.png Base.lproj'a (yerel geliştirme dili dizini) yerleştirin.
İsteğe bağlı olarak görüntünün yerelleştirilmiş sürümlerini her dil için .lproj klasörlerine yerleştirin (örn. es.lproj, ja.lproj). Her dil dizininde aynı dosya adı flag.png kullanın.
Belirli bir dil için görüntü yoksa, iOS varsayılan yerel dil klasörüne geri döner ve görüntüyü oradan yükler.
Görüntüleri başlatma
Her dil için .lproj dizinlerine yerleştirirken başlatma görüntüleri (ve i Telefon 6 modelleri için XIB veya Görsel Taslak) için standart adlandırma kurallarını kullanın.
Default.png
Default@2x.png
Default-568h@2x.png
LaunchScreen.xib
Uygulama adı
InfoPlist.strings dosyasını bir .lproj dizinine yerleştirmek, uygulamanın Info.plist dosyasındaki uygulama adı da dahil olmak üzere bazı değerleri geçersiz kılmanıza olanak tanır:
"CFBundleDisplayName" = "LeónTodo";
Uygulamaya özgü dizeleri yerelleştirmek için kullanabileceğiniz diğer anahtarlar şunlardır:
- CFBundleName
- CFBundleShortVersionString
- NSHumanReadableCopyright
Tarihler ve saatler
Yerel ayarın tarih ve saatlerini biçimlendirmek için yerleşik .NET tarih ve saat işlevlerini (geçerli CultureInfo
ile birlikte) kullanmak mümkün olsa da, bu durum yerel ayara özgü kullanıcı ayarlarını (dilden ayrı olarak ayarlanabilir) yoksayar.
Kullanıcının yerel ayar tercihine uygun bir çıkış oluşturmak için iOS'yi NSDateFormatter
kullanın. Aşağıdaki örnek kod, temel tarih ve saat biçimlendirme seçeneklerini gösterir:
var date = NSDate.Now;
var df = new NSDateFormatter ();
df.DateStyle = NSDateFormatterStyle.Full;
df.TimeStyle = NSDateFormatterStyle.Long;
Debug.WriteLine ("Full,Long: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Short;
df.TimeStyle = NSDateFormatterStyle.Short;
Debug.WriteLine ("Short,Short: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Medium;
df.TimeStyle = NSDateFormatterStyle.None;
Debug.WriteLine ("Medium,None: " + df.StringFor(date));
Birleşik Devletler İngilizce sonuçları:
Full,Long: Friday, August 7, 2015 at 10:29:32 AM PDT
Short,Short: 8/7/15, 10:29 AM
Medium,None: Aug 7, 2015
İspanya'da İspanyolca sonuçları:
Full,Long: viernes, 7 de agosto de 2015, 10:26:58 GMT-7
Short,Short: 7/8/15 10:26
Medium,None: 7/8/2015
Daha fazla bilgi için Apple Date Formatters belgelerine bakın. Yerel ayara duyarlı tarih ve saat biçimlendirmesini test ederken hem i Telefon Dil hem de Bölge ayarlarını denetleyin.
Sağdan Sola (RTL) düzeni
iOS, RTL kullanan uygulamalar oluşturmaya yardımcı olacak bir dizi özellik sağlar:
- Denetim hizalaması için otomatik düzenin
leading
vetrailing
özniteliklerini kullanın (İngilizce için sola ve sağa karşılık gelir, ancak RTL dilleri için tersine çevrilir). DenetimUIStackView
, denetimleri RTL kullanan olacak şekilde yerleştirmek için özellikle kullanışlıdır. - Metin hizalaması için kullanın
TextAlignment = UITextAlignment.Natural
(çoğu dil için bırakılır, RTL için sağda kalır). UINavigationController
otomatik olarak geri düğmesini çevirir ve çekme yönünü tersine çevirir.
Aşağıdaki ekran görüntüleri Arapça ve İbranice yerelleştirilmiş Tasky örneğini gösterir (alanlara İngilizce girilmiş olsa da):
iOS, öğesini otomatik olarak ters çevirir UINavigationController
ve diğer denetimler Otomatik Düzen'in içine UIStackView
yerleştirilir veya hizalanır.
RTL metni, LTR metniyle aynı şekilde .strings dosyaları kullanılarak yerelleştirilir.
Kodda kullanıcı arabirimini yerelleştirme
Tasky (kodda yerelleştirilmiş) örneği, kullanıcı arabiriminin kodda (XIB'ler veya görsel taslaklar yerine) yerleşik olduğu bir uygulamanın nasıl yerelleştirileceği gösterilir.
Proje Yapısı
Localizable.strings dosyası
Yukarıda açıklandığı gibi Localizable.strings dosya biçimi anahtar-değer çiftlerinden oluşur. Anahtar, dizenin amacını açıklar ve değer, uygulamada kullanılacak çevrilmiş metindir.
Örneğin İspanyolca (es) yerelleştirmeleri aşağıda gösterilmiştir:
"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";
Yerelleştirmeyi gerçekleştirme
Uygulama kodunda, kullanıcı arabiriminin görüntüleme metninin ayarlandığı her yerde (etiket metni veya girişin yer tutucusu vb.) kod, görüntülenecek doğru çeviriyi almak için iOS GetLocalizedString
işlevini kullanır:
var localizedString = NSBundle.MainBundle.GetLocalizedString ("key", "optional");
someControl.Text = localizedString;
Görsel taslak URI'lerini yerelleştirme
Örnek Tasky (yerelleştirilmiş görsel taslak), görsel taslaktaki denetimlerdeki metinlerin nasıl yerelleştirilmeye başlanmış olduğunu gösterir.
Proje yapısı
Base.lproj dizini görsel taslak içerir ve uygulamada kullanılan görüntüleri de içermelidir.
Diğer dil dizinleri, kodda başvurulan tüm dize kaynakları için localizable.strings dosyasının yanı sıra görsel taslaktaki metnin çevirilerini içeren bir MainStoryboard.strings dosyası içerir.
Dil dizinleri, Base.lproj dosyasında mevcut olan görüntüyü geçersiz kılmak için yerelleştirilmiş görüntülerin bir kopyasını içermelidir.
Nesne Kimliği / Yerelleştirme Kimliği
Görsel taslakta denetim oluştururken ve düzenlerken, her denetimi seçin ve yerelleştirme için kullanılacak kimliği denetleyin:
- Mac için Visual Studio, Özellikler Bölmesi'nde bulunur ve Yerelleştirme Kimliği olarak adlandırılır.
- Xcode'da buna Nesne Kimliği adı verilir.
Bu dize değeri genellikle aşağıdaki ekran görüntüsünde gösterildiği gibi "NF3-h8-xmR" gibi bir forma sahiptir:
Bu değer, çevrilmiş metni her denetime otomatik olarak atamak için .strings dosyasında kullanılır.
MainStoryboard.strings
Görsel taslak çeviri dosyasının biçimi Localizable.strings dosyasına benzer, ancak anahtar (soldaki değer) kullanıcı tanımlı olamaz, ancak bunun yerine çok özel bir biçime sahip olmalıdır: ObjectID.property
.
Aşağıdaki mainstoryboard.strings örneğinde yerelleştirilebilen bir placeholder
metin özelliğine sahip olduğunu görebilirsinizUITextField
; UILabel
s bir text
özelliğe sahiptir ve UIButton
varsayılan metin kullanılarak normalTitle
ayarlanır:
"SXg-TT-IwM.placeholder" = "nombre de la tarea";
"Pqa-aa-ury.placeholder"= "otra información de tarea";
"zwR-D9-hM1.text" = "Detalles de la tarea";
"bAM-2j-Rzw.text" = "Notas"; /* Notes */
"NF3-h8-xmR.text" = "Completo"; /* Done */
"MWt-Ya-pMf.normalTitle" = "Guardar"; /* Save */
"IGr-pR-05L.normalTitle" = "Eliminar"; /* Delete */
Önemli
Boyut sınıflarıyla görsel taslak kullanmak, uygulamada görünmeyen çevirilerle sonuçlanabilir. Apple'ın Xcode Sürüm Notları , üç şey doğruysa görsel taslak veya XIB'nin doğru yerelleştirilmediğini belirtir: boyut sınıflarını kullanır, temel yerelleştirme ve derleme hedefi Evrensel olarak ayarlanır ve derleme iOS 7.0'ı hedefler. Düzeltme, görsel taslak dizeleri dosyanızı aşağıdaki ekran görüntüsünde gösterildiği gibi iki özdeş dosyaya çoğaltmaktır: MainStoryboard~iphone.strings ve MainStoryboard~ipad.strings:
App Store listesi
Uygulamanızın satışta olduğu her ülkenin çevirilerini girmek için Apple'ın App Store Yerelleştirmesi hakkında SSS bölümünü izleyin. Çevirilerin yalnızca uygulamanız aynı zamanda dil için yerelleştirilmiş bir .lproj dizini içeriyorsa görüneceği uyarısını not edin.
Özet
Bu makalede, yerleşik kaynak işleme ve görsel taslak özelliklerini kullanarak iOS uygulamalarını yerelleştirmenin temelleri ele alınır.
Bu platformlar arası kılavuzda iOS, Android ve platformlar arası uygulamalar (Xamarin.Forms dahil) için i18n ve L10n hakkında daha fazla bilgi edinebilirsiniz.