Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rozne jezyki serwisu.
Forum PHP.pl > Forum > PHP
thornag
Witam.

Od dluzszego czasu zastanawiam sie jak skutecznie wprowadzic do serwisu pliki jezykowe.
Pierwsze nasuwaja sie stale. Tylko ze w miare tworzenia serwisu liczba stalych rosnie tak ze Ciezko sie w nich polapac. problem jest takze jesli mamy np e-mail w srodku ktorego chcemy wprowadzic zmienne. Trzeba wtedy ten email dzielic na kilka czesci. EMAIL_BODY1 EMAIL_BODY2 itp. Do tego dochodzi fakt ze czasami w roznych jezykach rozne slowa sa krotsze lub dlusze, badz tez do wyjasnienia czegos wystarcza dwa badz tez 15 slow, nie zawsze musi sie to wpasowac w styl strony.

Biorac pod uwage ostatnie zdanie, zaczalem rozwazac robienie osobnych szablonow dola kazdego jezyka. Niby to wygodne bo napewno wszystko bedzie dobrze wygladalo, ale co jesli zechce dodac nowy element na strone. Majac 10 jezykow bede musial wprowadzic zmiane w 10*ilosc templatow plikow.

ogolnie tak zle i tak niedobrze smile.gif

Jak wy zrealizowaliscie obsluge wielu jezykow ?
dyktek
jesli chodzi o dane z bazy to robiłem to tak smile.gif


  1. tabela artykuły


id---art_pl---art_en-----cos tam dalej-------

w sesji trzymam info o wybranym języku i potem mozna nawet zrobić coś takiego
  1. SELECT id, art_'.$Lang.', cos FROM tralalal
thornag
Na to tez wpadlem uzywam poki co. Jednak nie chodzi mi o zmienna zawartosc strony a o ta stala. Jak slowa zaloguj, zarejestruj itp itp.
czachor
Ja używam TMX (Translation Memory eXchange).
Dane trzymasz w pliku XML, potem wszystko jest w tablicy. Tutaj masz klasę z przykładem do obsługi tego.

Osobiście jestem zadowolony.
thornag
Dzieki, wydaje mi sie ze XMl rzeczywiscie dobrze sobie z tym poradzi.

Mimo wszystko moze jeszcze jakies inne sugestie ?

@czachor => Sprawdzielm wlasnei ta klase. W sumie oprocz tego ze zapisujemy to wszystko w pliku XML i mamy otoczke obiektowa do parsowania tego XML w niczym sie to dla mnie nie rozni od zwyklych stalych. Dalej moze tego byc tyle ze sie nie da polapac o co chodzi. Aczkolwiek moze innego lepszego rozwiazania po prostu nie ma.
s_w_ir
Ja robiłem tak, w osbnym pliku(inny plik dla każdego języka):
  1. <?php
  2. class Dane{
  3. var $komunikaty=array("Nie podałeś nazwy katalogu, lub podałeś błedną składnie ze znacznikami HTML",
  4. "Katalog o podanej nazwie już istnieje",
  5. "Nie ma żadnego pliku do usunięcia",
  6. "Nie można usunąć pliku <font color="black">",
  7. "</font>. Podany plik nie istnieje",
  8. "Nie masz uprawnien aby sie dostać do tego folderu",
  9. "Weryfikuj i dodaj",
  10. "Źle wpisane imię",
  11. "Źle wpisane nazwisko",
  12. "Błędny adres Email",
  13. "Użykownik o takim loginie juz isnieje", //10
  14. "Błędna nazwa użytkownika",
  15.  
  16. ...
  17. "Nazwa",
  18. "Rozmiar",
  19. "Zmodyfikowany", //30
  20. "Utwórz Katalog",
  21. "Nazwa Katalogu:",
  22. "Utwórz Katalog",
  23. "Usuń Plik lub Katalog",
  24. "Wybierz plik lub katalog:",
  25. "Usuń",
  26. "Wyślij plik na server",
  27. "Wyślij");  //38
  28. ?>


Użycie:
  1. <?php
  2. else{
  3. Operacje::blad($Dane->komunikaty[5]);
  4. $obecny_kat = $_SESSION["sciezka"] = $_SESSION["user"];
  5. }
  6. ?>
thornag
I pamietasz te wszystkie komunikaty tongue.gif (w sensie numery) ? Jesli serwis jest naprawde duzo to mozna sie w tym pogubic latwiej niz w stalych.
php programmer
ja to zrobiłem w taki sposób że dany wiersz miał jedną kolumnę identyfikującą
napisaną po angielsku, jakieś krótkie słow lub zwrot, a reszta kolumn to pełne zwroty w danym języku

np:

Save, Zapisz, Zapisaju
Cancel, Anukuj, Anulaju
OK, OK, OK
ConfirmDetele Czy na pewno chcesz skasować?, Czi na piewno chacziu skasowaju?
TypeName Podaj nazwe, podaju nazwaju
thornag
@php_programmer Przyklad uzycia ? Cos mi sie to nie widzi smile.gif
php programmer
  1. <?php
  2.  
  3. require('config/database.php');
  4. require('config/smarty.php');
  5.  
  6. if (!isset($_SESSION['language']))
  7.  $_SESSION['language'] = 'polish';
  8.  
  9. $query = " SELECT * FROM labels ";
  10. $result = mysql_query($query) or die(mysql_error());
  11. while ($row = mysql_fetch_array($result))
  12.  $labels[$row['name']] = $row[$_SESSION['language']];
  13.  
  14. $smarty->assign('labels',$labels);
  15. ?>


Natomiast w templatach mozesz zrobic cos takiego

  1. {$labels.descr}
  2. <inbut type="button" value="{labels.cancel}">
  3. <inbut type="button" value="{labels.save}">
s_w_ir
Cytat(thornag @ 30.08.2006, 13:44:35 ) *
I pamietasz te wszystkie komunikaty tongue.gif (w sensie numery) ? Jesli serwis jest naprawde duzo to mozna sie w tym pogubic latwiej niz w stalych.


Wiesz najpierw robie wszystko po polsku bez tej klasy. Dopiero po skończonej robocie biore się za umiędzynarodowienie zamieniając komunikaty na te zmienne. Wszystko zależy od organizacji podczas pisania aplikacji. Potem to jest już zmiana każdego wpisu pokoleji na zmienną i nadawanie kolejnych numerów. Mi osobiście to odopowiada tym bardziej, że łatwo po tej całej robocie wszytsko pozmieniać. Wszytskie komunikaty są edytowalne w jednym miejscu.
thornag
No to mamy Stale, Baze danych i XML.

@php_programmer W sumie niezle to to, tylko ze za kazdym razem musze ladowac wszystkie rekordy, duzo niepotrzebnych danych. Mozna by w sumie cachowac hmm
php programmer
@s_w_ir:
Już przerabiałem coś takiego,
jak przyjdzie potrzeba jakiejś modyfikacji
i z kodzie masz powiedzmy 20-30 wyrazów
to nie wiesz jaki numer do jakiego wyrazu jest,
zalecam uzywanie słów, najlepiej angielskich bo nie maja ogonkow
i najlepiej jako elementy jakies wiekszej czesci tak jak u mnie w przykłądzie
{$labels.save}
od razu wiesz ze ta zmienna to tylko etykietka
i nie myli się z innymi zmiennymi,

Cytat
kazdym razem musze ladowac wszystkie rekordy

zgadza sie, kod podałem tak zgrubsza bez zbędnych szczegółów
zawsze mozna zmodyfikowac zapytanie aby brało tylko to co trzeba
np mozna w baze dać dodtkową kolumnę z informacją
na jakiej stronie jest dany label i pobierac w danym momencie labele
tylko z danej strony na której obecnie jestesmy,

mozna jeszcze ewentualnie zmienną $labels zserializować i zapisac w sesji
MiB
Witam!

Ja od dłuższego czasu robię to tak (mix wersji php programmer i s_w_ir`a ;) ):

plik: /languages/lng.pl.php

  1. <?php
  2.  
  3. // menu
  4. $lng['L_ARTICLES']='Artykuły';
  5. $lng['L_ADD']='Dodaj';
  6. $lng['L_SITE_SETTINGS']='Ustawienia';
  7. /...
  8. ?>


W pliku index.php:

  1. <?php
  2. $lang=$core->URL->fetch('lang',SITE_DEF_LANG);
  3. switch($lang) {
  4. case 'pl':
  5. case 'en':
  6. case 'du':
  7. require_once('/languages/lng.'.$lng.'.php');
  8. default:
  9. require_once('/languages/lng.'.SITE_DEF_LANG.'.php');
  10. }
  11. $core->smarty->assign('lng',$lng);
  12. ?>


W szablonie użycie takie jak pokazał php programmer. Myślałem nawet kiedyś o zastosowaniu prefiltra do Smarty, żeby przeparsował same ustawienia językowe "raz, a porzadnie" (można nadać compile_id na cache szablonu Smarty i już mamy wiele języków :D).

Co do przechowywania tego na bazie - można. Nad tym też kiedyś myslałem. Po zedytowaniu tego można odswiezyć taki pliczek lng.X.php i potem juz tylko inkludować go.

A jak miałaby wyglądać struktura takiej tabeli?

Ot po prostu:
  1. lang | id | value


lang - oznaczenie języka (pl, du, en)
id - identyfikator (u s_w_ir`a liczbowe, u mnie string)
value - wartość w danym języku

Pobranie:
  1. SELECT `id`, `value` FROM languages WHERE lang=''.$lang.''


Nie mamy żadnych ograniczeń w ilości języków (dodanie nowego języka != dodanie nowej kolumny).

Pozdrawiam
s_w_ir
php programmer - no wiesz mi takie coś:
Kod
"Nie masz uprawnien aby sie dostać do tego folderu",
        "Weryfikuj i dodaj",
        "Źle wpisane imię",

mówi więcej niż label.save, ponieważ jeśli piszesz aplikacje sam to doskonale wiesz gdzie taki komunikat się pojawia, pozatym większość haseł jest tłumaczona dosłownie(więc nie musisz tego zawsze wiedzieć). Inna sprawa, że w razie wątpliwości możemy sobie komentować gdzie co się gdzie znajduje, albo w jakim kontekście. Komentowanie jest zalecane(ba, to obowiązek) w każdym większym projekcie, więc jeśli nie komentujesz to się i tak pogubisz.
php programmer
Cytat
"Nie masz uprawnien aby sie dostać do tego folderu",
"Weryfikuj i dodaj",
"Źle wpisane imię",



PermissionDirError
CheckAndAdd
BadName
s_w_ir
OK, no to w czym problem, zamieniam polskie texty na angielskie odpowiedniki, ewentualnie troche inaczej aby utrzymać kontekst. Zmiana w jednym pliku, nie ingeruje w kod, chyba to było celem.

lece do miasta teraz więc już się nie kłóce winksmiley.jpg
bim2
Ja obstawiam php programmer winksmiley.jpg Tak jest np. w phpBB tyle że tam jest na plikach. Bardzo fajnie się tak robi i prosto.
thornag
@bim2 W Mambo ktore ja uwazam za najlepszy darmowy CMS (chociaz juz chyba nie jest darmowy) porobili to na stalych, co wcale nei oznacza ze dobrze.

Ogolnie chyba zdecyduje sie na kolejne miksowe rozwiazanie smile.gif Baza danych z indentyfikatorem strony (choc tutaj trzeba przemyslec co bedzie jak ta sama fraza bedzie na kilku stronach) i jakas klasa ladujaca co trzeba i tworzaca z tego tablice.
Co do samej bazy danych zdecyduje sie jednak na wzor jedna kolumna jeden jezyk.

W kazdym badz razie dzieki za dyskusje.
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.