Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Propozycja wielojęzyczności na stronie
Forum PHP.pl > Inne > Oceny
psbert
Witam,
Ostatnio przerobiłem wielojęzyczność na stronie i działa poprawnie. W związku z tym proszę o ocenę na ile jest ona poprawna od strony technicznej.

Przełączanie menu np w pliku banner.inc.php

  1. <form action="" method="post">
  2. <p>
  3. <input class="flaga_pl" type="submit" name="lang" value="pl" />
  4. <input class="flaga_en" type="submit" name="lang" value="en" />
  5. <input class="flaga_es" type="submit" name="lang" value="es" />
  6. </p>
  7. </form>



plik index.php
  1. <?
  2. ini_set( 'arg_separator.output', '&' );
  3.  
  4. if ( !isset ($_SESSION['lang']))
  5. {
  6. if ( isset ($_POST['lang']))
  7. {
  8. $_SESSION['lang'] = $_POST['lang'];
  9. }
  10. else
  11. {
  12. $_SESSION['lang']= pl;
  13. }
  14. }
  15.  
  16. include('head.' . $_SESSION[lang] . '.inc.php');
  17.  
  18. include( './lang/'.$_SESSION[lang].'/menu.txt.php');
  19. include( './lang/'.$_SESSION[lang].'/text.txt.php');
  20.  
  21. ?>
  22.  
  23. <div id="container">
  24.  
  25.  <div id="banner"><? include("include/banner.inc.php");?></div>
  26.  <div id="window"><? include("include/window.inc.php");?></div>
  27.  <div id="footer"><? include("include/footer.inc.php");?></div>
  28.  
  29. </div>
  30.  
  31. </body>
  32. </html>




plik include/head.$_SESSION[lang].inc.php

w zależności od języka zmieniamy ustawienia nagłówka (temat, zawrtość, itd)

  1. <? echo '<?xml version="1.0" encoding="UTF-8"?>' ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5.  <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />
  6.  <meta http-equiv="pragma" content="no-cache" />
  7.  <meta http-equiv="cache-control" content="no-cache" />
  8.  <meta name="author" content="abc" />
  9.  <meta name="description" content="abc" />
  10.  <title>:: abc ::</title>
  11. <!--[if IE 7]><link rel="stylesheet" type="text/css" href="css/ie7.css" /><![endif]-->
  12.  <link rel="stylesheet" type="text/css" href="css/common.css" />
  13.  <link rel="stylesheet" type="text/css" href="css/layout_1.css" title="Podstawowy" />
  14.  
  15.  </head>
  16. <body>


w pliku css

  1. input.flaga_es {
  2. background-image: url(../img/flagi/flaga_es.gif);
  3. background-repeat: no-repeat;
  4. width: 24px;
  5. height: 18px;
  6. background-color: transparent;
  7. float: left;
  8. font-size: 0;
  9. }
  10. input.flaga_en {
  11. background-image: url(../img/flagi/flaga_en.gif);
  12. background-repeat: no-repeat;
  13. width: 24px;
  14. height: 18px;
  15. background-color: transparent;
  16. float: left;
  17. font-size: 0;
  18. }
  19. input.flaga_pl {
  20. background-image: url(../img/flagi/flaga_pl.gif);
  21. background-repeat: no-repeat;
  22. width: 24px;
  23. height: 18px;
  24. background-color: transparent;
  25. float: left;
  26. font-size: 0;
  27. }



w plikach języków
  1. <?php
  2. // ustawiam zmienną jako tablice
  3. $lng = array();
  4.  
  5. // opisy menu - linki:
  6.  
  7. $lng['tekst'] = 'tekst w odpowiednim języku';
  8. ?>



w treści strony wstawiam

  1. <?
  2. tu pojawi si&#281; ".$lng['tekst']."dla danej wersji językowej";
  3. ?>




Pozdrawiam i czekam na ocenę.

Piotr
Wykrywacz
A zamiast na przedszkolu nie powinno być to w opiniach?
Cysiaczek
Naprawdę użycie przycisku raportuj wystarczy...
Przenoszę na Oceny
empathon
Cytat(psbert @ 31.10.2008, 13:54:04 ) *
  1. <?php
  2. include('head.' . $_SESSION[lang] . '.inc.php');
  3.  
  4. include( './lang/'.$_SESSION[lang].'/menu.txt.php');
  5. include( './lang/'.$_SESSION[lang].'/text.txt.php');
  6. ...
  7. ?>

I tu skonczyłem sprawdzanie. Dzięki temu można zaincludować dowolny plik. Użyj tu switch'a albo tablicy z powiązaniami.
Athlan
  1. <?php
  2. $_SESSION['lang'] = $_POST['lang'];
  3. ?>

Radzę zamienić na:
  1. <?php
  2. $aAvalible = array('pl','en');
  3.  
  4. if(in_array($_POST['lang'], $aAvalible))
  5.  $_SESSION['lang'] = $_POST['lang'];
  6. ?>


To jest to, o czym mówił empathon.
psbert
Cytat(Athlan @ 2.11.2008, 07:59:21 ) *
  1. <?php
  2. $_SESSION['lang'] = $_POST['lang'];
  3. ?>

Radzę zamienić na:
  1. <?php
  2. $aAvalible = array('pl','en');
  3.  
  4. if(in_array($_POST['lang'], $aAvalible))
  5.  $_SESSION['lang'] = $_POST['lang'];
  6. ?>


To jest to, o czym mówił empathon.



Dzięki,

niestety Twój kod nie chce działać. Zauważyłem, że zjadłeś { } ale nawet pomimo ich dodania kod nie działa.
<? print_r($_POST['lang']); ?> zwraca prawidłowe wartości - pl en es

dodatkowo jeszcze poprawiam

  1. <?php
  2. include('head.' . $_SESSION[lang] . '.inc.php');
  3. ?>

na
  1. <?php
  2. include('./head.' . $_SESSION[lang] . '.inc.php');
  3. ?>


bo to też zwiększa poziom bezpieczeństwa skryptu.
skowron-line
A może pokaż więcej jak wyciągasz dane z pliku bo sam schemat includowania plików to nie wielojęzyczność.
psbert
Prosze bardzo.

  1. <?
  2. ini_set( 'arg_separator.output', '&' );
  3.  
  4. if ( !isset ($_SESSION['lang']))
  5. {
  6.     if ( isset ($_POST['lang']))
  7.     {
  8.  
  9.     $aAvalible = array( 'es' , 'en' , 'pl' );
  10.  
  11.     if (in_array( $_POST['lang'] , $aAvalible))
  12.          {
  13.          $_SESSION['lang'] = $_POST['lang'];
  14.          }
  15.     }
  16. }
  17. else
  18. {
  19. $_SESSION['lang']= es;
  20. }
  21.  
  22. include('./head.' . $_SESSION[lang] . '.inc.php');
  23.  
  24. include( './lang/'.$_SESSION[lang].'/menu.txt.php');
  25. include( './lang/'.$_SESSION[lang].'/text.txt.php');
  26.  
  27. ?>
skowron-line
Cytat(psbert @ 3.11.2008, 11:08:26 ) *
Prosze bardzo.

  1. <?
  2. ini_set( 'arg_separator.output', '&' );
  3.  
  4. if ( !isset ($_SESSION['lang']))
  5. {
  6.     if ( isset ($_POST['lang']))
  7.     {
  8.  
  9.     $aAvalible = array( 'es' , 'en' , 'pl' );
  10.  
  11.     if (in_array( $_POST['lang'] , $aAvalible))
  12.          {
  13.          $_SESSION['lang'] = $_POST['lang'];
  14.          }else $_SESSION[ 'lang' ] = 'es'; // jezeli nie ma języka na liscie to przydało by się załadować
  15.     }
  16. }
  17. else
  18. {
  19. $_SESSION['lang']= es;
  20. }
  21. // albo tu switch jak juz ktoś wyżej proponował
  22. include('./head.' . $_SESSION[lang] . '.inc.php');
  23.  
  24. include( './lang/'.$_SESSION[lang].'/menu.txt.php');
  25. include( './lang/'.$_SESSION[lang].'/text.txt.php');
  26.  
  27. ?>

a mi chodziło o to jak wyszukujesz tłumaczenia w plikach i co jak go nie znajdziesz.
Athlan
Cytat
niestety Twój kod nie chce działać. Zauważyłem, że zjadłeś { } ale nawet pomimo ich dodania kod nie działa.

Nie zjadłem. Nie musisz dawać { } dla operacji "jednoradowych", czyli z jednym ;.
psbert
Fragment kodu który nie chciał działać już poprawiłem i teraz wg mnie jest OK, ale dopiero uczę się PHP więc może być inaczej.

  1. <?
  2. ini_set( 'arg_separator.output', '&' );
  3.  
  4. $aAvalible = array('es', 'en' , 'pl');
  5.  
  6. if (isset ($_POST['lang']) && in_array($_POST['lang'], $aAvalible))
  7.          {
  8.          $_SESSION['lang'] = $_POST['lang'];
  9.          }
  10. elseif ( !isset ($_SESSION['lang']) || !in_array($_SESSION['lang'], $aAvalible))
  11.          {
  12.          $_SESSION['lang'] = es;
  13.          }        
  14.        
  15. include('./head.' . $_SESSION[lang] . '.inc.php');
  16.  
  17. include( './lang/'.$_SESSION[lang].'/menu.txt.php');
  18. include( './lang/'.$_SESSION[lang].'/text.txt.php');
  19.  
  20. ?>




co do podstawienia treści wygląda to tak

pliki

/lang/pl/menu.php

  1. <?php
  2. // ustawiam zmienną jako tablice
  3. $lng = array();
  4.  
  5. $lng['firma'] = 'Firma';
  6. $lng['oferta'] = 'Oferta';
  7. $lng['kontakt'] = 'Kontakt';
  8. // itd
  9. ?>


/lang/en/menu.php

  1. <?php
  2. // ustawiam zmienną jako tablice
  3. $lng = array();
  4.  
  5. $lng['firma'] = 'Corporate';
  6. $lng['oferta'] = 'Offer';
  7. $lng['kontakt'] = 'Contact';
  8. // itd
  9. ?>


W pliku gdzie mają być podstawione słowa/frazy
  1. <?
  2. echo $lng['firma'];
  3. echo $lng['oferta'];
  4. ?>

lub
  1. <?
  2. echo $lng['firma']." ".$lng['oferta'];
  3. ?>


Do pliku index.php wczytuję 2 pliki dla każdego języka.
Jeden zawiera opisy menu, drugi pozostałą treść strony.


Niestety jeszcze nie zrobiłem alternatywnego wyświetlania gdy nie ma czegoś w pliku z wybranym językiem lub gdy wpis jest błędny (literówka)

Strona na której zastosowałem powyższe rozwiązanie nie zawiera dużo treści, w związku z czym można większość szybko sprawdzić i poprawić. Jednakże trzymanie treści w tablicach jest dość wygodne i przejżyste (moje zdanie, nie musisz się z tym zgadzać)


Za wszelkie sugestie jak to rozwiązać będę wdzięczny.
bim2
Też zawsze byłem za tablicami w plikach językowych, ale tablica "przypięta" do jądra sprawuje się lepiej. biggrin.gif No, ale jesli raczkujesz dopiero w php to nieźle, nieźle winksmiley.jpg
tsharek
A ja tutaj widzę poważny błąd logiczny: Czy na pewno jesteś pewien że wybór języka powinien być wysyłany za pomocą POSTa? Jak dla mnie jest to nie logiczne. Powiedzmy polak i anglik chce wysłać tą samą stronę tylko w różnych językach dla swojego kolegi - niewykonalne. Ta informacja musi być w pasku adresu widoczna bez dwóch zdań...
psbert
Witam,
Poniekąd masz rację, ale strona jest tak skonstruowana że gdy klikniesz na flagę, nie zostanie przeładowana do strony głównej ale zachowa ten sam adres i jedynie podmieni tekst. Moje rozwiązanie byłoby bezsensowne gdyby po zmianie języka przenosiło na stronę startową.
skowron-line
Cytat(psbert @ 5.11.2008, 10:23:24 ) *
Witam,
Poniekąd masz rację, ale strona jest tak skonstruowana że gdy klikniesz na flagę, nie zostanie przeładowana do strony głównej ale zachowa ten sam adres i jedynie podmieni tekst. Moje rozwiązanie byłoby bezsensowne gdyby po zmianie języka przenosiło na stronę startową.


  1. <?php
  2. function makeLink( $getArr ) {
  3.    $firstPart = $_SERVER[ 'PHP_SELF' ];
  4.    
  5.    if( array_key_exists( 'lang', $getArr )){
  6.        unset( $getArr[ 'lang' ] );
  7.    }    
  8.    foreach( $getArr as $name => $value )
  9.        $secoundPart  .= $name .'='. $value .'&';
  10.        
  11.    return $firstPart .'?'.    substr( $secoundPart,0 ,strlen( $secoundPart ) );
  12.  
  13. }
  14.  
  15. // wywolanie
  16. $lang = array( 'pl', 'ang' );
  17. foreach( $lang as $L )
  18. echo'<a href="'. makeLink( $_GET ) .'lang='. $L .'">'. $L  .'</a>';
  19. ?>

Ja mam taką funkcję i tez nie przenosi do strony głównej, żadne cudo ale działa
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-2024 Invision Power Services, Inc.