Dize kaynakları neden kodun dışında değil, genellikle kodun dışında tutulur?


18

Genellikle, birçok platformda, dize kaynaklarımı bir .resx veya .xml dosyasına yazıyorum ve sonra platforma bağlı bir yaklaşım kullanarak alıyorum.

Yani, iOS'ta, bunları Android'de NSBundle.MainBundleve kullanarak kullanıyorum Context.Resources.

Bu yaklaşımın avantajları nelerdir ve neden kodda doğrudan erişilebilir olmamasının nedeni, örneğin:

  1. Bir platformlar arası projede, herhangi bir platform, herhangi bir entegrasyon olmadan doğrudan erişebilir.

  2. Bina sırasında kaynakların iyi inşa edilip edilmediğine dair herhangi bir endişe yoktur.

  3. Kodlayıcı, çok dilli işlem gibi işlevleri kullanabilir

Uzun lafın kısası: string kaynaklarının bu şekilde yapılandırılmasının nedeni nedir?

[Düzenle]

Diyelim ki dosyam diğer proje arasında paylaşılan bir "çekirdek" projenin parçası. (PCL, platformlar arası proje dosyası yapısını düşünün.)

Ve varsayalım ki dosyam tam olarak bir .resx / .xml dosyasına benziyor, şöyle görünüyor (xml'de profesyonel değilim, üzgünüm!): Parametreler Paramètres

Yani, bu temelde özel bir xml'dir, burada doğru dizeyi almak için anahtar / dile işaret edin.

Dosya, tıpkı bir uygulamanın içine erişilebilir herhangi bir dosyayı ve sistemin PCL kullanılarak kodlanan dize kaynaklarına erişmesi gibi uygulamanın bir parçası olacaktır. Bu, uygulamalara ek yük getirir mi?



6
Hayır, endişelerim Uluslararasılaşma ile ilgili değil, daha ziyade mimari ve platformlar arası değil, üzgünüm.
Léon Pelletier

1
Bu soru, yerelleştirme / uluslararasılaşma kolaylığı bir yana bile, her türlü kaynağa genelleştirilebilir. Herhangi bir kaynağı koddan ayrı tutmanın avantajları nelerdir? Neden görüntülerde veya ses dosyalarında genellikle ikili dizeler olarak kodlanmıyor? (Elbette veri URI'leri vardır, ancak büyük dosyalar için genellikle pratik değildir). Diğerleri zaten bazı oldukça iyi cevaplar verdiler, ancak sadece kullanıcı tarafından okunabilir dizelerin dışsallaştırılmadan fayda sağlayan tek kaynak türü olmadığını belirtmek istedim.
JAB

Yanıtlar:


38

Yerelleştirme ve uluslararasılaşma,

Dizeleri harici tutmak, yeniden derlemeye gerek kalmadan değiştirmelerine (okuma: çevrilmiş) izin verir (yalnızca en fazla yeniden bağlanma ve en iyi şekilde yeni bir klasöre bırakma).


Bu yeniden bağlama vs yeniden derleme iyi bir neden, teşekkürler.
Léon Pelletier

2
Hala sorunu anlayan tek kişi.
Léon Pelletier

3
@ratchetfreak çok erken kabul etmek kötü bir formdur (saatler içinde kesinlikle önemlidir.) Diğer cevapların kabarması için zaman vermez. Bu basit, ve doğru ve doğrudur ... ama birisi yarın (veya bu ay için gelecek ay) daha iyi, daha eksiksiz, daha ayrıntılı bir cevap getirebilir.
WernerCD

3
Ekstra: Bir çevirmenin bir XML dosyasını düzenlemesi uygun olabilir, ancak gerçek kodun yakınında
gezinmelerine

Şimdi soru şu: "Bu cevap hala yorumlanmış diller için geçerli mi?". Soruyorum çünkü yeniden bağlanma veya yeniden derleme olmayacaktı.
Thomas Eding

10

Yalnızca dize kaynaklarını içeren bir dosyanız varsa, kaynak dosyasını bir çeviri kuruluşuna veya bunun gibi bir şeye verebilir ve çeviri alabilirsiniz. Bazı çeviri yapmak için bir layperson için çok sayıda kod dosyası vermek zorunda kalacağını tahmin edebilirsiniz (belki de kodunuzu kime vermek istemiyorum).


2
Projeye dahil olan bir dosya ile bir kaynak dosya arasında hiçbir fark yoktur. Sorun orada değil.
Léon Pelletier

Kaynakları doğrudan koda dahil etme ve daha sonra programın içindeki her şeyi işleme hakkında konuşuyorum, bu yüzden daha fazla PCL / Çapraz platform dostu.
Léon Pelletier

2
tüm dize kaynaklarınızla (sözlük tanımı veya bunun gibi bir şey) bir "kod" dosyanız varsa ve içinde başka bir şey yoksa .. temelde bir kaynak dosyasıdır (ancak tek bir platform için bir tane, örneğin android herhangi bir objektif-c kodu alın). İçinde başka bir kod varsa veya birden fazla dosyaya bölünmüşse harici çeviri almak daha zordur. Platformlar arası bir görünümde, xml gibi bir metin biçiminin, herhangi bir dil / platformda okuyabileceğiniz ve kullanabileceğiniz bir avantaja sahiptir (ancak biraz çalışmanız gerekebilir)
Flo

7

Uluslararasılaştırma / yerelleştirmeye ek olarak, metin dizelerini bu şekilde ayırmak, bir prova okuyucunun messages.${LOCALE}gerçek bir kaynak kod dosyasına dokunmadan yazım / dilbilgisi / noktalama işaretine yönelik düzeltmeler göndermesine de izin verir . Kod değişikliklerinde karartma olabilir, ancak bu tür metin düzeltmelerini kabul edebilirsiniz. Hem kodda hem de iletilerde eşzamanlı değişiklikleri kabul ediyorsanız, kod değişikliklerinin redaksiyon denetleyicisi teslim alındığında var olan iletileri yeniden tanımlamaması koşuluyla, yamaların birleştirilmesini kolaylaştırır messages.en_US.

Ayrıca, nasıl uygulandığına bağlı olarak, uygulamayı yeniden bağlamak bile gerekli olmayabilir. Kod, messages.${LOCALE}belirli bir mesaj için satır 138'i alabilir , satır numarası çalışma zamanında belirlenir.


0

Bu, dilinizin / platformunuzun dizelerin yerelleştirilmesini uygulamaya karar vermesidir. Yerelleştirmeye yönelik tüm yaklaşımlar, çevirileri almak için bir tür harici kaynak dosyasına ihtiyaç duyar. Ana acı noktası, bu kaynakları nasıl koruduğunuzdur.

Görünüşe göre bu kaynak dosyalarını elle tutmanız gerekiyor , ki bu oldukça fazla bir yük olabilir. Aynı zamanda tekrarlanan dizelerin paylaşımını da zorlaştırır. Ve şu anda sadece bir dil gönderiyorsanız bunu yapmak daha da fazla bir yüktür.

Yaygın bir alternatif, GNU Gettext yaklaşımının sadece kaynak koddaki çevrilebilir dizeleri işaretlemesi ve bu dizeleri otomatik olarak çapraz platformlar ve çapraz dillerle çalışan standart PO dosyalarına çıkarmasıdır. Geliştirici bakış açısından, XML kaynak dosyalarının manuel bakımını her gün yener.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.