Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: strona wielojęzyczna - jak ?
Forum PHP.pl > Forum > PHP
robos85
Otóż chcę zrobić stronkę w języku PL i niemieckim. I mam pytanie - jakby to zrobić, żeby były flagi i po kliknięciu na flagę przestawiał sie język.
Teksty na stronie będą modyfikowane - coś a'la mały CMS.

Dajcie jakieś sugestie jak się do tego zabrać.
Foxx
Użyj sesji, na początku indexu zainicjuj zmienną sesyjną 'lang':

  1. <?php
  2. if(empty($_GET['lang'])){
  3.  $_SESSION['lang'] = 'pl';
  4. } else {
  5.  $_SESSION['lang'] = $_GET['lang'];
  6. }
  7. ?>


Na stronie umieść link, na którego kliknięcie będzie zmieniało wersję językową:
  1. if($_SESSION['lang'] == 'pl'){
  2.  ?><a href="?lang=de">de</a><?
  3. } else {
  4.  ?><a href="?lang=pl">pl</a><?
  5. }


Stwórz sobie pliki dla wersji językowych w postaci np:
  1. <?php
  2. $lang['okno']['pl'] = "Okno";
  3. $lang['okno']['de'] = "das Fenster";
  4. // itd
  5. ?>

A wszędzie na stronie zamiast pisać tekst, umieszczaj zmienną
  1. <?php
  2. $lang['slowo'][$_SESSION['lang']]
  3. ?>


Możesz też inaczej, np. mieć dwa pliki z dwoma wersjami słów:
  1. <?php
  2. $okno = "Okno";
  3. // a w pliku niemieckim:
  4. $okno = "das Fenster";
  5. ?>

a potem tylko includować właściwy plik na podstawie zmiennej $_SESSION['lang']
robos85
Dzięki, w sobotę coś zacznę już smile.gif

Dodam tylko, że oprócz stałych części strony jak menu czy stopka, będą też "dynamiczne" tzn. zmieniająca sie oferta firmy itp.
Więc będę jeszcze musiał jakoś to zrobić w bazie danych.

Jakieś sugestie?
Foxx
To bardzo ogólne o co pytasz więc ogólna odpowiedź jest taka:
Zaprojektuj odpowiednio bazę danych, zrób panel administracyjny, w którym pracownicy będą mogli sobie zmieniać ofertę np. w jakimś wyswigowym edytorze, a na stronie wyświetlaj ofertę pobraną z bazy...
robos85
Cytat(Foxx @ 16.11.2007, 03:36:53 ) *
Stwórz sobie pliki dla wersji językowych w postaci np:
  1. <?php
  2. $lang['okno']['pl'] = "Okno";
  3. $lang['okno']['de'] = "das Fenster";
  4. // itd
  5. ?>

A wszędzie na stronie zamiast pisać tekst, umieszczaj zmienną
  1. <?php
  2. $lang['slowo'][$_SESSION['lang']]
  3. ?>


a dokładniej z tymi plikami?
trzeba je jakoś includować albo określić?
np chciałbym dla każdej podstrony osobny plik w j. polskim i osobny plik w j. niemieckim.
Jak takie coś stworzyć?
Foxx
Nie rób osobnych plików dla każdej podstrony.
Rozwiązania, które podałem zakładają jeden albo dwa pliki w pierwszej wersji oraz dwa pliki w drugiej wersji.
Załóżmy, że wybierzesz pierwszą wersję z jednym plikiem:
Zrób plik lang.php:
  1. <?php
  2. // lang.php:
  3. $lang['okno']['pl'] = "Okno";
  4. $lang['okno']['de'] = "das Fenster";
  5. $lang['powitanie']['pl'] = "Witaj";
  6. $lang['powitanie']['de'] = "Welkommen";
  7. // itd.
  8. ?>


Następnie musisz ten plik includować gdzieś na stronie, zanim cokolwiek wyświelisz z niego.
A więc plik index może wyglądać tak:
  1. <?php
  2. // index.php:
  3. include('lang.php');
  4.  
  5. echo $lang['powitanie'][$_SESSION['lang']]." świecie!";
  6. ?>

Oczywiście przykład bez sensu smile.gif
Zmienną lang ustawiasz tak jak opisałem w poprzednim poście.
robos85
mam taki błąd:
  1. <?php
  2. ?>
Fatal error: Cannot use string offset as an array in C:Program FilesVertrigoServwww2jlang.php on line 3
  1. <?php
  2. ?>


linia 3 to: $lang['powitanie']['pl'] = "Witaj";

błąd po kliknięciu w linka zmiany języka.

adres w przeglądarce: http://localhost/2j/?lang=de
Foxx
Pokaż swój kod.
robos85
index.php
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <title>Untitled Document</title>
  6. </head>
  7.  
  8. <body>
  9.  
  10. <?php
  11. include ('lang.php');
  12.  
  13. if(empty($_GET['lang'])){
  14.  $_SESSION['lang'] = 'pl';
  15. } else {
  16.  $_SESSION['lang'] = $_GET['lang'];
  17. }
  18.  
  19. if($_SESSION['lang'] == 'pl'){
  20.  ?><a href="?lang=de">de</a><?
  21. } else {
  22.  ?><a href="?lang=pl">pl</a><?
  23. } 
  24.  
  25. print ("<br>");
  26. echo $lang['powitanie'][$_SESSION['lang']];
  27. ?>
  28.  
  29.  
  30.  
  31.  
  32. </body>
  33. </html>


lang.php
  1. <?php
  2. // lang.php:
  3. $lang['powitanie']['pl'] = "Witaj";
  4. $lang['powitanie']['de'] = "Welkommen";
  5. // itd.
  6. ?>
Foxx
Rzeczywiście, to powoduje błąd... zmodyfikowalem trochę kod:
  1. <?
  2. // dane w 1 pliku językowym:
  3. $pl['witaj'] = 'witaj';
  4. $de['witaj'] = 'welkommen';
  5.  
  6. // sterowanie za pomocą zmiennej _GET['lang'] - to prowizorka, np. powróci do wersji pl gdy z urla zniknie lang
  7. if(empty($_GET['lang'])){
  8.  $_SESSION['lang'] = 'pl';
  9. } else {
  10.  $_SESSION['lang'] = $_GET['lang'];
  11. }
  12.  
  13. // link zmiany wersji:
  14. if($_SESSION['lang'] == 'pl'){
  15.  ?><a href="?lang=de">de</a><?
  16. } else {
  17.  ?><a href="?lang=pl">pl</a><?
  18. }
  19.  
  20. // słowo:
  21. echo ${$_SESSION['lang']}['witaj'];
  22. ?>


To tylko szkic, prosiłeś o sugestie, musisz to rozwinąć jeżeli chcesz zastosować na stronie, ale chyba jest to w miarę jasne...
robos85
dzięki, może ktoś podpowie mi jak zrobić, żeby zmienna sesyjna nie była widoczna w url smile.gif

może połączyć ciasteczka z tym ?
drPayton
Brak identyfikatora sesji w URI:
  1. <?php
  2. ini_set('session.use_trans_sid', 0);
  3. ?>


2. Sesja na cookies:
  1. <?php
  2. ini_set('session.use_cookies', 1);
  3. ?>
NoiseMc
Zmienna jezykowa w sesji? A jak wyslesz komus linka do niemieckiej wersju artykulu? Zakladajac ze uzytkownik nie wie ze do url nalezy dokleic ?lang=de
... a jak Google znajdzie wszystkie niemieckojezyczne artykuly?

Takie rzeczy powinno sie przekazywac w url za kazdym razem.
FliSs_tCv
NoiseMc mógłbyś wtedy pomoc jak wykonać to przekazanie w url ? napewno kolega który zakładał posta też jest ciekaw jak to wygląda smile.gif pozdrawiam
robos85
Cytat(drPayton @ 16.11.2007, 06:31:27 ) *
Brak identyfikatora sesji w URI:
  1. <?php
  2. ini_set('session.use_trans_sid', 0);
  3. ?>


2. Sesja na cookies:
  1. <?php
  2. ini_set('session.use_cookies', 1);
  3. ?>


mógłbyś mi to jeszcze ciut naświetlić? Znaczy - ciut więcej wytłumaczyć czemu ma to służyć.

OT...... NoiseMc - twoja lokacja: Boston, MA kojarzy mi się z tą reklamą gdzie Kolonko reklamuje ubezpieczycieli samochodów biggrin.gif

to przekazanie w url działa z tego skryptu wyżej u mnie normalnie smile.gif
NoiseMc
Cytat(FliSs_tCv @ 16.11.2007, 08:45:42 ) *
NoiseMc mógłbyś wtedy pomoc jak wykonać to przekazanie w url ? napewno kolega który zakładał posta też jest ciekaw jak to wygląda smile.gif

Na przyklad http://www.example.com/showarticles.php?lang=de a w kodzie odpada wtedy tylko ustawianie zmiennych sesyjnych.

Co do Maxa Kolonko nie widzialem tej reklamy ale slyszalem ze reklamowal slynna amerykanska firme ubezpieczeniowa ktorej nikt w usa nie zna winksmiley.jpg
Sh4dow
Po pierwsze w sesji mozna index jezyka trzymac, ale co do tablicy z tlumaczeniami to jest troche malo optymalne przy wiekszych stronach, a po co uczyc sie nie do konca wydajnych metod. Proponuje poczytac o gettext, istnieje rozszerzenie php do tego, Chyba Bastion pisal klase Babel do obslugi tego. Jesli chodzi o szablony to na stronie smarty mozna było znalesc plugin nazwany smarty_block_t obslugujacy gettexta. To tak jako alternatywa dla tych tablic z tlumaczeniami, No bo jesli bedziesz mial 2 jezyki to jeszcze przejdzie ale przy 6 jezykach wielu stronach standardowe 8 MB dla php moze okazac sie za małe.
domis86
zamiast
  1. <?php
  2. $lang['slowo'][$_SESSION['lang']];
  3. ?>

lepiej zrobic sobie funkcje
  1. <?php
  2. function tr($text)
  3. {
  4. return $lang[$text][$_SESSION['lang']];
  5. }
  6. ?>



I co będzie jak ktos wpisze taki url: "..../?lang=dupa" questionmark.gif
robos85
zacząłem ten temat właśnie po to, aby poznać jakąś optymalną metosę na zrobienie tego smile.gif
więc co byście polecili w końcu winksmiley.jpg

co do przekazywania w url - jak zrobić, aby działało to na podobnej zasadzie, ale nie było widoczne w url to lang .....
franki01
Ja robie katalog langs/ i tam trzymam pliki z jezykami: pl.lang.php, en.lang.php, de.lang.php itd. Potem przy pomocy wyzej wymienionych sesji includuje odpowiedni plik. Zawartosci pliku mozna tworzyc na rozne sposoby:

  1. <?php
  2. define('L_TYTUL', 'Tytuł'); // dla np. angielskiego define('L_TYTUL', 'Title');
  3. define('L_KOMPUTER', 'Komputer');
  4. // itd.
  5. ?>


albo

  1. <?php
  2. $lang_tytul = 'Tytuł';
  3. $lang_komputer = 'Komputer';
  4. ?>


Dzieki takiemu czemus nie trzeba bawic sie w budowanie dlugich zmiennych jak to bylo wyzej napisane..
jang
Cytat(robos85 @ 16.11.2007, 20:30:18 ) *
zacząłem ten temat właśnie po to, aby poznać jakąś optymalną metosę na zrobienie tego smile.gif
więc co byście polecili w końcu winksmiley.jpg

http://forum.php.pl/index.php?s=&showt...st&p=397224
robos85
Cytat(franki01 @ 17.11.2007, 00:45:28 ) *
Ja robie katalog langs/ i tam trzymam pliki z jezykami: pl.lang.php, en.lang.php, de.lang.php itd. Potem przy pomocy wyzej wymienionych sesji includuje odpowiedni plik. Zawartosci pliku mozna tworzyc na rozne sposoby:

  1. <?php
  2. define('L_TYTUL', 'Tytuł'); // dla np. angielskiego define('L_TYTUL', 'Title');
  3. define('L_KOMPUTER', 'Komputer');
  4. // itd.
  5. ?>


albo

  1. <?php
  2. $lang_tytul = 'Tytuł';
  3. $lang_komputer = 'Komputer';
  4. ?>


Dzieki takiemu czemus nie trzeba bawic sie w budowanie dlugich zmiennych jak to bylo wyzej napisane..


a jak połączyć te sesje z twoimi plikami dokładnie ?
franki01
Troche tutaj inny schemat katalogow bedzie niz w poprzednim poscie...

Robisz katalog langs/ w nim robisz katalogi z jezykami, np pl/, en/ itd. W tych katalogach robisz plik lang.php. Strukura katalogow ma wygladac tak:

Kod
katalog ze strona
--katalog1
--katalog2
--langs
----en
------lang.php
------obrazek.gif <- obrazek z napisem angielskim
----pl
------lang.php
------obrazek.gif <- obrazek z napisem polskim
--index.php
--style.css


Najwazniejsze jest drzewo langs...
W kazdym pliku z jezykami bedzie lista tlumaczen:

  1. <?php
  2. // tresc langs/pl/lang.php
  3. define('L_TEXT', 'Treść');
  4. define('L_QANSW', 'Szybka odpowiedź');
  5. define('L_IMAGE', 'Obrazek');
  6. // itd...
  7.  
  8.  
  9. // tresc langs/en/lang.php
  10. define('L_TEXT', 'Text');
  11. define('L_QANSW', 'Quick answer');
  12. define('L_IMAGE', 'Image');
  13. ?>



Tak ma wygladac schemat katalogow. Chyba zrozumiałe...

Teraz skrypt sterujący językami:

  1. <?php
  2.  
  3. if($_SESSION['LANG'] == '') $_SESSION['LANG'] = 'pl'; // deklaracja jezyka dla pierwszej wizyty
  4.  
  5. if($_GET['lang'] != '') {
  6. preg_match("([a-zA-Z0-9-_]*)", $_GET['lang'], $tmp); // filtracja wprowadzonego jezyka zeby nie bylo czegos w stylu ../../../../../plik.php
  7. if(file_exists('langs/'.$tmp[1].'/lang.php')) $_SESSION['LANG'] = $tmp[1]; // sprawdzenie czy plik z jezykiem istnieje i przypisanie
  8. }
  9.  
  10. define('LANG_DIR', 'langs/'.$_SESSION['LANG'].'/'); // zdefiniowanie katalogu z jezykiem, zeby latwo zmieniac jezyki obrazkow
  11. require_once(LANG_DIR.'lang.php'); // incudowanie pliku z jezykiem
  12. ?>


I potem mozna zeby uzyc jakiegos wyrazenia w danym jezyku, wywolujemy okreslona stałą, np:

  1. <?php
  2. echo L_TEXT.' - '.L_QANSW; // pojawi sie tekst w okreslonym jezyku z zaincudowanego pliku
  3. echo '<img src="'.LANG_DIR.'obrazek.gif" alt="'.L_IMAGE.'" />'; // tekst alternatywny jest okreslony w pliku z jezykiem, a obrazek.gif lezy w odpo
    wiednim katalogu z jezykiem (zobacz strukture katalgow wyzej)
  4. ?>



No i to by bylo na tyle... Chyba najlepszy sposob. Jak jest niezrozumiale to najpierw przyczytac trzy razy a potem pisac biggrin.gif


EDIT:
Lepiej operowac na stalych niz na zmiennych ze wzgledow za ich zasieg w funkcjach i klasach
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.