Aracılığıyla paylaş


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.PreferredLocalizationsalın:

var lang = NSBundle.MainBundle.PreferredLocalizations[0];

Bu değer, İngilizce, İspanyolca, esja 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_USkullanı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:

  1. Koddaki resme bakın, örneğin:

    UIImage.FromBundle("flag");
    
  2. Varsayılan görüntü dosyasını flag.png Base.lproj'a (yerel geliştirme dili dizini) yerleştirin.

  3. İ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 CultureInfoile 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 ve trailing özniteliklerini kullanın (İngilizce için sola ve sağa karşılık gelir, ancak RTL dilleri için tersine çevrilir). Denetim UIStackView , 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):

Localization in Arabic

Localization in Hebrew

iOS, öğesini otomatik olarak ters çevirir UINavigationControllerve 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ı

Screenshot shows the resources tree for a sample including the location of localizable strings.

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.

Screenshot shows the resources tree for a sample including the location of MainStoryboard strings.

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:

Xcode view of Storyboard localization

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; UILabels bir text özelliğe sahiptir ve UIButtonvarsayılan metin kullanılarak normalTitleayarlanı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:

Strings files

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.