Uluslararasılaşma için tasarım ilkeleri

10 Cevap php

I Unicode üzerine Joel'ın yazı okudum ve ben bir karakter kümesi açısından uluslararasılaşma en azından temel bir kavrayışa sahip olduğunu hissediyorum. Okumaya ek olarak, this question, ben de hususlar tasarım açısından uluslararasılaşma benim kendi araştırma bazı yaptık, ama ben yardım edemem, ancak çok daha fazla orada olduğunu sanıyorum olamaz ben sadece don 't bilmek veya sormak bilmiyorum.

Some of the things I've learned:

  • Some languages read right-to-left instead of left-to-right.
  • Calendar, dates, times, currency, and numbers are displayed differently from language to language.
  • Design should be flexible enough to accommodate a lot more text because some languages are far more verbose than others.
  • Don't take icons or colors for granted when it comes to their semantic meaning as this can vary from culture to culture.
  • Geographical nomenclature varies from language to language.

Where I'm at:

  • My design is flexible enough to accommodate a lot more text.
  • I automatically translate each string, including error messages and help dialogs.
  • I haven't come to a point yet where I've needed to display units of time, currency or numbers, but I'll be there shortly and will need to develop a solution.
  • I'm using the UTF-8 character set across the board.
  • My menus and various lists in the application are sorted alphabetically for each language for easier reading.
  • I have a tag parser that extracts tags by filtering out stop words. The stop words list is language specific and can be swapped out.

What I'd like to know more about:

  • I'm developing a downloadable PHP web application, so any specific advice in regards to PHP would be greatly appreciated. I've developed my own framework and am not interested in using other frameworks at this time.
  • I know very little about non-western languages. Are there specific considerations that need to be taken into account that I haven't mentioned above? Also, how do PHP's array sorting functions handle non-western characters?
  • Are there any specific gotchas that you've experienced in practice? I'm looking in terms of both the GUI and the application code itself.
  • Any specific advice for working with date and time displays? Is there a breakdown according to region or language?
  • I've seen a lot of projects and sites let their communities provide translation for their applications and content. Do you recommend this and what are some good strategies for ensuring that you have a good translation?
  • This question is basically the extent of what I know about internationalization. What don't I know that I don't know that I should look into further?

Edit: Ben deneyimlerinden daha gerçek dünya örnekleri var istiyorum çünkü ben bounty eklendi.

10 Cevap

Bizim oyun Gemsweeper 8 farklı dillere tercüme edilmiştir. Ben o süreçte öğrendim bazı şeyler:

  • If the translator is given single sentences to translate, make sure that he knows about the context that each sentence is used in. Otherwise he might provide one possible translation, but not the one you meant. Tools such as Babelfish translate without understanding the context, which is why the result is usually so bad. Just try translating any non-trivial text from English to German and back and you'll see what I mean.

  • Bazı diller cümlenin başında veya sonunda değişkenler olabilir çünkü bağlamı (önceki noktaya bakın) korumak ve gerekir, çünkü Sentences that should be translated must not be broken into different parts for the same reason. budur. Yerine cümleyi ayrılma tutucuları kullanın. Örneğin, yerine

"This is step" "of our 15-step tutorial"

Gibi bir şey yazın:

"Bu bizim 15-adım öğretici bir adım% 1"

ve programlı yer tutucu değiştirin.

  • Don't expect the translator to be funny or creative. O genellikle belirli metin geçişleri isim ve ekstra onu ödemek sürece bunu yapmak için yeterince motive değildir. Eğer varsa ve kelime dil varlıkları şakalar Örneğin, onları çevirmek için denemek için bir yan not çevirmen söyleyin, ama onları dışarı bırakın veya yerine bir daha kasvetli cümle ile bunların yerine. Aksi çevirmen muhtemelen genellikle tam saçmalık sonuçları kelimesi şaka sözcüğü, tercüme olacaktır. Bizim durumumuzda biz en kritik çeviri (İngilizce) için bir tercüman ve bir şaka yazar vardı.

  • Try to find a translator who's first language is the language he is going to translate your software to, not the other way round. Aksi takdirde doğru olabilir bir metin yazmak için muhtemeldir, ama anadili tek veya eski moda geliyor. Ayrıca, o size çeviri ile hedeflediğiniz ülkede yaşayan olmalıdır. Örneğin İsviçre Almanca konuşan bir adam, bir Alman çeviri için iyi bir seçim olmaz.

  • If any possible, have one of your public beta test users who understands the particular translation verify translated assets and the completed software. Biz sağlanan kişiye bağlı olarak, bazı çok iyi ve çok kötü çeviriler yaşadım. Bazı kullanıcılarımız göre, İsveççe çevirisi toplam saçmalık olduğunu, ancak bu konuda bir şey yapmak için çok geç oldu.

  • Be aware that, for every updated version with new features, you will have to have your languages assets translated. Bu, bazı ciddi yükü oluşturabilir.

  • Be aware that end users will expect tech support to speak their language if your software is translated. Bir kez daha, Babelfish muhtemelen yapmayacağım.

Edit - Some more points

  • Make switching between localizations as easy as possible. Gemsweeper, biz farklı diller arasında geçiş yapmak için bir kısayol tuşu var. Bu test çok daha kolay hale getirir.

  • If you are going to use exotic fonts, make sure these include special characters. biz Gemsweeper için seçtik yazı tipleri İngilizce metin için iyi, ama biz sadece, Fransızca, Almanca Portughese, İsveççe, mevcut elle epeyce karakterler eklemek zorunda kaldım ...

  • Don't code your own localization framework. Sen Gettext gibi açık kaynak kodlu bir çerçeve ile kapalı muhtemelen çok daha iyiyiz. Gettext cümleler veya pluralization değişkenlerin gibi özelliklerini destekler ve kaya gibi sağlam olduğunu. Yerelleştirilmiş kaynakları derlenmiş, bu yüzden kimse onları kurcalamak. Ayrıca, başkasının çeviri kontrol ve tüm dizeleri düzgün temel kaynak kodunu değiştirmek durumunda hala güncel tercüme ve emin yapma / dosyalarınızı çeviri için Poedit gibi araçlar kullanabilirsiniz. Ben hem benim kendi haddeleme ve yerine GetText kullanıyorum ve Gettext artı poEdit yolu üstün olduğunu söylemek gerekir denedim.

Edits - Even More Points

  • Understand that different cultures have different styles of number and date formats. Numaralandırma düzenleri o kültürü değil, sadece farklı kültür başına değil, aynı zamanda amaç başınadır. EN-US size bir numarasını biçimlendirmek olabilir '-1234'; Sayısının amacı ne bağlı '-1234' ya (1234). Anlayın diğer kültürlerin aynı şeyi yapmak.

  • Know where you're getting your globalization information from. Ör , Windows CurrentCulture, UICulture ve InvariantCulture için ayarları vardır. Her biri demektir ve nasıl (onlar sizin düşündüğünüz kadar açık değil) sistem ile etkileşime anlıyorum.

  • If you're going to do east Asian translating, really do your homework. Doğu-Asya dilleri buradan dillerinden epeyce farklılıklar var. Aynı anda kullanılan birden fazla alfabe sahip olmanın yanı sıra, farklı düzen sistemleri (top-down) veya ızgara tabanlı kullanabilirsiniz. Ayrıca doğu Asya dillerinde sayıları çok farklı olabilir. En-us size sadece sınırlı koşullarda sistemleri (1 karşı örn. 1) değiştirmek, sadece virgül ve bir süre yanında ek sayısal konular vardır.

Biz Dreamfall ve Age of Conan ve i18n/l10n konularında çalıştı, aklımızda tutarak değer bir kaç sorunlar geldi. Biz çözüldü Bunlardan bazıları, bazıları bizim için çözülmüştür, ve bazı biz etrafında çalıştı edildi. Bazıları çözüldü asla ...

  • Tüm araçlar emin olun ve tüm kodunuzu kullanmak istediğiniz her karakter kümelerini destekler ve çift projenin seyri ve bir kaç kez daha emin olmak için iki kez sırasında bu varsayımı kontrol edin.

  • Eğer kullanmak istediğiniz tüm dilleri destekleyen bir yazı tipi kullanın emin olun. Unicode olduğunu iddia çoğu font o sahip karakterler doğru codepoint altında olduğunu anlamda sadece unicode vardır. Bu tüm codepoints için kullanılabilir karakter vardır anlamına gelmez.

  • Bazı diller kelimeler (çince akla gelir) ayırmak için değil use alanı gibi metin sarma, sadece boşluk yapılır değildir. Metin kaydırma rutinleri hiç bir boşluk olmadan metni işleme emin olun.

  • Çoğul doğru taşıma kolay durumlarda zor ve sert durumlarda sert lanet. Eğer doğru çoğul sorunu işlemek için kod yazmak mümkün kullanarak olacak dilleri hakkında yeterli bildiğinizden emin olun. İngilizce (ve diğer "Batılı" dil kolay olanlar arasında olduğunu aklınızda tutun.

  • Cümleleri kırmak ve değişken farklı bir dilde cümle içinde başka bir yerde yerleştirilmiş olabileceği gibi, bir değişken sığdırmak için onlarla dizeleri inşa asla. Tutucuları kullanın.

  • Bazı diller için, yer tutucu değeri cümle yazmak nasıl değişebileceğini unutmayın. Dilbilgisi zordur. Onunla başa çıkmak için bir planı var emin olun. (Özellikle, cinsiyet, zaman, vb göre yer tutucuların içinde kullandığınız değerleri sınıflandırmak için bir yol olduğundan emin olun).

  • My menus and various lists in the application are sorted alphabetically for each language for easier reading.

Listeler menüler olmamalı, tasnif edilmelidir. Belirli bir kullanıcı birden fazla dilde uygulamayı kullanmak isteyebilirsiniz unutmayın, o hala aynı yerde her yerde bulmak gerekir.

kısayollar ile aynı, eğer varsa: do not translate them.

Ayrıca, ayrı ayrı yönetmek, uluslararasılaşma ve çeviri iki çok farklı şeyler olduğunu unutmayın.

Ben aşağıdaki yorum yapmak istiyorum - bu sınıf-1 ürün 31 Farklı yerlerde çevrilen bazı şirket kurallar vardır. Bu yönergeleri izleyerek bize (daha doğrusu tüm şirket daha bizim geliştirme ekibi) çeviride büyük verimlilik verdi.

  • Hata mesajları parçacıkları yeniden kalkmayın. Örneğin, iki hata "You selected the wrong menu item" ve "That menu item is not yet available" çünkü, ayrı bir madde halinde "menu item" ayıklamak ve her iki yerde de kullanabilirsiniz sanmıyorum . All mesajları kendi çeviriler bağlamında dayanarak değişebilir olarak kendini bulunan olmalıdır.

  • Teknolojisi hakkında bir professional translator bilgili kullanın. Babelfish gibi bir hizmet yakınında giderseniz, size hak her şeyi almak için gidiyoruz. Örneğin, "Microsoft Windows" "Microsoft Windows" her yerde gezegende, bu "Microsoft Fenster" Almanya'da olmaz değildir.

  • Pozisyonları beri, aslında, cinsiyet değişebilir (örneğin "The %1 has failed" %1 dinamik olarak değişir nereye kadar) değişkenleri within sizin mesajları gömmemeyi deneyin: {[(3) }] genel "L'Homme est drunk" ya da "The red table" vs "La table rouge". Iyi eklenmiş parametreleri ile genel bir isim kullanmak için: "The item has failed [%1]".

  • Sadece kullanıcı see., bir günlük dosyasında mesajları yapın bekleniyor şeyler (sadece sen kullanacak) İngilizce (veya anadil) olmalıdır çevirmek, 'sen edemedim Swahili gibi bir şey tercüme değil t zaten okuyun.

  • Menüler düzeni harmanlama değil, işlevine göre tasnif edilmelidir.

  • Çevrilebilir birimleri koduna external saklanır ve zamanında yüklü olmalıdır. Bu çeviri sadece kod ortasına değişiklikleri kerata çalışmıyorum, dış dosyayı kapalı nakliye bir konu yapar. Ayrıca gelecekte daha kolay diğer dilleri ekleyerek yapar.

Şimdilik bu kadar yeter. Önce tüm sonbahar uykuda :-) durdurmak için daha iyi

Ben bir sürü kadar büyük yanıtlar eklemek zorunda değilsiniz, ama burada dikkate almanız gereken birkaç şey vardır ve kontrol etmek.

  • Don't make assumptions. Bu catch tüm kuraldır. Bu bölge veya dil özgü şeyleri kabul etmek kolaydır ve bu varsayımları fark etmek zordur.
  • Be very careful with string comparisons. görsel diğerlerine benzer ancak farklı olan harfler var bu Türk gibi bazı diller, vardır.
  • Bir kaynak dosyadan tercüme dizeleri okursanız Use pseudo translation as a smoke test., hala sizin için anlaşılabilir ama uygulamada her çevrilebilir dize kapasitesini ve yeteneğini vurguluyor hangi dosyanın sahte çevrilmiş sürümünü oluşturmak. Örneğin, ped üzerinden gibi bir şey ile "İptal" gibi bir dize "CancelXXXX!" tercüme dizeleri için ödenek olarak geniş şekilde. Sonra her katarı gösterecektir doğrulamak için test edebilirsiniz. Aynı zamanda her yerde doğru görüntüler doğrulamak için işlenecek muhtemel en karmaşık karakter yapışmasını için ekstra kredi.
  • Don't make assumptions about keyboard layouts. "ASDW" diğer klavye düzenleri olan insanlar için kullanmak, imkansız düşmanca yapan bir QWERTY klavyeler için yön tuşları büyük kumanda seti, ama zor kodlama olabilir, eğer olmayabilir.
  • Test various date settings, then test them again. Ben nedeniyle bölgesel ayarlarında "AM / PM" için farklı bir formatta gibi küçük bir şey, sorunları gördük. Gg / aa / yyyy vs aa / gg / yyyy da çok geliyor, ama burada ayar her önemli olabilir.
  • Test various number formats, then test them again. Örneğin, ondalık veya binlerce ayırıcılar bağlıdır istemiyorum.
  • Test with and without a user logged in to the server. Bu fazla Windows özgü olabilir, ama o kullandığı gibi yapılandırılmış sunucu üzerinde bir bileşen almak çok kolay bir kullanıcı oturum açmış ve bir varsayılan bölgesel ayar ise kullanıcının bölgesel ayarlarına giriş yaptığında Bu garip, aralıklı davranışa neden içeri kullanıcı oturum değil.
  • Test with various regional and language settings. Bir örnek olarak Windows bölgesel ve dil ayarları, ancak IE kendi dil ayarına sahip değil sadece. Ile bir IE müşteri davranışı en-us ilk listelenir ile her zaman biri olarak aynı olmayabilir tr-tr, örneğin, ilk listelenir.
  • Make sure your translator understands the business and the languages, then cross check with someone else., uygulama özel terminoloji kullanmak her zaman çok dikkatli olun. Program uygulama özel bir şey demek için belirli sözcükleri kullanıyorsa, onlar yardım metni de dahil olmak üzere, her durumda benzer bir şekilde çevrilir emin olun. Belirli dil hedeflerini varsa vaktinden gibi sözlerini tercüme ve hedef dillerde kötü tercüme yok emin olmak için, hatta şimdiye kadar gidebilir. Bu bir ürün araştırma şey daha, ama sözler arayüzünde kullanılan ne bir fark yaratabilir, ve bu sözler başından itibaren yerinde ise herkes üzerinde daha kolaydır. Ayrıca iyi tercüme olmayabilir deyimler önlemek istiyor.

Tamam, ben düşündüm daha söyleyecekleri vardı ...

Sayılarla ilgili bir şey: İngilizce, anladığım kadarıyla, sadece 2 veya daha fazla olan bir 1 ile tekil ve çoğul kullanın. Gibi: "Siz 1 mesajınız var"; "2 mesajlar"; "3 ... mesajlar". Rus, bu işler biraz daha karışıktır. Sen 1, 21, 31, 41 ... 101, 121 (yani, bu 11 ile bitiyor hariç 1 ile biten her şey için) için tekil kullanın. Sonra singular genitive case, 2, 3, 4 için kullanmak; 22, 23, 24; 32, 33, 34 ... 102, 103, 104; 122, 123, 124. Ve kullandığınız tüm diğer durumlarda plural genitive case.

Bu uygulamak için gerçekten çok zor değil. is zor olsa da tüm garabeti ile herhangi bir priori bilinmeyen bir dil ile nasıl başa bilecek bir şey uygulamak nedir :-)

Ve bu sadece numaralar bulunuyor :-)

Ben zor yoldan öğrendim bir şey: daha sonra bu etiketi için tüm klasör arama yapabilirsiniz böylece tercüme edilmesi gereken birkaç dosya varsa, adına ekstra bir etiketi içerir.

örneğin bunun için bir dosya 'örnek-database.txt' adlandırma İngilizce versiyonu 'örnek-veritabanı-loc-en.txt', İtalyan versiyonu 'örnek-veritabanı-loc-it.txt isim

Bazı aptal dedi eğer StackOverflow benim ilk cevap, yani bağışlayın.

Benim deneyim:

  • PHP: gettext son derece yararlı olmuştur;
  • non-western languages: UTF-8 yerde (kod, DB) ve şimdiye kadar biz de yapıyoruz;
  • Are there any specific gotchas that you've experienced in practice?, farklı cümleler içine i18n için uzun paragraflar Breaking çevirmek için daha az pahalı olabilir, dize tekrarlanır, daha fazla sitede birden sadece bir kez tercüme olması gerekir. Eğer çok fazla çevirmenler bağlamını kaybedecek metni parçalara Ama, dikkatli olun;
  • Bunun için gitmek gönüllüler çok sayıda var, ama ne kadar metin bağlı ise I've seen a lot of projects and sites let their communities provide translation for their applications and content. Do you recommend this and what are some good strategies for ensuring that you have a good translation?, gerçekten gönüllü bir ton gerekebilir. Her zaman size çeviri doğruluğunu kontrol ispat-okuyucu olmak için bir dil projesinin lideri olan güvendiğiniz birine sahip olduğunu emin olun.

Evet, bu bir massive tabidir. Başlarken çalışma hakkı bir çok şey olduğunu.

Benim programda ben metnin her parça için bir tamsayı tuşunu kullanmak ve dile bağlı olarak gerektiği gibi bir dosyaya bakmak. Her yerde kodu hiçbir edebi dizeleri, sadece tuşları var. Ben C + + 'da bir "enum" ile onları tanımlamak yüzden aslında numaralarını yazarak değilim. Ben daha Çeteleler ekleyin ve çevirmenler boşlukları doldururken, çeşitli dil dosyalarını senkronize etmek için bir yardımcı program yazdı.

Her anahtar ayrıca vb ilişkili bir araç ipucu, görüntü, klavye kısayolu var

Saatleri ve tarihleri ​​gelince ... yine, bu çok daha karmaşık düşündüğünüzden daha ama PHP sizin için bu işlemek değil? (Bilmiyorum, ben bir C + + adam değilim ...)

PHP dahili bayt-akarsu gibi dizeleri temsil ve iso-8859-1 varsayar, kodlama konular durumlar için. Çoğunlukla, sadece her yerde UTF-8 kullanabilir ve iyi olacak. Bir Yakaladım, Siteniz kullanıcılardan giriş alırsa, onlar doğru kodlama içeriği gönderiyorsunuz% 100 emin olamaz olmasıdır. Sen mb_detect_encoding giriş doğrulamak için kullanabilir, ya da karşı doğrulamak için "egzotik" karakterleri ile gizli bir alan kullanmak isteyebilirsiniz.

PHP tüm dize ilgili fonksiyonları, bir karakter olarak bu iş, o karakter = bayt varsayalım ki farkında olun. Bu genellikle dize işlevlerini güven anlamına gelir. Daha fazla bilgi için this page bakabilirsiniz.

PHP için iyi bir kaynaktır Nick Nettleton's cheatsheet.

Çok yakından charsets / kodlamalar ile ilgili bir konudur collation. Eğer birlikte çalıştığınız dil / kültür maç için alfabe gerekir. En azından MySql (muhtemelen diğer RDBMS'es de içinde), bu tür başına veritabanı gibi farklı düzeylerde, üzerinde harmanlama belirtebilirsiniz, başı masanın, kolonu başına ve hatta sorguda kendisi.