Pytanie Najlepszy sposób na wdrożenie wielojęzycznego PHP


Przede wszystkim wiem, że istnieje wiele odpowiedzi na temat funkcjonalności wielojęzycznej, nie znalazłem odpowiedzi na to, czego chcę.

Myślałem o trzech sposobach, z którymi mogę pracować. Potrzebuję tworzyć pliki języków za pomocą PHP za każdym razem, gdy dodaję nową wartość do interfejsu formularza WWW.

Pierwsze dwa są podobne - używają tablic lub definiują w określonym pliku językowym i dołączają je na początku biegu. Ale w tym przypadku mogę załadować tysiące definicji lub tablic, aby użyć kilku na każdej stronie.

Trzecim sposobem jest utworzenie funkcji, która jest wywoływana za każdym razem ze słowem kluczowym lub pełną frazą i użyciem IF-s lub switch wybrać właściwy termin (lub zwrócić klucz, jeśli nie pasuje).

Jaki jest najlepszy sposób na zrobienie tego? Postanowiłem zrobić kilka testów. Próbowałem na trzy różne sposoby i mierzyłem czas i pamięć, która się do tego zabrała:

  1. Zdefiniowałem tablicę (22 wartości) i przejechałem ją od 1 do 1 000 000 - sprawdziłem pod kątem wartości wywołania - 1 z trzech przy użyciu % operator, aby wybrać, którego użyć i po prostu ustawić go na zmiennej

    • Czas trwał: 0,476591110229 sekunda
    • Pamięć: 6536 bajtów
  2. Użyłem tej samej tablicy (22 wartości) i wywołałem ją przy użyciu funkcji - return $arr[$string]; (tylko dla wygodnego sposobu pracy i możliwości zmiany go na inny sposób, jeśli będę potrzebował)

    • Czas trwał: 0,960635185242 sekunda
    • Pamięć: 6704 bajtów
  3. Stworzyłem funkcję z listą ciągów znaków i użyciem switch->case Wybrałem powracający ciąg

    • Czas trwał: 1.46953487396 sekunda
    • Pamięć: 848 bajtów

Teraz pytanie brzmi: jaki jest właściwy wybór - preferowanie czasu lub preferowanie pamięci.

A w przypadku, gdy strony są duże i zajęłoby to dużo pamięci - nie mogłem tego zmienić, ponieważ jest zbudowany z tablic - Jeśli działa z funkcją, zawsze mogę to zmienić.


12
2017-09-26 18:07


pochodzenie


Możliwy duplikat: stackoverflow.com/questions/2790952/... - Justin ᚅᚔᚈᚄᚒᚔ
możliwy duplikat Jak stworzyć wielojęzyczną stronę w php i MySQL - JJJ
php.net/manual/en/function.gettext.php - Imre L
Myślałem, że to napisałem - ale teraz widzę, że zapomniałem - nie podobało mi się gettext, potrzebuję czegoś, z czym łatwiej pracować, chociaż sposób, w jaki działa, wydaje się ładny - nie sprawdziłem tego, ale to wygląda na moją trzecią drogę - Joe Polico
Mając na uwadze dyskusję pod moją odpowiedzią, myślę, że ważne jest, aby dodać do pytania: na jakiej skali pracujesz i ile ciągów mówisz? Czy mówisz o tłumaczeniu interfejsu lub tłumaczeniu treści wprowadzanych przez użytkowników? To są 2 różne rzeczy ... - Maxim Krizhanovsky


Odpowiedzi:


Jeśli chodzi o kod, coś takiego będzie dla ciebie wspaniałe. Musi opierać się na wyborze użytkownika (Wybór języka z przycisku lub menu) lub w oparciu o język przeglądania (nie jest to najlepszy aprouch).

index.php

<?php

// verify the user's choice
if ($_POST[lang] == "en") 
{
    include_once("en_language.php");
}

if ($_POST[lang] == "pt") 
{
    include_once("pt_language.php");
}

// calling a lable in your page
echo LABEL_MENU;


// the rest of your file
...
?>

en_language.php

<?php
// ENGISH Language file
define('LABEL_MENU','Main Menu');

// the whole file with the labels of your system

?>

pt_language.php

<?php
// PORTUGUESE Language file
define('LABEL_MENU','Menu Principal');

// the whole file with the labels of your system

?>

uzupełniające

Jeśli chcesz używać typu tablicy niż wartości stałe za pomocą funkcji define (), ale nie jestem pewien, co jest szybsze niż ..

$arrays = array("MAIN_MENU" => "Main Menu", "LEFT_MENU" => "Left Menu"); 
echo $arrays["MAIN_MENU"];

5
2017-09-26 18:42



Jak już powiedziałem - myślałem o tym (lub korzystałem z tablic), ale mimo to - mogę zdefiniować wiele ciągów, których nie będę używał, a kiedy strona zyskuje dużo odwiedzin, staje się ciężka (chyba) - Joe Polico
@Joe Polico - Świetnie, jest to prosta droga. - B4NZ41
Ale szukam zarówno - najłatwiejszego i najszybszego sposobu (na serwer) do pracy. I rzeczywiście, w łatwy sposób lepiej użyć funkcji zarządzającej wszystkimi ciągami językowymi - Joe Polico
Myślę, że nic nie jest tak łatwe w ten sposób, którego szukasz, perheps lepiej wybrać framework podobny do ZEND lub jakikolwiek smak frameworka php, który preferujesz, ponieważ wszystkie one traktują języki jako podstawę swojej pracy. Ale powiem ci, to nie jest takie łatwe, szczególnie, jeśli nigdy wcześniej nie korzystałeś z frameworka. - B4NZ41
Nie sądzę, żebym mógł zacząć zmieniać cały mój sposób pracy, by pracować z pewną strukturą. Ale czy możesz mi powiedzieć, co z nich jest lepsze - tworzenie funkcji switch->case struktura lub użycie tablic / definicji? - Joe Polico


Grupuj łańcuchy w kategorie - jedną globalną i drugą - odpowiadającą widokom, które masz na stronie internetowej (na przykład lang_global, lang_profile, lang_something_else) Dołącz plik globalny i plik odpowiadający bieżącemu widokowi. W ten sposób nie załadujesz całego tłumaczenia, a jedynie jego podzbiór. Jest bardziej zarządzalny i możesz podać kontekst, mając różne tłumaczenia na tym samym ciągu.


1
2017-09-26 18:27



Potrzebuję go do CMS - to jest pewien problem, aby podzielić go na wiele części - system może się zmienić w każdej witrynie, a łańcuchy językowe można wywołać z dowolnego miejsca ... zbyt skomplikowane jest bałagan z pozycją każdego ciągu w funkcjach / files w dowolnym momencie, gdy chcę je wywołać - Joe Polico
Nadal masz jednostki w CMS. Obiekty mogą mieć oddzielne pliki językowe. I każdy moduł / wtyczka może mieć również plik językowy. - Maxim Krizhanovsky
Nadal jest to skomplikowane, aby pracować z ... system jest tylko podstawą i trzeba go zmieniać na każdej stronie, próbując zdefiniować za każdym razem, gdzie umieszczenie bieżącego ciągu znaków nie jest tak prostym sposobem pracy - Joe Polico
Następnie umieść w bazie danych. Utwórz dynamiczną pamięć podręczną - wszystkie ciągi używane przez bieżącą stronę, nagrane przez ciąg, tłumaczenie, ścieżkę strony, a więc przy kolejnych żądaniach zapytanie przez ścieżkę strony (pole indeksowane) i uzyskiwanie tłumaczeń, zamiast wywoływania ciągu według ciągu znaków ... - Maxim Krizhanovsky
A jeśli mam ciąg, który pojawia się w każdej kategorii w mojej galerii? Może mieć wiele ścieżek - Joe Polico


jest tu przydatna odpowiedź, ale polecam symfony / tłumaczenie jeśli używasz kompozytor jako menedżer zależności.

lang / messages.fr.yaml:

Hello, %name%!: Bonjour, %name%!
Goodbye: Goodbye!

lang / messages.en.yaml:

Hello, %name%!: Hello, %name%!

file.php:

<?php
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\Translator\Loader\YamlFileLoader;

require_once __DIR__ . '/vendor/autoload.php';

$translator = new Translator();

$translator->addLoader('yaml', new YamlFileLoader());
$translator->addResource('yaml', __DIR__ . 'lang/messages.en.yaml', 'en');
$translator->addResource('yaml', __DIR__ . 'lang/messages.fr.yaml', 'fr');

$translator->setFallbackLocales(array('en'));

$translator->setLocale('en');

echo $translator->translate('Hello, %name%!', ['name' => 'saif']); // Hello, saif!

$translator->setLocale('fr');

echo $translator->translate('Hello, %name%!', ['name' => 'saif']); // Bonjour, saif!
// Goodbye isn't set in the "fr" file, translator uses the fallback locale instead
echo $translator->translate('Goodbye'); // Goodbye !

przeczytaj więcej na temat korzystania z komponentu tłumacza symfony tutaj.


0
2017-08-08 22:41