Secondo voi quale di questi metodi è meglio per tradurre?
- Usare un file .po
- Usare un file .mo
- Usare un array php
Qual'è più veloce?
Secondo voi quale di questi metodi è meglio per tradurre?
- Usare un file .po
- Usare un file .mo
- Usare un array php
Qual'è più veloce?
No
MessageFormatter se riesco a capire come funziona...
http://it1.php.net/manual/en/class.messageformatter.php giuro che ci sto provando ma ho seri dubbi che sia "semplice".. e non c'è nessuno che lo usa quindi non ci sono neanche tanti articoli o aiuti in giro per il web.
appena capisco come organizzare le cose forse riesco a risponderti![]()
Questa volta, più che un voto.. è favoreggiamento.
Beh, allora fila a studiare!
(Se ti interessa: http://devzone.zend.com/1500/interna...sage_formatter )
Comunque da quello che ho capito (se ho capito) quella classe traduce date e altri numeri vari.
Qualcosa del genere:
(Non ho provato questo codice perché non riesco a installarmi intl che contiene la classe)Codice PHP:
<?php
$it = new MessageFormatter("it_IT",
"Ho comprato {0, number, integer} chili di mele.<br>"
. "Un chilo di mele costa come {1, number} chili di pere.<br>"
. "Con i soldi che ho speso per comprare le mele, quanti chili di pere potrei comprare?"
);
echo $it->format(array( 12860, 1.472));
/* Stampa:
Ho comprato 12.860 chili di mele.
Un chilo di mele costa come 1,472 chili di pere.<br>
Con i soldi che ho speso per comprare le mele, quanti chili di pere potrei comprare?</br>
*/
PS
Usando xampp ho delle classi già installate in pear, tra cui questa
http://pear.php.net/package/Translat...anslation.html
(L'unica pecca è che prende i dati da un db, quindi potrebbe essere un po' lentina)
Un altro PS
http://www.html.it/articoli/gettext-...alizzazione-1/
Questo è una buona cosa secondo te?
Edit
(Un messaggio scritto in 4 round)
Sono riuscito ad usare MessageFormatter (dovevo solo abilitare intl nel php.ini).
Effettivamente fa quello che ho scritto
Ultima modifica di tampertools; 26-08-2014 a 17:48
No
Per creare una pagina multi lingua io avevo fatto una cosa di questo genere:
1) Con uno script vedo che lingua è impostata sul browser
2) Metto la lingua in un Cookie
3) faccio un require di template/$leng.php
4) creo i file di lingua così:
$LENG['hello'] = "ciao";
$LENG['welcome user'] ="Benvenuto utente";
.....
5) Al posto che mettere "ciao" nel template, metto echo $LENG['hello'];
Non so se è il metodo migliore, ma sicuramente è funzionale e funzionante
Grazie mt19.
Si potrebbe fare anche una classe così:
- langs/
- it_IT.json
codice:{ "hello" => "hello", /* ... ... ... ... */ }- es_ES.json
codice:{ "hello" => "hola", /* ... ... ... ... */ }- classes/
- Translator.class.php
Codice PHP:
class Translator {
private static $folder = "langs";
private $translator = array();
private $lang = "";
public static function setFolder($new_folder) {
if (is_dir($folder)) self::$folder = $new_folder;
}
public function __construct ($lang) {
$info = array();
if (!preg_match("/^(?<language>[a-z]{2})(_(?<locality>[A-Z]{2}))?$/", $lang, $info))
throw new Exception;
$this->lang = $lang;
$dir = dir(self::$folder);
$files = array();
while (($file = $dir->read()) !== false) {
if (!in_array($file, [".", ".."]) && preg_match("/.*?\.json/", $file)) $files[] = $file;
}
$dir->close();
if (in_array($lang . ".json", $files)) {
$this->translator = (array) json_decode(file_get_contents(self::$folder . "/$lang.json"));
}
else {
$founded = false;
foreach ($files as $file) {
if (strpos($file, $info["language"]) === 0) {
$this->translator = (array) json_decode(file_get_contents(self::$folder . "/$file"));
$founded = true;
break;
}
}
if (!$founded) throw new Exception;
}
}
public function __get ($word) {
if (isset($this->translator[$word])) return $this->translator[$word]; return $word;
}
public function translateFrom ($word, $from) {
$from = $from instanceof self ? $from : new self($from);
return $from->translateTo($word, $this);
}
public function translateTo ($word, $to) {
$to = $to instanceof self ? $to : new self($to);
return in_array($word, $this->translator) ? $to->{array_search($word, $this->translator)} : $word;
}
}
- index.php
Codice PHP:
require_once ("classes/Translator.class.php");
$es = new Translator("es_ES"); // Creo il traduttore per la lingua spagnola
echo $es->hello; // Stampa "hola"
echo "<br>";
echo $es->translateTo("hola", "it_CH"); // Stampa "ciao". Non esistendo il file it_CH.json (Svizzera) la classe va a cercare il primo file che trova che sia it_**.json (L'italiano parlato in un altro stato, ad esempio it_IT)
Ultima modifica di tampertools; 26-08-2014 a 21:13
Sì, mi sembra un'ottima soluzione. Occhio solo che non tutti hanno it_IT, alcuni hanno it e basta, altri IT... Fai tutti i casi per bene, altrimenti finisce per non funzionare. Ovviamente dovrai implementarlo con cookie/session, così se un utente non ha il cookie, allora carichi lo script che lo carica in automatico, ma se un utente vuole, ha la possibilità di cambiare la lingua (cambi la lingua nel cookie)
E' strano come per risolvere lo stesso problema riusciamo a trovare delle soluzioni davvero differenti. Per conto mio ho scelto un approccio molto diverso. Ho scelto di dissociare totalmente la parte html dalla parte php.
Nella parte HTML metto delle costanti esempio : <title>:TITOLO_PAGINA:</title> sempre nella parte html ho un tag mio che consente di dare un valore di default ad ogni costante <mla_c name='TITOLO_PAGINA' value="Titolo della pagina" />. Ho anche la possibilità sempre tramite quel tag di caricare un file delle costanti <mla_c file="mio_file.cst" />. Che a sua volta puo' contenere un file delle costanti, etc...
Poi per creare la pagina html definitiva ho un paio di oggetti di cui uno gestisce le costanti. Si carica la parte html. Un regexp ricava tutti i tag per le costanti eventualmente carica e processa i file delle costanti. L'oggetto rimpiazza le costanti e ripulisce il codice html togliendo i miei tag. Mi resta da fare la parte di amministrazione. Carico un file "html" un regexp ricava tutte le costanti. Do un valore ad ogni. Salvo il risultato e modifico il file "html" inserendo un tag mla_c file.
Ridatemi i miei 1000 posts persi !!!!
Non serve a nulla ottimizzare qualcosa che non funziona.
Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr
sfogliandone la documentazione ho visto che anche il templare engine che uso ha una funzione per le traduzioni simile alla tua... solo che sfrutta la funzione nativa di PHP "gettext". quindi scrivo qualcosa tipoe se trova la voce "home" nel file .mo che gli ho indicato la traduce...codice HTML:<div i18n:traslate="home">Home</div>
@mt19 Se come codice di lingua c'è solo it dovrebbe funzionare, e non sapevo che ci potesse essere anche solo il codice dello stato...
No
Questa volta, più che un voto.. è favoreggiamento.
badaze,
molto interessante come idea, forse la migliore dal punto di vista della semplicità nella manutenzione, tuttavia penso sia anche la più difficile da realizzare (al meno la prima volta). Poi essendo ancora un noob completo in JS mi viene quasi impossibile
tampertools,
Interessante anche questa funzione, la approfondirò in futuro!
Mi sembrava di si, ma forse mi sbaglio. In ogni caso basta aggiungere un caso in cui se c'è solo it/en tu per sicurezza lo rendi minuscolo