Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Strona z obsługą wielu języków
Forum PHP.pl > Forum > PHP
JacekQ
Ogólnie chodzi mi o stronę która będzie wyświetlała swoją zawartość w kilku językach.
Mam pytania związane ze stronami kodowymi ale zanim je zadam opiszę na przykładzie o co mi chodzi.

W bazie danych jest tabelka teksty z kolumną tekst char(100).

Skrócona wersja index.php:

[php:1:c7d896a0ae]<?php

$pol = mysql_connect();

switch($strona_kodowa) {
// ...
case "german1" :
$HTMLCodePage = "...";
$DBCodePage = "german1";
break;
default:
$HTMLCodePage = "iso-8859-2";
$DBCodePage = "latin2";
};

// Print1
print("<html><head><meta http-equiv="Content-Type" content="text/html; charset=$HTMLCodePage"></head><body>n");

$res = mysql_query("select convert(tekst using $DBCodePage) from teksty", $pol);

while($row = mysql_fetch_row($res))
// Print2
print("$row[0]<br>n");

print("</body></html>n");

mysql_close($pol);
?>[/php:1:c7d896a0ae]

Zakładając że plik index.php został napisany pod windowsem (strona kodowa 1250) to w jakiej stronie będzie tekst oznaczony Print1 a w jakiej Print2 ?
Jeżeli wszystkie teksty (oprócz znacznników html) pojawiające się na stronie będą pobierane z bazy to lepiej konwertować je tak jak w przykładzie czy pisać własną funkcję konwertującą i stosować ją zamiast print ?
Ewentualnie jak najprościej zrobić stronę która pobiera z bazy teksty w różnych językach i pokazuje je na stronie ?

Dzięki za odpowiedź(i)
scanner
Pro -> php

Ogólna idea, bo zmęczony jestem i nie chce mi sie dokładnie wszystkiego tłumaczyć:
[php:1:024bdf0d87]<?php
// lang.pl.php
$arrLang['Yes'] = 'Tak';
$arrLang['No'] = 'Nie';
$arrLang['End'] = 'Koniec';
?>[/php:1:024bdf0d87][php:1:024bdf0d87]<?php
// lang.de.php
$arrLang['Yes'] = 'Ja';
$arrLang['No'] = 'Nein';
$arrLang['End'] = 'Ende';
?>[/php:1:024bdf0d87][php:1:024bdf0d87]<?php
// lang.en.php
$arrLang['Yes'] = 'Yes';
$arrLang['No'] = 'No';
$arrLang['End'] = 'End';
?>[/php:1:024bdf0d87][php:1:024bdf0d87]<?php
// index.php
$strLang = 'pl';
require_once( 'lang.'.$strLang.'.php' );
echo $arrLang['Yes'].'<br/>'.$arrLang['No'].'<br/>'.$arrLang['End'];
?>[/php:1:024bdf0d87]
DeyV
Jesli pracujesz na smarty - na ich forum pojawił sie kiedys plugin pozwalajacy na robienie tego o czym mówi scanner przy pomocy skadni {t}tekst do przetłumaczenia{/t}
Jeśli bedzie cię to interesować - napisz - a wrzucę tu kod.
stach
Cytat
Jesli pracujesz na smarty - na ich forum pojawił sie kiedys plugin pozwalajacy na robienie tego o czym mówi scanner  przy pomocy skadni {t}tekst do przetłumaczenia{/t}
Jeśli bedzie cię to interesować - napisz - a wrzucę tu kod.


Jeśli nie jego to mnie, bo wlasnie robie to samo przy użyciu tej samej techniki podanej przez scanner-a.
JacekQ
Dzięki za odpowiedzi ...
Wymyśliłem coś podobnego do tego co proponuje scanner tylko w oparciu o bazę danych bo oprócz standardowych słówek (np. szukaj, następny, poprzedni, tak, nie itp) będzie dosyć dużo tekstów.
Bardziej interesuje mnie problem związany ze stronami kodowymi.
DeyV
zasada jest banalna. Nie jest to wiec rozwiązanie opytmalne, ani najszybsze z możliwych, ale w 90% wystarcząjace.
To na początek, po deklaracji smarty
[php:1:c64e18d14e]<?php
function do_translation ($params, $content, &$smarty) {
if(isset( $GLOBALS['LANG_INFO'][$content] ) )
{
echo $GLOBALS['LANG_INFO'][$content];
}
else
{
echo $content;
}
}
$smarty->register_block("t", "do_translation");
?>[/php:1:c64e18d14e]


Oprócz tego musimy zaincludować plik zawierajacy globalna tablicę - u mnie w przykładzie: $GLOBALS['LANG_INFO'] = array(); z odpowiednim tłumaczeniem. Chyba raczej łatwo się domyślić, że należy ładowac tylko 1 plik, z 1, odpowiednią wersją smile.gif
Wygląda ona np. tak:
[php:1:c64e18d14e]<?php
$LANG_INFO = array(
## napisy
'ARTYKUŁY' => 'ARTICLES',
'WERSJA_DO_DRUKU' => 'Print version',
); ?>[/php:1:c64e18d14e]
Oczywiście z uwagi na to, że nie jest indexowana stałymi, lecz zwykłymi stringami, może zawierać jako identyfikatory pełne wyrażenia w domyślym języku. (znaczne to ułatwia tworzenie strony, a także powoduje, że poprawny (choć w niepoprawnym języku) tekst jest wyświetlany zawsze, nawet jeśli odpowiedni blok nie jest przetłumaczony.

Użycie wygląda ... np. tak:
[xml:1:c64e18d14e]
<span class="tekst" style="font-size: 8pt; color: #181750; font-weight: bold;"> {t}ARTYKUŁY{/t} < /span>
[/xml:1:c64e18d14e]

Oczywiście na forum smarty (oraz w wiki) pokazano również znacznie bardziej rozbudowane rozwiązania, oparte np. na bazie danych lub getText, ale po takowe musicie sięgnąć już sami winksmiley.jpg
MakS
To ja mam dodatkowe pytanie odnosnie tego temtu. Jak bedzie lepiej, zrobic stronke w wielu jezykach na zasadzie podanej przez scannera, plikami w odpowiednim jezyku (wkoncu problem pojawia sie jak np robimy cmsa z mozliwoscia instalowania kolejnych modulow i kazdy modul moze miec, czesto powinien wlasne teksty i teraz co zrobic z tymi tekstami, dopisywac do pliku czy tworzyc przy module dodatkowo pliki z tekstami, tutaj jest kolejna wada bo pozniej skrypt troche zwolni jak bedize mial do wczytania np 20 plikow tekstowych) czy na zasadzie wpisania tekstow do odpowiedniej tabeli do bazy danych, tworzac np jedna tabele z nazwa jezyka i kodowaniem, a druga z nazwa jezyka i tekstem do zamiany i przetlumaczonym i ta cala tabele np pobrac?
DeyV
uważam, że najlepszym rozwiązaniem są w tym przypadku pliki.
Aby ułatwić zarzadzanie plikami z tłumaczeniami, mozna napisać prosty mechanizm ładując odpowiednie pliki z wcześniej przygotowanej listy modułów i łączący dane z nich pochodzące do postaci obsługiwanej przez nasz CMS.

A co do spowalniania - zaincludowanie 20 plików ma minimalny wpływ na prędkość wykonywania sie skryptu. Na pewno mniejszy, niż pobranie z bazy wszystkich potrzebnych wpisów, i ładowanie ich do tablic.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.