Bu soruyla birkaç aydır mücadele ediyorum, ancak daha önce tüm olası seçenekleri araştırmam gereken bir durumda değildim. Şu anda, olasılıkları öğrenmenin ve yaklaşan projelerimde kullanmak için kendi kişisel tercihimi yaratmanın zamanı geldiğini hissediyorum.
Önce aradığım durumu çizeyim
Uzun süredir kullandığım bir içerik yönetim sistemini yükseltmek / yeniden geliştirmek üzereyim. Ancak, çoklu dilin bu sistem için büyük bir gelişme olduğunu hissediyorum. Daha önce hiçbir çerçeve kullanmadım ama yaklaşan proje için Laraval4'ü kullanacağım. Laravel, PHP'yi kodlamanın daha temiz bir yolu olarak görünüyor. Sidenote: Laraval4 should be no factor in your answer
. Platformdan / çerçeveden bağımsız genel çeviri yollarını arıyorum.
Ne tercüme edilmeli
Aradığım sistemin mümkün olduğunca kullanıcı dostu olması gerektiğinden, çeviriyi yönetme yöntemi CMS içinde olmalıdır. Çeviri dosyalarını veya html / php çözümlü şablonları değiştirmek için bir FTP bağlantısı başlatmaya gerek yoktur.
Ayrıca, belki de ek tablolar yapmak gerek kalmadan birden fazla veritabanı tabloları çevirmek için en kolay yolu arıyorum.
Kendime ne buldum
Kendimi araştırırken, okurken ve denerken zaten. Sahip olduğum birkaç seçenek var. Ama hala gerçekten aradığım şey için en iyi uygulama yöntemine ulaştığımı düşünmüyorum. Şu anda, ben bu kadar geldim, ama bu yöntemin de yan etkileri var.
- PHP Ayrıştırılmış Şablonlar : şablon sistemi PHP tarafından ayrıştırılmalıdır. Bu şekilde, çevrilmiş parametreleri HTML'ye şablonları açıp değiştirmek zorunda kalmadan ekleyebilirim. Bunun yanı sıra, PHP ayrıştırılmış şablonları bana her dil için bir alt klasör (daha önce sahip olduğum) yerine bir web sitesi için 1 şablon var yeteneği verir. Bu hedefe ulaşma yöntemi Smarty, TemplatePower, Laravel's Blade veya başka bir şablon ayrıştırıcı olabilir. Dediğim gibi bu yazılı çözümden bağımsız olmalıdır.
- Veritabanına Dayalı : Belki bundan tekrar bahsetmem gerekmiyor. Ancak çözüm veritabanına dayalı olmalıdır. CMS nesne odaklı ve MVC olması amaçlanmıştır, bu yüzden dizeleri için mantıklı bir veri yapısı düşünmek gerekir. Benim şablonları yapılanmış olmalıdır gibi: şablonları / Kontrolör / View.php belki de bu yapının en mantıklı olur:
Controller.View.parameter
. Veritabanı tablosunda bu alanlar birvalue
alanla uzun olur . Şablonların içinde gibi bir sıralama yöntemi kullanabilirizecho __('Controller.View.welcome', array('name', 'Joshua'))
ve parametre içerirWelcome, :name
. Böylece sonuçWelcome, Joshua
. Bu, bunu yapmak için iyi bir yol gibi görünüyor, çünkü: name gibi parametrelerin editör tarafından anlaşılması kolaydır. - Düşük Veritabanı Yükü : Elbette yukarıdaki sistem, bu dizeler hareket halindeyken yüklüyse bir sürü veritabanı yüküne neden olur. Bu nedenle yönetim ortamında düzenlendikleri / kaydedildikleri anda dil dosyalarını yeniden işleyen bir önbellek sistemine ihtiyacım olacaktı. Dosyalar üretildiğinden, iyi bir dosya sistemi düzeni de gereklidir. Sanırım
languages/en_EN/Controller/View.php
size en uygun olan veya .ini ile gidebiliriz . Belki bir .ini sonunda daha hızlı ayrıştırılır. Bu, içindeki verileri içermelidirformat parameter=value;
. Sanırım bu bunu yapmanın en iyi yolu, çünkü oluşturulan her Görünüm, varsa kendi dil dosyasını içerebilir. Daha sonra, dil parametrelerinin birbirlerinin üzerine yazmasını önlemek için dil parametreleri genel bir görünüme değil belirli bir görünüme yüklenmelidir. - Veritabanı Tablosu çevirisi : bu aslında en çok endişelendiğim şey. Haberler / Sayfalar / vb. Çeviriler oluşturmanın bir yolunu arıyorum. olabildiğince çabuk. Her modül için iki tabloya sahip olmak (örneğin
News
veNews_translations
) bir seçenektir, ancak iyi bir sistem elde etmek için çok çalışmak gibi hissettirir. Bir dayanmaktadır ile geldi şeylerden biridata versioning
Yazdığım sistemde: Bir veritabanı tablo adı varTranslations
, bu tablo benzersiz bir kombinasyonu vardırlanguage
,tablename
veprimarykey
. Örneğin: en_En / News / 1 (Haber öğesinin ID = 1 olan İngilizce sürümüne bakıldığında). Ancak bu yöntemin 2 büyük dezavantajı vardır: her şeyden önce bu tablo, veritabanında çok fazla veri ile oldukça uzun olma eğilimindedir ve ikincisi, tabloyu aramak için bu kurulumu kullanmak bir iş cehennemi olacaktır. Örneğin öğenin SEO slug aramak oldukça aptal bir tam metin arama olacaktır. Ancak öte yandan: bu, her tabloda çok hızlı bir şekilde çevrilebilir içerik oluşturmanın hızlı bir yoludur, ancak bu profesyonelin konilerin ağırlığını aştığına inanmıyorum. - Ön Uç Çalışması : Ayrıca ön uç biraz düşünmeye ihtiyaç duyacaktır. Tabii ki mevcut dilleri bir veritabanında saklayacağız ve (de) ihtiyacımız olanları aktifleştireceğiz. Bu şekilde komut dosyası bir dil seçmek için bir açılır liste oluşturabilir ve arka uç otomatik olarak CMS kullanılarak hangi çevirilerin yapılabileceğine karar verebilir. Seçilen dil (ör. En_EN), bir görünüm için dil dosyasını alırken veya web sitesindeki bir içerik öğesi için doğru çeviriyi alırken kullanılır.
Yani, işte buradalar. Fikirlerim şimdiye kadar. Henüz tarihler için yerelleştirme seçeneklerini bile içermiyorlar, ancak sunucum PHP5.3.2 + 'ı desteklediğinden, en iyi seçenek intl uzantısını burada açıklandığı gibi kullanmaktır: http://devzone.zend.com/1500/internationalization-in -php-53 / - ama bu daha sonraki gelişim stadyumlarında kullanılabilir. Şimdilik ana sorun, bir web sitesindeki içeriğin çevirisi için en iyi uygulamalara nasıl sahip olacağınızdır.
Burada açıkladığım her şeyin yanı sıra, henüz karar vermediğim başka bir şeyim var, basit bir soruya benziyor, ama aslında bana baş ağrısı veriyor:
URL Çevirisi? Bunu yapmalı mıyız yapmamalı mıyız? ve ne şekilde?
Yani .. bu url varsa: http://www.domain.com/about-us
ve İngilizce benim varsayılan dilim. Kendi http://www.domain.com/over-ons
dilim olarak Hollandaca'yı seçtiğimde bu URL'nin çevrilmesi gerekir mi? Ya da kolay yoldan gidip sayfanın içeriğini görünür durumda değiştirmemiz gerekir /about
. Sonuncusu geçerli bir seçenek gibi görünmüyor, çünkü bu aynı URL'nin birden çok sürümünü üretecek, içeriği dizine ekleme doğru şekilde başarısız olacaktır.
http://www.domain.com/nl/about-us
Bunun yerine başka bir seçenek kullanıyor . Bu, her içerik için en az benzersiz bir URL oluşturur. Ayrıca, bu başka bir dile gitmek daha kolay olurdu http://www.domain.com/en/about-us
ve sağlanan URL hem Google hem de İnsan ziyaretçiler için anlaşılması daha kolaydır. Bu seçeneği kullanarak varsayılan dillerle ne yaparız? Varsayılan dil, varsayılan olarak seçilen dili kaldırmalı mıdır? Yönlendirme Yani http://www.domain.com/en/about-us
için http://www.domain.com/about-us
CMS tek dil için kurulum olduğunda URL'de bu dil bir kimlik sahibi olmak gerek yoktur, çünkü benim gözünde ... Bu, en iyi çözümdür.
Ve üçüncü bir seçenek her iki seçenekten oluşan bir kombinasyondur: http://www.domain.com/about-us
ana dil için "dil-kimliksiz" -URL ( ) kullanılması. Ve alt diller için çevrilmiş bir SEO bilgisine sahip bir URL kullanın: http://www.domain.com/nl/over-ons
&http://www.domain.com/de/uber-uns
Umarım sorum başınızı çatlatır, kesin benimkini çatlattı! Burada bir soru olarak işlerimi halletmeme yardımcı oldu. Bana daha önce kullandığım yöntemleri ve yaklaşan CMS'im için sahip olduğum fikri gözden geçirme imkanı verdi.
Bu metni okumak için zaman ayırdığınız için şimdiden teşekkür ederim!
// Edit #1
:
Bahsetmeyi unuttum: __ () işlevi belirli bir dizeyi çevirmek için bir takma addır. Bu yöntemde, henüz çeviri olmadığında varsayılan metnin yüklendiği bir çeşit geri dönüş yöntemi olmalıdır. Çeviri eksikse, ya eklenmeli ya da çeviri dosyası yeniden oluşturulmalıdır.