Skocz do zawartości

Zdjęcie
* * * * * 1 głosy

Wielojęzyczny szablon HTML/CSS


12 odpowiedzi w tym temacie
  • Zaloguj się, aby dodać odpowiedź
zonic

    WT Elite

  • 2 911 postów
    • Czas spędzony online: 134d 2h 28m 23s
472
Znakomita!
  • LocationToruń

Napisano 24 lutego 2015 - 22:58

#1

Hej, 
jakie rozwiązanie polecacie dla wsparcia wielojęzyczności w stronach bez CMS?

Na początek chciałem w prostej stronce HTML/CSS mieć treści w językach PL/EN i szukam mega lekkiego i niezawodnego rozwiązania.


  • 0

unbreak

    WT Elite

  • 1 937 postów
    • Czas spędzony online: 27d 8h 43m 36s
506
Znakomita!
  • Location/home/unbreak

Napisano 25 lutego 2015 - 08:47

#2
Ja mam gdzieś w domu fajne rozwiązanie na zasadzie słownikowej.
Wygląda to tak że wpisujesz frazy w formie: `core.company_name`
a php odpowiednio po rozpoznaniu języka na podstawie urla, szuka w tablicy odpowiedniej frazy i ją w danym miejscu replace-uje :D
Tablica wygląda mniej więcej tak:
 
array(
'core' => array(
 'company_name' => 'Nazwa firmy',
 'telephone' => '+48 123456789',
  ...
),
'contact' => array( ... ),
...
)
Array jest budowany w locie na podstawie plików językowych:
core.pl:
comapny_name = Nazwa firmy;
telephone = +48 123456789;
...
core.en:
comapny_name = Company Name;
telephone = +44 1234586987;
...
Hmm, mam nadzieję że jasno to opisałem :D Jak nie to zrobię drugie podejście :D
  • 0

webDeveloper


Zimistrz

    Stary wyjadacz

  • 465 postów
    • Czas spędzony online: 14d 2h 42m 38s
116
Znakomita!

Napisano 05 marca 2015 - 15:57

#3

@unbreak: to dopiero część rozwiązania, notabene też takie stosuję :)

Tablice językowe kondensuję w jednym pliku z lenistwa, w postaci

$plt = array(
'homepage' =>'strona główna',
...
)
$ent = array (
...

Do tego jeszcze jedna tablica zawierająca powtarzające się frazy we wszystkich językach + złączenie poprzez array_merge().
W samym szablonie wciągam plik z tłumaczeniem, wykrywam język przeglądarki i sprawdzam/ustawiam ciacho; do ostatniego korzystałem chyba z rozwiązań SO: http://stackoverflow...language-toggle
Na koniec najzwyklejszy switch:

switch($lang) {
case "pl":
$text = $plt;
        break;
}
...

Jakiegoś defaulta wypada w switchu jeszcze obrać w zależności od strony - jeśli z ciachem albo detekcją przeglądarki sprawa nie wypali - i pozostanie osadzanie fraz w odpowiednich miejscach:  echo $text['homepage']

 

ps. chętnie przygarnąłbym gotowy snippet typu bulletproof obsługujący ciacho i detekcję języka przeglądarki ;)


  • 1

unbreak

    WT Elite

  • 1 937 postów
    • Czas spędzony online: 27d 8h 43m 36s
506
Znakomita!
  • Location/home/unbreak

Napisano 05 marca 2015 - 16:01

#4

A widzisz, trochę inaczej robisz, bo ty musisz rypać wszystko własnie na zasadzie "echo $text['homepage']" a ja w miejscu gdzie ma być jakieś słowo/zdanie w wersjach językowych wpisuję proste:

`core.telephone` a później zaraz przed wygenerowaniem finalnego widoku odpowiedniego preg_replace'a używam i samo się mi wszystko odpowiednio podmienia. Jak nie zapomnę wieczorem jak będę w domu to odkopię to rozwiązanie i dokładniej zademonstruję wrzucając gdzieś jakieś demo :)


  • 0

webDeveloper


writen

    Stary wyjadacz

  • 458 postów
    • Czas spędzony online: 29d 22h 59m 44s
133
Znakomita!

Napisano 05 marca 2015 - 17:04

#5
Wychodzi na to, unbreak, że lubisz proste rozwiązania, ale za to wolniejsze.

Wysłane z telefonu.
  • 0

logo-green-dark.png


unbreak

    WT Elite

  • 1 937 postów
    • Czas spędzony online: 27d 8h 43m 36s
506
Znakomita!
  • Location/home/unbreak

Napisano 06 marca 2015 - 08:34

#6

Czemu twierdzisz że wolniejsze?


Poniżej zajebiście uproszczona wersja :) Normalnie to biegnie po katalogu 'modules' i zaciąga tłumaczenia dla wszystkich, tutaj jest tylko jeden katalog 'layots'. Mam gdzieś nowszą wersję, ale różni się jedynie 'ładniejszym' kodem, bo zasada działania jest identyczna.


$contex = 'tutaj mamy cały html widoku gdzieś tam przechwycony';

$lm = new langauge_languageManager($lang); /* $lang to np 'pl','en' etc. wykryty gdzieś tam wcześniej, klasa langauge_languageManager wrzucona poniżej */
$contex = $lm->translateString($contex);
echo $contex; //tutaj echo czy co tam jeszcze potrzeba zrobić z htmlami :)
 
Class langauge_languageManager
Spoiler

 
class langauge_languageLoader
Spoiler

  • 0

webDeveloper


writen

    Stary wyjadacz

  • 458 postów
    • Czas spędzony online: 29d 22h 59m 44s
133
Znakomita!

Napisano 06 marca 2015 - 09:06

#7
Wyświetlenie odpowiednich zmiennych będzie zawsze szybsze niż pobieranie zawartości pliku, przypisywanie go do zmiennej, następnie podmiana odpowiednich wyrażeń i dopiero wyświetlenie całości. Chyba widzisz ile tych operacji tu musisz wykonać.

Wysłane z telefonu.
  • 0

logo-green-dark.png


Zimistrz

    Stary wyjadacz

  • 465 postów
    • Czas spędzony online: 14d 2h 42m 38s
116
Znakomita!

Napisano 06 marca 2015 - 10:56

#8

 a później zaraz przed wygenerowaniem finalnego widoku odpowiedniego preg_replace'a używam i samo się mi wszystko odpowiednio podmienia.

I can not PHP ale na samo użycie preg_replace() przechodzi mnie zimny dreszcz.
Zauważyłem w kodzie zakomentowany '/e' więc przynajmniej jesteś w pełni świadom zagrożeń z tym związanych.
 

Natomiast zgadzam się z writenem, wydajność preg_replace pozostawia wiele do życzenia.

ps. jeśli generujesz cały widok i dopiero wyświetlasz czy używasz do tego output buffering ?


  • 0

zonic

    WT Elite

  • 2 911 postów
    • Czas spędzony online: 134d 2h 28m 23s
472
Znakomita!
  • LocationToruń

Napisano 06 marca 2015 - 11:01

#9

Czyli będę wdzięczny za konsensus i złoty środek ;)


  • 0

writen

    Stary wyjadacz

  • 458 postów
    • Czas spędzony online: 29d 22h 59m 44s
133
Znakomita!

Napisano 06 marca 2015 - 11:48

#10

No moim zdaniem rozwiązanie unbreak'a jest trochę przekombinowane. Nie twierdzę, że jest złe, ale dwie klasy żeby przetłumaczyć prostą stronę to jednak za dużo. W dużych aplikacjach z zaawansowanym systemem szablonów na pewno jest to dobre ułatwienie. Ale w prostej stronie, o której mówi zonic najprościej i najszybciej zrobić tak jak Zimistrz zaproponował.

Nie ma złotego środka. :P


  • 0

logo-green-dark.png


unbreak

    WT Elite

  • 1 937 postów
    • Czas spędzony online: 27d 8h 43m 36s
506
Znakomita!
  • Location/home/unbreak

Napisano 07 marca 2015 - 08:42

#11

ps. jeśli generujesz cały widok i dopiero wyświetlasz czy używasz do tego output buffering ?

Tak.

 

No moim zdaniem rozwiązanie unbreak'a jest trochę przekombinowane. Nie twierdzę, że jest złe, ale dwie klasy żeby przetłumaczyć prostą stronę to jednak za dużo. W dużych aplikacjach z zaawansowanym systemem szablonów na pewno jest to dobre ułatwienie. Ale w prostej stronie, o której mówi zonic najprościej i najszybciej zrobić tak jak Zimistrz zaproponował.

Nie ma złotego środka. :P

No szczerze to właśnie rozwiązanie jest zaczerpnięte z dużego systemu sklepów i przerobione na własną korzyść. Do prostej strony też go użyłem bo miałem gotowy, więc nie widziałem sensu pisania czegoś innego, tylko właśnie przeniesienie tego rozwiązania było dla mnie jedynym słusznym rozwiązaniem.

 

Co do wydajności, proszę Was. Mogę się założyć że jeżeli byłaby jakaś różnica w tych rozwiązaniach to na poziomie mikrosekund, niezauważalna.


  • 0

webDeveloper


Michał

    Stary wyjadacz

  • 301 postów
    • Czas spędzony online: 16d 7h 11m 3s
95
Znakomita!

Napisano 07 marca 2015 - 14:32

#12

Co do wydajności, proszę Was. Mogę się założyć że jeżeli byłaby jakaś różnica w tych rozwiązaniach to na poziomie mikrosekund, niezauważalna.

Zgodze się. Weźmy na przykład forumowe parsery, które nieraz mają do sprawdzenia bardzo długie posty pod kątem pierdyliarda znaczników BBCode, i jakoś to w miarę szybo działa. Regexy nie takie straszne jak się wydaje.


  • 1

writen

    Stary wyjadacz

  • 458 postów
    • Czas spędzony online: 29d 22h 59m 44s
133
Znakomita!

Napisano 07 marca 2015 - 17:51

#13

Właśnie dlatego słabsze serwery nie radzą sobie z dużymi skryptami.

Ja bardzo dbam o optymalizacje aplikacji, dlatego we własnych projektach nigdy nie wplatam do systemu szablonów jakiś dziwnych rzeczy. Bo to tak naprawdę niczemu nie służy, oprócz wygody osoby kodującej szablon. BBCode to jest akurat najmniejszy problem.


  • 0

logo-green-dark.png






Podone tematy Collapse

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych