Najboljši način za večjezičnost

Zdravo,
zanima me, če ma kdo kakšno idejo, kateri je najboljši-najhitrejši način za parsanje jezikovnih datotek.

Npr. zdaj imam tako, v cookieu se prebere trenutna nastavitev in se potem includa ustrezen php language file.
Not so stringi v arrayu:

lang['product_stock'] = "Zaloga";
lang['product_info'] = "informacije o izdelku";

Razmišljam, da bi naredil tako:

lang['product_stock']['slovenian'] = "Zaloga";
lang['product_stock']['english'] = "Stock";

Tako stvar je lažje vzdrževat, kot tako kot imam v prvem primeru, ker npr. kakšenkrat pozabim dodati ali spremeniti string v vseh jezikih (vsak jezik v svoji mapi).

Zend ima menda jezikovne stringe v ini fileu.

product_stock = "Zaloga"

Dodatna slabost obeh pristopov je, da je težje narediti fallback. Npr. če enega stringa ni, se uporabi string od default jezika.
Druga slabost je pa ta, da je težje narediti spletni vmesnik za elegantno urejanje. Večina sistemov ima kar velik textbox, notri je pa vsebina celega file-a.

Zato sem mislil, da bi zadevo morda naredil v XML datotekah.
Npr:

<languagefile name="product" default="slovenian">
  <string key="product_stock">
    <value>Zaloga</value>
    <translation lang="english">Stock</translation>
  </string>
</languagefile>

Preden začnem naprej razmišljati, mislite, da bi to bilo po performancu nekje kot tisto zgoraj?
Celo dom drevo (ali več njih) bi ob začetku prebral v en 2d array, enkapsuliral v objekt in potem klical z globalno funkcijo (kot imam sedaj) v stilu <?=lang('product_stock);?> v view-u.

17 odgovorov

b00mbar:
Ena varjanta je, da narediš eno simple funkcijo _($text), ki vrne tekst glede na pripadajoči jezik. Se pravi, če pokličeš _('Hello') poišče po nekem arrayu, če imaš jezikovno različico za Hello in v kolikor obstaja, jo echoja, sicer pa echoja 'Hello', kar je tudi default jezik potem. Tako prideš do zelo kratke sintakse, za narest je pa zelo izi...

Sorry, malo sem pasiven ker je prišlo nekaj drugega dela vmes :)
Problem s tem in s predlogom od Vinija je, da zadeva ni fleskibilna v smislu, da če spremenim string iz
_("Welcome to my page");
v
_
("Welcome to our page");
potem moram spremeniti tudi identifier (original string) v arrayu, da bi našel prevod. Čeprav če pomislim, je lepa zadeva, ko delaš na view-u, da imaš že tekste not.

To s cookiejem je res in tudi sam imam v načrtu to čimprej zamenjati (še ena od napak ki sem jih naredil že pri temeljih aplikacije).

Bumpam staro temo, ampak...
Zanima me, ali se vam zdi to z gettext v praksi omembe vredna omejitev, torej da se mora apache ponovno zagnati, da počisti .mo cache?
Verjetno če delaš na opensource zadevi (pač kompatibilnost/portabilnost), se ni pametno zanašati na to?

Translation podobno kot ima Magento:
Za delovanje potrebuješ Zend_Traslate. Adapter lahko spremeniš na gettext ali kaj drugega.
Struktura language folderja:

language/
si/
news.csv
index.csv
en/
news.csv
index.csv

Vsebina csv:

"String we want translated","Tekst, ki ga želimo prevest"

if ($config->cache->usecache) {
Zend
Translate::setCache($cache);
}
$translate = new ZendTranslate(
array(
'adapter' => 'csv',
'content' => FOLDER
LANG, // pot do language folderja
'scan' => ZendTranslate::LOCALEDIRECTORY,
'ignore' => array('.svn'),
'disableNotices'=> 'true',
'locale' => $lang_id,
'delimiter' => ','
)
);
}

function __($key,$locale=null)
{
global $translate;
return $translate->translate($key,$locale);
}

S to funkcijo lahko na izi prevajaš:
<?= __("String we want translated"); ?>

Še Smarty modifier za view:

<?php
/*
* Smarty plugin
* @package Smarty
* @subpackage plugins
* Filename: .../smarty/plugins/modifier.t.php
* -------------------------------------------------------------
* Translation helper
* by Damjan Žnidaršič
* damjan@xhtml.si
*/

function smartymodifiert($string, $position = null, $length = null)
{
global $translate;
$manage = '<var style="outline:1px dotted red;padding:1px;">'.$translate->translate($string).'</var>';
//return $manage;
return $translate->translate($string);
}

$manage je zato, ker sem testiral prevajanje v frontendu (tako kot ima Magento). Samo click event dodaš na <var> in narediš api za prevajanje. Dela k piškot.

Najbolj všeč mi je, da je minimalno programiranja. It just works :)

2

Aja, samo jaz ne delam na Zend-u (delam na CodeIgniterju), ampak to ni point, če bi zadeva delala brez depedencyev bi morda to še uporabil, ker mi je ideja všeč. Bom pogledal še malo, če ne pa, lahko vedno naredim implementacijo za CI :)
Hvala tudi za hint glede prevajanja.

Zend je dejansko library. Framework je samo, ce uporabis njihov MVC. Ce ga se ne uporabljas ga zacni, ker bos dost casa prihranil. Nevem kako dela CI amapk v Zend FW je najmanjsi problem dodat nek drug library.

plis delete...spregledal celo stran odgovorov.

No, na koncu sem vseeno uporabil gettext rešitev in se mi zaenkrat ful dopade :)
Če bo kdo rabil plural form za slovenščino:

nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;