Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> ?tagi i tłumaczenia stron - wady i zalety różnych rozwiązań?
nowy_pehapowiec
post
Post #1





Grupa: Zarejestrowani
Postów: 220
Pomógł: 0
Dołączył: 24.08.2009

Ostrzeżenie: (0%)
-----


Cze!
Przewertowałem wujaszka google i nadal nie wiem które rozwiązanie wybrać.



Tagi
1 Dodatkowa kolumna 'tags' nie spełniająca warunku normalności. Pojedyncze tagi rozdzielone przecinkiem albo średnikiem i wszystkie zapisane w jednym polu.
2 Dodatkowo tabela z kolumnami id, tag. Taka tabela tez nie jest normalna bo jeśli jeden id ma kilka tagów to id musi się powtarzać w następnych wierszach.

Jak widać ani jedno ani drugie rozwiązanie nie jest idealne. Pierwsze jest prostsze w realizacji. Drugie minimalnie trudniejsze, ale czy lepsze? Można to drugie zmodyfikować dodając dodatkową tabelę łączącą id, tag_id, a w tabeli tags trzymać tag_id i tag. Ale ideologia pozostaje ta sama.

Które rozwiązanie się sprawuje lepiej? Bo oba są złe - powtórzenia w poziomie albo w pionie.



Tłumaczenia
A dokładniej statyczne tłumaczenia. Czy lepiej tłumaczyć fragmenty stron, te które się zmieniają w różnych językach, czy lepiej całe strony?

1 Jak tłumacze całe strony, to minusem jest konieczność pamiętania o aktualizacji obu stron. Bo jak zmienię jedna stronę to druga działa bez problemów ale jest nieaktualna.

2 Jak tłumacze tylko fragmenty, to przy każdym fragmencie tekstu, czy to paragraf, czy podpis pod zdjęciem, czy element menu muszę użyć jakiejś funkcji, która z bazy pobierze tekst w odpowiednim języku. Czyli kod strony się robi bardziej nieczytelny i liczba selectów z bazy wzrasta.

Poradzicie coś w tych dwóch tematach? A może coś z zupełnie innej beczki
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
krowal
post
Post #2





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

Ostrzeżenie: (0%)
-----


Ech nie chciało mi się tłumaczyć więc napisałem dla Ciebie działający kod (IMG:style_emoticons/default/smile.gif)
  1. -- Struktura tabeli dla `translations`
  2. -- w bazie forum_php
  3. CREATE TABLE IF NOT EXISTS `translations` (
  4. `key` varchar(250) NOT NULL,
  5. `trans_en` text NOT NULL,
  6. `trans_pl` text NOT NULL,
  7. PRIMARY KEY (`key`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


  1. <?php
  2. mysql_connect('localhost', '', ''); // wpisz usera i pass
  3. mysql_select_db('forum_php');
  4.  
  5. class Trans{
  6. public static $keys = array();
  7.  
  8. public static function getParsedKey($key){
  9. self::$keys[] = $key;
  10. return '#translation_key_'.$key.'#';
  11. }
  12.  
  13. public static function translateContent($content){
  14. $query = 'SELECT * FROM translations AS t WHERE t.key IN (\''.implode("','", self::$keys).'\')';
  15. $result = mysql_query($query);
  16. $results = array();
  17. $existingKeys = array();
  18.  
  19. while($row = mysql_fetch_assoc($result)){
  20. $results[$row['key']] = $row;
  21. $existingKeys[] = $row['key'];
  22. }
  23.  
  24. $keysToAdd = array();
  25. $toChange = array();
  26. $translation = array();
  27.  
  28. if (isset($_GET['lang'])){
  29. $lang = $_GET['lang'];
  30. }else{
  31. $lang = 'pl';
  32. }
  33.  
  34. foreach(self::$keys as $k){
  35. if (!in_array($k, $existingKeys)){
  36. $keysToAdd[] = $k;
  37. }
  38. $toChange[] = '#translation_key_'.$k.'#';
  39. $translation[] = ((isset($results[$k]) && $results[$k]['trans_'.$lang] != '') ? $results[$k]['trans_'.$lang] : $k);
  40. }
  41.  
  42. foreach($keysToAdd as $k){
  43. $query = 'INSERT INTO translations (`key`) VALUES (\''.$k.'\')';
  44. mysql_query($query);
  45. }
  46.  
  47. return str_replace($toChange, $translation, $content);
  48. }
  49. }
  50.  
  51. function __($key){
  52. return Trans::getParsedKey($key);
  53. }
  54. ob_start('Trans::translateContent');
  55. ?>
  56. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  57. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  58. <head>
  59. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  60. <meta name="title" content="Super strona" />
  61. </head>
  62. <body>
  63. jakis text <?php echo __('full') ?><br />
  64. jakis text2 <?php echo __('painfully') ?><br />
  65. a tu jakis kolejny text <?php echo __('skip_me')?>
  66. </body>
  67. </html>
  68. <?php
  69. ?>


Dostępne są takie języki jakie są pola w bazie, w tym przypadku en i pl. Języki można zmienić wywołując skrypt z parametrem ?lang=xx , gdzie xx = (en,pl). Skrypt wykonuje tylko jedno zapytanie do bazy wybierając tłumaczenia. Oprócz tego jeśli wprowadzisz nowe klucze do tekstu za pomocą funkcji __(klucz) to dla każdego klucza zostanie JEDNORAZOWO wykonane zapytanie wstawiające klucz do tabeli.
Btw. to tylko przykład... aby działało to z jakąś większą aplikacją potrzebne są małe modyfikacje (IMG:style_emoticons/default/smile.gif)
Miłego korzystania.

@dr_bonzo, masz rację że tłumaczenie stron słowo po słowie jest bez sensu, ten kod również na to nie pozwala, pozwala jednak na tłumaczenie słów statycznych na stronie, dynamiczny content generowany przez userów to już inna sprawa. Skrypt pozwala na internacjonalizację strony a nie jej lokalizację.

Ten post edytował krowal 1.09.2009, 15:42:43
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 16:05