Я создал массив $ _en для хранения английских слов / предложений и массив $ _no для хранения норвежского текста, чтобы использовать его в качестве перевода для моего основного проекта PHP.
<?php
$_en = array(
'mail' => 'email',
'msg1' => 'how are you?'
);
$_no = array(
'mail' => 'epost',
'msg1' => 'hvordan har du det ?'
);
echo "EMAIL IN ENGLISH:".$_en['mail']."\n"; //email in english
echo "EMAIL IN NORWEGIAN:".$_no['mail']; //email in NORWEGIAN
echo "Message IN NORWEGIAN:".$_no['msg1']; //Message in NORWEGIAN
На основе массива и значения ключа текст будет вызываться на основе функции перевода сайта.
Любые лучшие решения и улучшения приветствуются. Поправь меня заранее спасибо.
Лучшее решение, как уже упоминалось, мой Thamilan в комментариях будет использовать класс для обработки конверсий.
Думайте об этом так;
Ваш файл шаблона
$trans = new Translate('en');
<h1><?php echo $trans->__('This is a title'); ?></h1>
Translate.php
class Translate {
public function __construct($lang) {
$this->lang = $lang;
}
public function __($string) {
// $translatedString = $this->getTranslatedString($string);
return $translatedString;
}
}
В этом классе вам нужно получить перевод из того места, где он хранится. Вы можете хранить в этом классе в массиве, или лучшим решением было бы загрузить их из файла CSV.
Попробуй это :—
parse_ini_file () — очень мощный маленький инструмент, который делает именно то, что вы ожидаете. Используя такой простой файл, который мы назовем en.ini:
PAGE_TITLE = My website page title
HEADER_TITLE = My website header title
SITE_NAME = My Website
SLOGAN = My slogan here
HEADING = Heading
MENU_LOGIN = Login
MENU_SIGNUP = Sign up
MENU_FIND_RIDE = Find Ride
MENU_ADD_RIDE = Add Ride
MENU_LOGOUT = Logout
Вы можете просто использовать: parse_ini_file (‘en.ini’) для возврата массива точно так же, как в вашем операторе switch, что будет намного проще для других (не программистов) читать и писать для вас. И если бы вы затем продолжали именовать файлы этим стилем, вы могли бы уменьшить userLanguage () до чего-то вроде:
public function userLanguage()
{
$file = '/path/to/language/config/' . $this->UserLng . '.ini';
if(!file_exists($file))
{
//Handle Error
}
return parse_ini_file($file);
}
Другое решение Попробуйте: —
Создать абстрактный класс
interface Language
{
public function getPageTitle();
public function getHeaderTitle();
public function getSiteName();
public function getSlogan();
public function getHeading();
public function getMenuLogin();
public function getMenuSignup();
public function getMenuFindRide();
public function getMenuAddRide();
public function getMenuLogout();
}
Хотя интерфейс небольшой, его реализация может привести к созданию большого файла, хотя, возможно, он будет более понятным, чем стиль массива:
class English implements Language
{
public function getHeaderTitle()
{
return 'My website header title';
}
public function getHeading()
{
return 'Heading';
}
// etc...
}
Альтернатива: —
В качестве альтернативы, вы можете комбинировать эти стили и иметь одноэлементный язык с методами получения, обращающимися к этому массиву, т.е.
class Language
{
private $languageArray;
private $userLanguage;
public function __construct($language)
{
$this->userLanguage = $language;
$this->languageArray = self::userLanguage();
}
private static function userLanguage()
{
$file = '/path/to/language/config/' . $this->userLanguage . '.ini';
if(!file_exists($file))
{
//Handle Error
}
return parse_ini_file($file);
}
public function getPageTitle()
{
return $this->languageArray['PAGE_TITLE'];
}
public function getHeaderTitle()
{
return $this->languageArray['HEADER_TITLE'];
}
//etc...
}
Который обеспечит преимущества обоих. Лично, хотя, если вы не планируете добавлять больше языков в ближайшем будущем, я думаю, что решение №2 подойдет вам лучше всего.