Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zmiana języka w menu górnym i bocznym
Forum PHP.pl > Forum > Przedszkole
xlambertx
Witam serdecznie, mam takie pytanie:
do tej pory na stronie po kliknięciu na znajdujące się w headerze flagi wyświetlane było tłumaczenie na temat firmy w odpowiednim języku. Wygląda to następująco:

  1. <div class="flag">
  2. <a href="#"><img src="<? echo $basehttp; ?>/images/flag_0.png" border="0" /></a>
  3. <a href="<? echo $basehttp; ?>/static/6/пра нас"><img src="<? echo $basehttp; ?>/images/flag_1.png" border="0" /></a>
  4. <a href="<? echo $basehttp; ?>/static/8/о нас"><img src="<? echo $basehttp; ?>/images/flag_3.png" border="0" /></a>
  5. </div>


tak miało być i do tej pory wystarczało, ale teraz chciałbym aby tłumaczone było także menu górne i boczne. Górne wygląda tak:

  1. <ul class="nav nav-justified" style="clear:both;">
  2. <li <? if($webPage == '/') echo 'class="active"'; ?>><a href="<? echo $basehttp; ?>"><img src="<? echo $basehttp; ?>/images/home.png" alt="Strona Główna"></a></li>
  3. <li <? if($webPage == '/aktualnosci.html') echo 'class="active"'; ?>><a href="<? echo $basehttp; ?>/aktualnosci.html">Aktualności</a></li>
  4. <li <? if($webPage == 'static' && $_GET[id] == '1') echo 'class="active"'; ?>><a href="<? echo $basehttp; ?>/static/1/o-naszej-firmie">O firmie</a></li>
  5. <li <? if($webPage == 'products') echo 'class="active"'; ?>><a href="<? echo $basehttp; ?>/products.html">Produkty </a></li>
  6. <li <? if($webPage == 'galeria') echo 'class="active"'; ?>><a href="<? echo $basehttp; ?>/galeria.html">Galeria</a></li>
  7. <li <? if($webPage == 'producenci') echo 'class="active"'; ?>><a href="<? echo $basehttp; ?>/producenci.html">Partnerzy i producenci</a></li>
  8. </ul>

natomiast kategorie w menu bocznym są już czerpane z bazy danych:

  1. <div class="menu <? if($webPage !== '/') echo 'page'; ?>">
  2. <h2>Kategorie</h2>
  3. <ul>
  4.  
  5. <?
  6.  
  7. $sql="SELECT title,id,ip, link, position FROM `products` WHERE `parent_id`='0' AND `show` = '1' ORDER by `position` ASC";
  8. $count = mysql_num_rows(mysql_query($sql));
  9. $wynik = mysql_query($sql) or die('Blad zapytania: '.mysql_error());
  10. $i=0;
  11. while($row = mysql_fetch_array($wynik)) {
  12. $i++;
  13. if($count == $i) {$classLast=' last';} else {$classLast='';}
  14. //print_r($_GET);
  15. //if($page == $row['id']) {$classActive=' active';} else {$classActive='';}
  16. if($row['link']){
  17. $link=$row['link'];
  18. } else {
  19. $link=generateUrl('products',$row['title'],$row['id'],$row['ip']);
  20. }
  21. $link = '#';
  22. echo '
  23. <li class="i'.$row['position'].$classLast.'"><a href="'.$link.'">'.$row['title'].'</a>';
  24. $resultSub = mysql_query("SELECT * FROM `products` WHERE `parent_id`='$row[id]' AND `show` = '1' ORDER by `position` ASC");
  25. $countSub = mysql_num_rows($resultSub);
  26. if($countSub > 0){
  27.  
  28. ?>
  29. <ul <? if($a[0] == $row[id]) echo 'style="display:block"'; ?>>
  30. <?
  31. while($roww = mysql_fetch_array($resultSub)) {
  32. if($roww['link']){
  33. $link=$roww['link'];
  34. } else {
  35. $link=generateUrl('products',$roww['title'],$roww['id'],$roww['ip']);
  36. }
  37. if($a[1] == $roww[id]) $classActive = ' active'; else $classActive = '';
  38. echo '
  39. <li class="i'.$roww['position'].$classLast.$classActive.'"><a href="'.$link.'">'.$roww['title'].'</a></li>';
  40. }
  41. echo '</ul>';
  42. }
  43. echo '</li>';
  44. }
  45.  
  46. ?>
  47. </ul>
  48. </div>


Chciałbym aby po kliknięciu na odpowiednią flagę wyświetlane było menu górne i boczne w odpowiednim języku. Jak się do tego zabrać?
stefano_F
Witaj.
1) menu górne
Ja bym wprowadził tablicę lub zmiene i w zależności od wybranej wersji językowej przypisać odpowiednie wartości, np.
  1. if ($wersja_jezykowa == "PL") {
  2. $aktualnosci = 'Aktualności';
  3. $o_firmie = 'O firmie';
  4. $produkty = 'Produkty';
  5. }
  6.  
  7. if ($wersja_jezykowa == "DE") {
  8. $aktualnosci = 'Nachrichten';
  9. $o_firmie = 'über uns';
  10. $produkty = 'Produkte';
  11. }

wyświetlenie tych informacji, tak jak Ty to masz, tylko zmieniasz statyczne napisy na zmienne:
  1. <li <? if($webPage == '/aktualnosci.html') echo 'class="active"'; ?>><a href="<? echo $basehttp; ?>/aktualnosci.html"><? echo $aktualnosci; ?></a></li>
  2. <li <? if($webPage == 'static' && $_GET[id] == '1') echo 'class="active"'; ?>><a href="<? echo $basehttp; ?>/static/1/o-naszej-firmie"><? echo $o_firmie; ?></a></li>
  3. <li <? if($webPage == 'products') echo 'class="active"'; ?>><a href="<? echo $basehttp; ?>/products.html"><? echo $produkty; ?> </a></li>
  4.  
  5.  
  6.  



2) menu boczne
dodaj kolumnę z nazwami z obcym języku, lub kilka kolumn jak języków masz więcej;
w zależności od wybranej wersji językowej ifem użyj innego zapytania, np.
  1. SELECT title,id,ip, link, position FROM `products` WHERE `parent_id`='0' AND `show` = '1' ORDER BY `position` ASC;
  2. lub
  3. SELECT title_DE,id,ip, link, position FROM `products` WHERE `parent_id`='0' AND `show` = '1' ORDER BY `position` ASC;
  4. lub
  5. SELECT title_UK,id,ip, link, position FROM `products` WHERE `parent_id`='0' AND `show` = '1' ORDER BY `position` ASC;

dodaj zmienną np. $nazwa i pod nią podstawiaj wybraną z bazy nazwę w odpowiednim języku, np. $nazwa = $row['title_DE'];

wówczas będziesz mógł zastąpić wyświetlanie danych które robisz np. tutaj:
  1. echo '
  2. <li class="i'.$row['position'].$classLast.'"><a href="'.$link.'">'.$row['title'].'</a>';


uniwersalnym wyświetlaniem typu:
  1.  
  2. echo '
  3. <li class="i'.$row['position'].$classLast.'"><a href="'.$link.'">'.$nazwa.'</a>';


Mam nadzieję, że trochę naprowadziłem w odpowiednim kierunku.
xlambertx
Wielki dzięki, posiedzę i podłubię. Jeżeli będę miał jakieś problemy to będę dopytywał.
skarabe.pl
Dodam jeszcze, że zaproponowane wersje zapytania można zapisać tak (z wykorzystaniem aliasów):
  1. SELECT title,id,ip, link, position FROM `products` WHERE `parent_id`='0' AND `show` = '1' ORDER BY `position` ASC;
  2. lub
  3. SELECT title_DE AS title,id,ip, link, position FROM `products` WHERE `parent_id`='0' AND `show` = '1' ORDER BY `position` ASC;
  4. lub
  5. SELECT title_UK AS title,id,ip, link, position FROM `products` WHERE `parent_id`='0' AND `show` = '1' ORDER BY `position` ASC;

Wtedy nie trzeba będzie w ogóle modyfikować kodu PHP odpowiedzialnego za wyświetlanie. BTW, "UK" to nie jest nazwa języka - chyba, że chodziło o ukraiński :)
xlambertx
Rzeczywiście chodzi o język ukraiński, a do tego białoruski i rosyjski będzie smile.gif
stefano_F
Cytat(skarabe.pl @ 18.06.2014, 05:17:49 ) *
Wtedy nie trzeba będzie w ogóle modyfikować kodu PHP odpowiedzialnego za wyświetlanie. BTW, "UK" to nie jest nazwa języka - chyba, że chodziło o ukraiński smile.gif


O aliasach nie pomyśałem, rzeczywiście ułatwią sprawę.
Tak, tak, jak najbardziej miałem na myśli ukraiński tongue.gif
Pyton_000
Pomysł aby trzymać tłumaczenia w dodatkowej kolumnie jest bynajmniej mało optymalny i elegancki.

Rozwiązanie: Tworzysz dodatkową tabelę np. products_langs i przenosisz do niej wszystkie elementy produktu które mają być tłumaczone. Dodatkowo dodajesz kolumnę odpowiedzialną za język czyli masz np:
Kod
product_id    |    title    |    description    | smth_else    |    lang

Wyciąganie danych:
  1. SELECT title,id,ip, link, position FROM `products` p JOIN `products_langs` pl ON (pl.product_id = p.id) WHERE `parent_id`='0' AND `show` = '1' AND pl.lang = 'UK' ORDER BY `position` ASC

Dzięki temu masz nieograniczoną ilość języków a rozwiązanie jest niezwykle proste i wydajne.
xlambertx
Wielkie dzięki, powiedz mi jeszcze w którym miejscu powinienem wstawić odwołanie do bay danych i czy przy falagach też powinno zostać coś dopisane żeby wyło wiadomo, że odwołanie dotyczy containera?
Pyton_000
Eeee... To jest zapytanie które "dobiera" Ci tłumaczenie do contentu. Musisz sobie gdzieś zapisywać wybrany język i przekazywać do zapytania.
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.