Xamarin. iOS 'da yerelleştirme

Bu belgede iOS SDK 'sının yerelleştirme özellikleri ve Xamarin ile nasıl erişebileceğiniz ele alınmaktadır.

Unicode olmayan verileri işlemek zorunda olan uygulamalarda karakter kümeleri/kod sayfaları ekleme hakkında yönergeler için Uluslararası duruma getirme kodlamaları bölümüne bakın.

iOS platform özellikleri

Bu bölümde, iOS içindeki yerelleştirme özelliklerinden bazıları açıklanmaktadır. Belirli kodu ve örnekleri görmek için sonraki bölüme atlayın.

Dil

kullanıcılar Ayarlar uygulamasında dilini seçer. Bu ayar işletim sistemi ve uygulamalar tarafından görünen dil dizelerini ve görüntüleri etkiler.

Bir uygulamada kullanılan dili öğrenmek için, ilk öğesini alın NSBundle.MainBundle.PreferredLocalizations :

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

Bu değer, en İngilizce, es İspanyolca, vb. gibi bir dil kodu olacaktır ja . Döndürülen değer, uygulama tarafından desteklenen yerelleştirmeler ile kısıtlıdır (en iyi eşleşmeyi belirlemede geri dönüş kuralları kullanılarak).

Uygulama kodunun bu değeri her zaman denetlemesi gerekmez – Xamarin ve iOS her ikisi de 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çıklanmaktadır.

Not

NSLocale.PreferredLanguagesUygulamanın desteklediği yerelleştirmeler ne olursa olsun, kullanıcının dil tercihlerini belirlemekte kullanın. Bu yöntemin döndürdüğü değerler iOS 9 ' da değişti; Ayrıntılar için bkz. Teknik Note 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 görüp görmeyeceğini, ondalık ayırıcılarının virgül mi yoksa bir nokta mı yoksa tarih ve ay ve tarih görüntüleme tarihi olarak gösterilip gösterilmeyeceğini seçmesini sağlar.

Xamarin ile hem Apple 'ın iOS sınıflarının () hem de NSNumberFormatter System. Globalization içindeki .net sınıflarının erişimine sahipsiniz. Geliştiriciler, her birinde kullanılabilen farklı özellikler olduğundan, ihtiyaçlarına ne kadar uygun olduğunu değerlendirmelidir. Özellikle, StoreKit kullanarak In-App satın alma fiyatlarını alıyorsanız 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 şekilde sorgulanabilir:

  • NSLocale.CurrentLocale.LocaleIdentifier
  • NSLocale.AutoUpdatingCurrentLocale.LocaleIdentifier

İlk değer işletim sistemi tarafından önbelleğe alınabilir, bu nedenle kullanıcının şu anda seçili olan yerel ayarını her zaman yansıtmayabilir. Şu anda seçili olan yerel ayarı almak için ikinci değeri kullanın.

Not

Mono (Xamarin. iOS 'ın temel aldığı .NET çalışma zamanı) ve Apple 'ın iOS API 'Leri, aynı dil/bölge kombinasyonlarını kümelerini desteklemez. bu nedenle, iOS Ayarlar uygulamasında Mono 'da geçerli bir değere eşlenmediği bir dil/bölge birleşimi seçmek mümkündür. örneğin, bir iPhone dilini ingilizce olarak ayarlama ve kendi bölgesine bir, aşağıdaki apı '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 CurrentThread.CurrentUICulture , kaynakları seçmek ve CurrentThread.CurrentCulture tarihleri ve para birimlerini biçimlendirmek için kullanıldığından, mono tabanlı yerelleştirme (örneğin,. resx dosyaları), bu dil/bölge birleşimleri için beklenen sonuçları vermeyebilir. Bu durumlarda, gerektiğinde yerelleştirmek için Apple API 'Lerini kullanır.

NSCurrentLocaleDidChangeNotification

iOS NSCurrentLocaleDidChangeNotification , Kullanıcı yerel ayarlarını güncelleştirbir zaman oluşturur. Uygulamalar, çalışırken bu bildirimi dinleyebilir ve Kullanıcı arabiriminde uygun değişiklikler yapabilir.

İOS 'da yerelleştirme temelleri

Aşağıdaki iOS Özellikleri, Xamarin 'te kullanıcıya görüntülenecek yerelleştirilmiş kaynakları sağlamak için kolayca yararlanılabilir. Bu fikirlerin nasıl uygulanacağını öğrenmek için TaskyL10n örneğine bakın.

Info. plist dosyasında varsayılan ve desteklenen dilleri belirtme

Teknik Q A QA1828: IOS uygulamanızın dilini nasıl belirler, Apple, iOS 'un bir uygulamada kullanmak üzere bir dil nasıl seçtiği açıklanır. Aşağıdaki etmenler hangi dilin görüntülendiğini etkiler:

  • kullanıcının tercih ettiği diller ( Ayarlar uygulamasında bulunur)
  • Uygulamayla birlikte paketlenmiş yerelleştirmeler (. lproj klasörleri)
  • CFBundleDevelopmentRegion (Uygulama için varsayılan dili belirtenCFBundleDevelopmentRegion değeri)
  • CFBundleLocalizations (Tüm desteklenen yerelleştirmeleri belirtenCFBundleLocalizations dizisi)

Teknik Q A 'da gösterildiği gibi & , CFBundleDevelopmentRegion bir uygulamanın varsayılan bölgesini ve dilini temsil eder. Uygulama, kullanıcının tercih ettiği dillerin hiçbirini açıkça desteklemiyorsa, bu alan tarafından belirtilen dili kullanır.

Önemli

iOS 11, bu dil seçimi mekanizmasını, işletim sisteminin önceki sürümlerinden daha katı şekilde uygular. Bu nedenle, desteklenen yerelleri açıkça bildirmeyen tüm iOS 11 uygulamaları,. lproj klasörlerini ekleyerek veya için bir değer ayarlarken, iOS 11 ' de iOS CFBundleLocalizations 10 ' da olduğundan farklı bir dil görüntüleyebilir.

CFBundleDevelopmentRegionCFBundleDevelopmentRegion dosyasında belirtilmemişse, Xamarin. iOS derleme araçları şu anda varsayılan değerini kullanır en_US . Bu, gelecek sürümlerde değişebilir, ancak varsayılan dil Ingilizce 'dir.

Uygulamanızın beklenen bir dili seçtiğinden emin olmak için aşağıdaki adımları uygulayın:

  • Varsayılan dili belirtin. Info. plist ' i açın ve kaynak görünümü ' ne anahtar için bir değer ayarlamak üzere kullanın ; XML içinde, aşağıdakine benzer şekilde görünmelidir:
<key>CFBundleDevelopmentRegion</key>
<string>es</string>

Bu örnek, kullanıcının tercih ettiği dillerin hiçbiri desteklenmediği zaman, varsayılan olarak Ispanyolca olarak belirlemek için "es" kullanır.

  • Desteklenen tüm yerelleştirmeleri bildirin. Info. plistdosyasında, anahtar için bir dizi ayarlamak üzere kaynak görünümünü kullanın ; XML içinde, aşağıdakine benzer şekilde 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 bu Info. plist değerlerini de sağlaması gerekir.

Bu Info. plist anahtarları hakkında daha fazla bilgi için Apple 'ın bilgi özelliği liste anahtarı başvurusunagöz atın.

GetLocalizedString yöntemi

NSBundle.MainBundle.GetLocalizedStringYöntemi, projedeki NSBundle.MainBundle.GetLocalizedString dosyalarında depolanan yerelleştirilmiş metni arar. Bu dosyalar, bir . lproj sonekine sahip özel olarak adlandırılmış dizinlerde dile göre düzenlenir (uzantının ilk harfi küçük harfle "L").

. Strings dosya konumları

  • Base. lproj , varsayılan dilin kaynaklarını içeren dizindir. Genellikle proje kökünde bulunur (ancak kaynaklar klasörüne de yerleştirilebilecek).
  • Language > . lproj dizinleri desteklenen her dil için genellikle > klasöründe oluşturulur.

Her dil dizininde birçok farklı . Strings dosyası olabilir:

  • Yerelleştirilebilir. dizeler : Yerelleştirilmiş metnin ana listesi.
  • Infoplist. Strings – bu dosyada uygulama adı gibi öğeleri çevirmek için belirli belirli anahtarlara izin verilir.
  • görsel taslak-ad > . Strings – bir görsel taslakta 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ğerleri için sözdizimi şöyledir:

/* comment */
"key"="localized-value";

Dizelerde aşağıdaki karakterleri atlamanız gerekir:

  • \" tırnak
  • \\ sola
  • \n metninde

Bu bir örnek es/yerelleştirilebilir. Strings (IE). İspanyolca) dosyası örnekten:

"<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

İOS 'ta bir görüntüyü yerelleştirmek için:

  1. Koddaki görüntüye bakın, örneğin:

    UIImage.FromBundle("flag");
    
  2. Varsayılan görüntü dosyası flag.pngBase. lproj (yerel geliştirme dili dizini) içine 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ını flag.png kullanın.

Belirli bir dil için bir görüntü yoksa, iOS varsayılan yerel dil klasörüne geri döner ve görüntüyü buradan yükler.

Başlatma görüntüleri

her dilin . lproj dizinlerine yerleştirilirken, başlatma görüntüleri için standart adlandırma kurallarını (ve iPhone 6 modelleri için xib veya görsel taslak) kullanın.

Default.png
Default@2x.png
Default-568h@2x.png
LaunchScreen.xib

Uygulama adı

Bir . lproj dizinine bir ınfoplist. Strings dosyası yerleştirilmesi, uygulama adı da dahil olmak üzere uygulamanın Info. plistdosyasındaki bazı değerleri geçersiz kılmanıza olanak sağlar:

"CFBundleDisplayName" = "LeónTodo";

Uygulamaya özgü dizeleri yerelleştirmek için kullanabileceğiniz diğer anahtarlar şunlardır:

  • Cfpaketleyici Taadı
  • CFBundleShortVersionString
  • Nshumanreadabletelif hakkı

Tarihler ve saatler

Bir yerel ayara ilişkin tarihleri ve saatleri biçimlendirmek için yerleşik .NET tarih ve saat işlevlerini (geçerli ile birlikte) kullanmak mümkün olsa da CultureInfo , bu, yerel ayara özgü Kullanıcı ayarlarını (dilden ayrı olarak ayarlanabilir) gözardı edebilir.

NSDateFormatterKullanıcının yerel ayar tercihiyle eşleşen çıktıyı oluşturmak Için iOS 'ı kullanın. Aşağıdaki örnek kodda temel tarih ve saat biçimlendirme seçenekleri gösterilmektedir:

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 Ingilizce 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

Ispanya 'da Ispanyolca 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 Tarih Formatters belgelerine bakın. yerel ayara duyarlı tarih ve saat biçimlendirmesini sınarken hem iPhone dil hem de bölge ayarlarını kontrol edin.

Sağdan sola (RTL) Düzen

iOS, RTL kullanan uygulamalar oluşturmaya yardımcı olacak bir dizi özellik sağlar:

  • leadingtrailing Denetim hizalaması için otomatik düzen ve özniteliklerini kullanın (İngilizce için sola ve sağa karşılık gelen ancak RTL dilleri için tersine çevrilir). UIStackViewDenetim, DENETIMLERI RTL uyumlu olacak şekilde düzenlemek için özellikle yararlıdır.
  • TextAlignment = UITextAlignment.NaturalMetin hizalaması için kullanın (çoğu dil için kalır, ancak RTL için doğru olur).
  • UINavigationController otomatik olarak geri düğmesini çevirir ve çekme yönünü tersine çevirir.

Aşağıdaki ekran görüntüleri, yerelleştirilmiş Tasky örneğini Arapça ve İbranice olarak gösterir (alanlara İngilizce girilmiş olsa da):

Arapça içinde Yerelleştirme

İbranice Yerelleştirme

iOS otomatik olarak tersine çevirir UINavigationController ve diğer denetimler UIStackView otomatik düzen ile içine veya hizalı olarak yerleştirilir. RTL metni, LTR metniyle aynı şekilde . Strings dosyaları kullanılarak yerelleştirilir.

Koddaki Kullanıcı arabirimini yerelleştirme

Tasky (kodda yerelleştirilmiş) örneği, Kullanıcı arabiriminin kodda oluşturulduğu (xıbs veya görsel taslak yerine) bir uygulamanın nasıl yerelleştirileceğini gösterir.

Project yapısı

Ekran görüntüsü, yerelleştirilebilir dizelerin konumu dahil olmak üzere bir örnek için kaynak ağacını gösterir.

Yerelleştirilebilir. Strings dosyası

Yukarıda açıklandığı gibi, yerelleştirilebilir. Strings dosya biçimi anahtar-değer çiftlerinden oluşur. Anahtar, dizenin amacını açıklar ve değer uygulamada kullanılacak çevrilmiş metindir.

Örnek için Ispanyolca (es) Yereller 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ştirme gerçekleştiriliyor

Uygulama kodunda, Kullanıcı arabiriminin görüntü metninin ayarlandığı (etiketin metni veya bir girişin yer tutucusu olsun, vb.), kod, GetLocalizedString görüntülenecek doğru çeviriyi almak Için iOS işlevini kullanır:

var localizedString = NSBundle.MainBundle.GetLocalizedString ("key", "optional");
someControl.Text = localizedString;

Görsel taslak Usıs 'yi yerelleştirme

Örnek Tasky (yerelleştirilmiş görsel taslak) , bir film şeridindeki denetimlerde metnin nasıl yerelleştirileceğini gösterir.

Proje yapısı

Base. lproj dizini film şeridini içerir ve ayrıca uygulamada kullanılan görüntüleri de içermelidir.

Diğer dil dizinleri, kodda başvurulan herhangi bir dize kaynağı için yerelleştirilebilir bir. Strings dosyası ve film şeridinde metin için çeviriler Içeren bir MainStoryboard. Strings dosyası içerir.

Ekran görüntüsü, ana film şeridi dizelerinin konumu dahil olmak üzere bir örnek için kaynak ağacını gösterir.

Dil dizinleri, Base. lprojiçinde mevcut olanı 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şturup düzenlediğinizde, her bir denetimi seçin ve yerelleştirme için kullanılacak KIMLIĞI kontrol edin:

  • Mac için Visual Studio, Özellikler Bölmesi bulunur ve yerelleştirme kimliğiolarak adlandırılır.
  • Xcode 'da, nesne kimliğiolarak adlandırılır.

Bu dize değeri genellikle aşağıdaki ekran görüntüsünde gösterildiği gibi "NF3-H8-xmR" gibi bir biçimde olur:

Görsel taslak yerelleştirmenin Xcode görünümü

Bu değer, çevrilmiş metni her denetime otomatik olarak atamak için . Strings dosyasında kullanılır.

Ana görsel taslak. dizeler

Film şeridi çeviri dosyasının biçimi, yerelleştirilebilir. Strings dosyasına benzerdir, ancak anahtar (soldaki değer) Kullanıcı tanımlı olamaz, bunun yerine çok özel bir biçime sahip olmalıdır: .

Örnek MainStoryboard. aşağıdaki dizelerde , ' ın placeholder yerelleştirilebilecek bir Text özelliğine sahip olduğunu görebilirsiniz; UILabeltext , bir özelliğine sahiptir; ve UIButton varsayılan metin şu kullanılarak ayarlanır normalTitle :

"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ı içeren bir görsel taslak kullanmak, uygulamada görünmeyen Çeviriler oluşmasına neden olabilir. Apple Xcode sürüm notları , üç şeyin doğru olması durumunda film şeridi veya XIB 'nin doğru şekilde yerelleştirmeyeceğini belirtir: boyut sınıflarını kullanır, temel yerelleştirme ve derleme hedefi evrensel olarak ayarlanır ve derleme iOS 7,0 ' i hedefler. Bu çözüm, film şeridi dize dosyanızı, aşağıdaki ekran görüntüsünde gösterildiği gibi iki özdeş dosyada yinelemesidir: MainStoryboard ~ iPhone. Strings ve MainStoryboard ~ iPad. Strings:

Dizeler dosyaları

Uygulama Mağazası listeleme

Uygulamanızın satışta olduğu her bir ülkeye yönelik Çeviriler girmek için, Apple 'ın App Store Yerelleştirmesine ilişkin SSS ' ye uyar. Yalnızca uygulamanız dile ait yerelleştirilmiş . lproj dizinini içeriyorsa çevirilerin görüneceğini unutmayın.

Özet

Bu makalede, yerleşik kaynak işleme ve görsel taslak özelliklerini kullanarak iOS uygulamalarını yerelleştirme temelleri ele alınmaktadır.

Bu platformlar arası kılavuzdaIOS, Android ve platformlar arası uygulamalar (Xamarin. Forms dahil) için I18n ve l10n hakkında daha fazla bilgi edinebilirsiniz.