PHP uygulamalarında çoklu dil uygulamak nasıl?

5 Cevap php

Ben tam bir açıklama ya da bunu yapmak için en iyi yol yoktur sonrası bir tane buldum ben kendi bu soru göndermeden değilim.

Ben gibi öğeleri isim dil dosyasını kullanmalısınız:

$first_name= 'name'; $last_name = 'last_name';

ve daha sonra seçime bağlı olarak bu dosyayı içerir?

Ben iki dilde olması gereken bir uygulama var.

Bu satırları bir şey gibi olacak:

http://www.myapp.com/?lang=en http://www.myapp.com/?lang=es

Ben bu amaç için bir sabitleri dosyası kullanmak gerekir?

constants.php

('OPERATION_NOT_ALLOWED_EN', 'Bu işlem izin verilmiyor!') tanımlamak;

('OPERATION_NOT_ALLOWED_ES', '! Bu işlem izin verilmiyor') tanımlamak;

Bunu sağlamanın önerilen yolu nedir?

5 Cevap

Sen phpBB izinden - onlar gibi görünüyor kodu ile bir $lang[] dizisi kullanın:

$lang['Next'] = 'Next';
$lang['Previous'] = 'Previous';
$lang['Goto_page'] = 'Goto page';
$lang['Joined'] = 'Joined';
$lang['IP_Address'] = 'IP Address';

$lang['Select_forum'] = 'Select a forum';
$lang['View_latest_post'] = 'View latest post';
$lang['View_newest_post'] = 'View newest post';
$lang['Page_of'] = 'Page <b>%d</b> of <b>%d</b>'; // Replaces with: Page 1 of 2 for example

$lang['ICQ'] = 'ICQ Number';
$lang['AIM'] = 'AIM Address';
$lang['MSNM'] = 'MSN Messenger';
$lang['YIM'] = 'Yahoo Messenger';

Bu kullanıcının ayarlarında belirtilen bir dosyadan dahil tabii ki, ama sen bir constants.php dosyasına benzer bir şey erişen sorgu dizesinde ?lang=en sizin önerisi ile iyi olurdu.

Sen lang_en.php dosya veya netlik için benzer bir şey adlandırmak isteyebilirsiniz.

Sizin örnekte verdim gibi dizeler için çalışacaktır. Ancak başka komplikasyonlar vardır. Örneğin, yereli için uygun formatta tarihleri ​​(es vs tr?) Biçimlendirmek istiyorum. Nasıl numaraları ve para biçimlendirme hakkında? "Gelen kutunuzda $ x mesajınız var:" Ayrıca, "dinamik" mesajı olabilir. Eğer değişkenler geçmek istediğiniz yere. Php yerelleştirme kütüphanelerin bazı göz atın. İşte bir çevrimiçi öğretici: http://www.devx.com/webdev/Article/38732.

Ayrıca kullandığınız çerçevede bakmak. Birçoğu yerelleştirme desteği var.

Bunu nasıl uygulamak gerekir? Gibi Zend_Translate .

Ben örneğin sabitler, ile yerele özgü dosyaları kullanmak:

locale_en.php:

define('GREETING', "Welcome to Widgets Inc');

ve

locale_de.php:

define('GREETING', 'Wir begruessen Sie zu Widgets Inc');

in your setup you detect the locale ve do:

if ($locale == 'en') {
  require 'locale_en.php';
} else if ($locale == 'de') {
  require 'locale_de.php';
}

This gives you the benefit of constants ve makes localization reasonably transparent to your application in that you don't have to do if ($locale ... all over the place. If anything is locale-specific, just put it in the locale files.

If you want to add a locale file just copy an existing one ve change all the references rather than trawling your codebase for them.

You can also put code in these files like correctly formatting numbers ve dates for these locales (including the right names in each language but also the use of commas, quotes, periods ve so on), currency conversions ve displays, etc.

(Ben oluşturmak için bir veritabanı programı yazdı, düzenlemek ve bu biçime ihracat) bir ISO standardı XML dosyasını kullanarak bunu yapmak için ücretsiz 3. taraf denetimleri vardır.

Diğer cevaplar çok manuel ve bu denetimi yapar kullanarak daha fazla iş gerektirir.

The control you need is found at: http://ezcomponents.org/docs/api/trunk/introduction_Translation.html

EZ Bileşenleri sunucuda yüklü sonra, tüm EZ bileşenleri için gerekli taban kontrolünü almak gerekir

require_once "ezc/Base/base.php";
/**
 * __autoload()
 *
 * @param mixed $className
 * @return
 */
function __autoload( $className )
{
    ezcBase::autoload( $className );
}

XML dil dosyasının bulunduğu Sonra tanımlamanız gerekir (bkz.: ISO639-2, ISO3166 ve Qt Dilbilimci)

$config["language_code"] = "en_us"; // as defined by ISO639-2 and ISO3166

// grab our translation XML file
$backend = new ezcTranslationTsBackend( dirname( __FILE__ ). '/translations' );
$backend -> setOptions( array( 'format' => $config["language_code"].'.xml' ) );

// create a manager object
$manager = new ezcTranslationManager( $backend );

$language = $manager->getContext( $config["language_code"], 'strings' );

şimdi sadece aşağıdaki işlevi çağırarak dizeleri yakala

getTranslation( "SOME_KEY" );

ve parametreleri aşağıdaki sözdizimini kullanın var öbekleri almak için, [anahtar kelime] ve "anahtar kelime" arasındaki ilişkiyi unutmayın kasıtlı ve önerilir

getTranslation( "FIND_[KEYWORD]_BY_[TYPE]", array("keyword" => $keyword, "type" => $type ) );

TS XML dosyasının bir örneği (en_US.xml aranmalıdır) olduğunu

<!DOCTYPE TS>
<TS>
<context>
    <name>strings</name>
    <message>
        <source>ZONE_TYPE</source>
        <translation>Zone Type</translation>
    </message>
    <message>
        <source>ZONE_TOOL</source>
        <translation>Zone Tool</translation>
    </message>
    <message>
        <source>HELLO_[NAME]_WELCOME_TO</source>
        <translation>Hello, %name, welcome to Webfood Admin</translation>
    </message>
    <message>
        <source>YOUR_ADMINISTRATIVE_SESSION_HAS</source>
        <translation>Your administrative session has timed out. Please login again.</translation>
    </message>
</context>
</TS>

Ben sadece, kullanılan dili saklayan, PHP oturumlarda, bir ayarı var onlar istediğiniz dili giriş önce veya sonra belki de sormak kullanıcı ve hesapları varsa onların kullanıcı tabloya saklamak istiyorsunuz. Ve üzerinde bir URL değeri gönderme tutmak için hiçbir neden yok, bu kötü bir fikir.