Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zasady pisania na forum Pro

Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.

9 Stron V  « < 3 4 5 6 7 > »   
Reply to this topicStart new topic
> Wielojęzykowość, Czekam na Wasze propozycje
rzymek01
post 30.05.2008, 13:39:42
Post #81





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


racja, mój błąd smile.gif

nie chciałem już mieszać, bo na początku chciałem zrobić lang_id


--------------------
:]
Go to the top of the page
+Quote Post
Blodo
post 6.07.2008, 05:56:10
Post #82





Grupa: Zarejestrowani
Postów: 51
Pomógł: 1
Dołączył: 1.02.2005

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


Kolejny odkop no ale..

Ja uzywam dwoch tabel: jedna dla tzw. metadata czyli ID, kategoria; druga dla samych tlumaczen. Przypisuje im jezyk za pomoca lang_id w drugiej tabeli, I wyciagam z bazy za pomoca JOINa. Ogolnie ten skrypt co mam automatycznie wybiera jezyk przegladarki dla uzytkownika, lub - jezeli nie ma takiego jezyka w systemie - wybiera jezyk domyslny (angielski).

Zakladajac ze w bazie danych nie zawsze bedzie tlumaczenie dla kazdego artykulu w jezyku uzywanym w tym momencie przez uzytkownika, jak moznaby sformulowac zapytanie do SQLa tak aby przy wyciaganiu artykulow dla danej kategorii wyciagalo wszystkie artykuly w wersji jezykowej uzytkownika lub w wersji jezyka domyslnego jezeli poprzednie sie nie powiodlo? Poki co moim rozwiazaniem jest SELECT na wszystkie lang_id, i potem sprawdzanie co wyswietlic a co nie za pomoca PHP, ale to troche badziewne rozwiazanie IMO. Ktos sie natknal na taki problem?
Go to the top of the page
+Quote Post
Sedziwoj
post 7.07.2008, 08:00:55
Post #83





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@Blodo
Może coś w tym stylu:
  1. SELECT * FROM base_data AS b LEFT JOIN lang_data AS l ON ( l.base_data_id = b.id AND l.lang_id = x) LEFT JOIN lang_data AS l2 ON (l2.lang_id = y AND l.id IS NULL);

x - id wybranego języka
y - id domyślnego języka
To jest na JOIN, ale mam parę pomysłów na inne rozwiązania, tylko raczej nie wydajniejsze.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
Blodo
post 7.07.2008, 23:24:09
Post #84





Grupa: Zarejestrowani
Postów: 51
Pomógł: 1
Dołączył: 1.02.2005

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


Hmm, dobry pomysl. Co prawda trzeba w php potem sprawdzic ktore pole z tabeli nie jest "NULL", no ale i tak lepiej niz bylo. Dzieki ci za to.
Go to the top of the page
+Quote Post
Sedziwoj
post 7.07.2008, 23:58:30
Post #85





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Cytat(Blodo @ 8.07.2008, 00:24:09 ) *
Hmm, dobry pomysl. Co prawda trzeba w php potem sprawdzic ktore pole z tabeli nie jest "NULL", no ale i tak lepiej niz bylo. Dzieki ci za to.


No to zrób jeszcze jedno użyj CASE... i wtedy w php nic nie robisz, tylko wyświetlasz.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
Albitos
post 19.08.2008, 15:17:06
Post #86





Grupa: Zarejestrowani
Postów: 37
Pomógł: 4
Dołączył: 6.08.2006
Skąd: Lublin

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


Wybaczcie, że odgrzewam temat. Baardzo długo zastanawiałem się nad rozwiązaniem wielojęzykowości w moich skryptach. Końcowo doszedłem do wniosku, że idealnym rozwiązaniem będzie wykorzystanie systemu wbudowanego w OPT oraz kilku ciekawych ulepszeń. Po pierwsze, wszystkie stałe językowe przechowywane są w kategoriach niezależnych od czegokolwiek. Grupujesz jak chcesz, potem wczytujesz te grupy. Wczytanie jednej stałej z grupy powoduje wczytanie wszystkich z danej grupy.

Załóżmy, że mamy takie grupy:
  • navigation
  • contact
  • home
  • global
Teraz struktura plików:
languages/pl/
navigation.php
contact.php
home.php
global.php
languages/en/
navigation.php
contact.php
home.php
global.php

Każdy plik PHP składa się z tablicy $lang, która zawiera stałe. Dlaczego akurat tablica, a nie jakiś XML/YAML? Otóż z bardzo banalnego powodu. W pewnym momencie, kiedy pracowałem nad grą internetową (http://orodlin.pl) okazało się, że stałych odpowiedzialnych za niektóre akcje jest bardzo dużo (w jednym pliku ponad 500), natomiast wykorzystywana jest tylko jedna. Ładowanie wszytkich takich danych przy pomocy parsera byłoby całkowicie bezcelowe - marnotrawstwo pamięci.
Dlatego zamiast tablicy stworzyłem obiekt implementujący interfejs ArrayAccess, który pobiera potrzebne stałe prosto z bazy danych. Muszę przyznać, że jestem z takiego rozwiązania bardzo zadowolony. Wszystkie stałe są pogrupowane w logiczne kategorie, w razie konieczności przechowania większych ilości danych, używam odpowiedniego obiektu bez modyfikowania samego systemu językowego.
Pozostał tylko jeden zasadniczy problem - rozbicie wszystkich stałych na kilka plików wymusza wczytanie za każdym razem kilku plików. Ten problem rozwiązałem, używając cache. Wszystkie stałe, o ile nie pochodzą z dynamicznych tablic (tych obiektów implementujących ArrayAccess) zapisuję przy pomocy jednej wielkiej zserializowanej tablicy i zapisuję w pliku. Każda akcja w kontrolerze ma taki swój własny plik. W ten sposób kilka plików ładowanych jest tylko za pierwszym razem.

Jestem w trakcie pisania pluginu do OPT który będzie realizował taki system. Mam nadzieję, że wszystkim się spodoba. Tymczasem chciałbym poznać wszystkich opinie, co sądzą o takim rozwiązaniu.

EDIT: Co do danych dynamicznych, w Orodlinie istnieje założenie, że gra = jeden język. W innych projektach, gdy muszę mieć różne wersje językowe dynamicznych danych (np. artykułów), po prostu w tabeli dodaję pole określające język.

Ten post edytował Albitos 19.08.2008, 15:19:07


--------------------
Albi's Jogger - z pamiętnika młodego programisty
Orodlin Team Member
Go to the top of the page
+Quote Post
tomek_swat
post 12.10.2008, 20:13:47
Post #87





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 3.04.2008

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


mam pytanie jak sobie radzicie z wersją językową przechwyconych wyjątków, w każdej klasie jest:
  1. <?php
  2. throw new exception (..)
  3. ?>

i jak to uzależnić od wyboru języka, ja trzymam wszystkie klasy w folderze /classes i właśnie rozwiązanie tego problemu sprawia mi kłopoty?
pzdr
Go to the top of the page
+Quote Post
Crozin
post 12.10.2008, 21:15:54
Post #88





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Ale w jakim celu tłumaczyć wyjątki? One są raczej informacją dla programu/skryptu, a nie użytkownika.

Możesz:
1) Przeklazać już odpowiednio przetłumaczony wyjątek:
  1. <?
  2. throw new Exception(myTransolator('invalidABCDE'));
  3. ?>

2) Napisać właśną klasę wyjątków, która robi to co kod powyżej, ale już wewnątrz siebie:
  1. <?
  2. class MyException extends Exception{
  3.  public function __construct($msg = '', $code = 0){
  4.    $this->msg = myTranslate($msg);
  5.    $this->code = $code;
  6.  }
  7. }
  8. ?>
Ale jeszcze raz zapytam: po co?
Go to the top of the page
+Quote Post
tomek_swat
post 13.10.2008, 11:43:50
Post #89





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 3.04.2008

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


załóżmy, że mam klasę Config, która jest Singletonem i pobiera z pliku .ini wersję jęzkową systemu
jezyk = "pl" i w zależności od tego klasa Lang, parsuję odpowieni plik .ini z folderu gdzie znajdują się odpowiednie wersję językowe
co jeśli w pliku settings.php parsowanym przez klasę Config, użytkownik wpiszę język, który nie jest uwzględniony w folderze w którym znajdują się wersję językowe? pozostaję wypluć wyjątek, tu właśnie pojawia się w problem w jakim on ma być języku i jak ten język zaimplementować w klasie Lang i Config?
pzdr
Go to the top of the page
+Quote Post
Sedziwoj
post 13.10.2008, 15:23:27
Post #90





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Nie zawsze wyjątki są najlepsze, powinieneś sprawdzić czy dany język istnieje jeśli nie to ustawiany jest domyślny. Jeśli gdzieś w serwisie jest użyte coś, czego nie ma w pliku językowym to jest błąd, i taka informacja też nie musi być rozpowszechniana po prostu wymuszenie przez moduł językowy załadowania informacji o błędzie/braku informacji, to już jest statyczna informacja niezależna od błędu, no i log dla nas aby dojść co się sypnęło.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
test_next
post 2.07.2009, 10:12:06
Post #91





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 23.11.2007

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


Witam,
tak pobieżnie przeglądając odpowiedzi nie widziałem sposobu z definiowaniem zmiennych językowych jako stałe np. define('HELLO_WORLD","Hello world"); echo HELLO_WORLD. Co o tym sądzicie?
Pozdrawiam
Go to the top of the page
+Quote Post
erix
post 2.07.2009, 10:27:14
Post #92





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Mało przenośne. Co w sytuacji, gdy np. stała konfiguracyjna będzie nosiła tę samą nazwę jak językowa?

Poza tym, wg Twojego schematu idealny byłby gettext" title="Zobacz w manualu PHP" target="_manual.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
test_next
post 2.07.2009, 11:12:29
Post #93





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 23.11.2007

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


tak tylko aplikacja ma być przenośna, a gettext nie wszędzie jest zainstalowany.
No i jeszcze wchodzi w grę licencja tego typu rozwiązań - odpada GPL.
Go to the top of the page
+Quote Post
viking
post 2.07.2009, 11:23:21
Post #94





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


To zainteresuj się Zend Framework (i zanim napiszesz coś o gettext przeczytaj dokładnie dokumentację).


--------------------
Go to the top of the page
+Quote Post
test_next
post 2.07.2009, 11:51:36
Post #95





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 23.11.2007

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


To include GNU gettext support in your PHP build you must add the option --with-gettext[=DIR]
przeczytałem i ?
Go to the top of the page
+Quote Post
bim2
post 2.07.2009, 11:54:13
Post #96





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Nie miałem siły przeglądać całego watku, ale moim zdaniem najlepszym wyjściem jest podany 3 posty wyżej przez erixa sposób. gettext" title="Zobacz w manualu PHP" target="_manual Oczywiście jakaś nakładka na to co by zapamiętała jakie frazy używam w systemie i generacja pliku .po A później już z górki :]

Przez 2 lata używałem zwykłych zmiennych includowanych do klasy języków i metodą get() pobierania ich. Ale to nie jest wyjście. Ciężko się połapać w tym wszystkim.


--------------------
Go to the top of the page
+Quote Post
viking
post 2.07.2009, 11:56:40
Post #97





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Cytat(test_next @ 2.07.2009, 12:51:36 ) *
To include GNU gettext support in your PHP build you must add the option --with-gettext[=DIR]
przeczytałem i ?

Mówiłem o ZF.

Cytat
The Zend_Translate Gettext Adapter is not implemented using PHP's gettext extension. You can use the Gettext Adapter even if you do not have the PHP gettext extension installed. Also the Adapter is thread-safe and the PHP gettext extension is currently not thread-safe.


--------------------
Go to the top of the page
+Quote Post
test_next
post 2.07.2009, 12:02:54
Post #98





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 23.11.2007

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


viking: ok, ale aplikacja jest dosyć rozbudowana i nie ma już sensu przenosić jej na zend'a...
Go to the top of the page
+Quote Post
Crozin
post 2.07.2009, 12:56:10
Post #99





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Zapewne da się ten komponent "wyciąć" z niego i stosować osobno.
Go to the top of the page
+Quote Post
erix
post 2.07.2009, 14:18:37
Post #100





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
tak tylko aplikacja ma być przenośna, a gettext nie wszędzie jest zainstalowany.

Zobacz sobie, jak jest emulowane to rozszerzenie w Wordpressie.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post

9 Stron V  « < 3 4 5 6 7 > » 
Reply to this topicStart new topic
5 Użytkowników czyta ten temat (5 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2024 - 04:55