BG Development


  Reply to this topicStart new topicStart Poll

> PHP уеб сайт на два езика с .mo и .po файлове, Нужно ми е малко помощ относно, ако...
CaTzArOv
Публикувано на: 13-12-2017, 13:44
Quote Post



Име: бай Данчо
Група: Потребител
Ранг: Новопостъпил

Мнения: 8
Регистриран на: 13.12.17



Здравейте Другари,
Влезе ми една муха от няколко дни да се науча как да направя многоезичен сайт с php.
Попаднах случайно на този форум докато търсех разрешение на незнанието си и се надявам тук да срещна съмишленици icon_smile.gif

Четох една статия в чужд сайт, не зная дали е редно да слагам линк, още с първия си пост, затова ще напиша какво съм направил и какво не зная как да направя.

Създавам файл: translation.php

CODE

<?php
$locale = false; // initilize language parameter
if (isSet($_GET["locale"])) // check if getting locale value in query string
{
   $locale = $_GET["locale"]; // add selected language in variable
}
else
{
   $locale = "en_US"; // set English US as default language
}

putenv("LANGUAGE=$locale");
setlocale(LC_ALL, $locale);

$domain = "messages";
bindtextdomain($domain, "locale");

bind_textdomain_codeset($domain, "UTF-8");

textdomain($domain);
?>


Създавам и един index.php файл:

CODE

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<a href="?locale=en_US">English</a> |
<a href="?locale=fr_FR">French</a> |
<a href="?locale=hi_IN">Hindi</a> |
<a href="?locale=ur_PK">Urdu</a>
<br>
<br>
<?php echo gettext("Hello World");?><br>
<p><?php echo gettext("My name is");?> Huzoor Bux.</p>
</body>
</html>


В описанието пише, че трябва да създам папка с име locale при и в нея да създам под-папки с имена en_US и fr_FR. В тези папки съм създал и файлове от Poedit софтуера със същите имена. В ръководството по което се водя, пише, че "gettext" ще добави липсващите проводи в празните .mo и .po файлове, но това не се случва при мен и опрях на камък.

Моля, за съвет, ако някой може да ми удари едно рамо и да сподели как да свържа php файловете да четат превода от файловете.

Благодаря за отделеното ми време и внимание.
PMEmail Poster
Top
hristonev
Публикувано на: 13-12-2017, 14:15
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 105
Регистриран на: 19.09.17



моя грешка...
CODE
putenv("LANGUAGE=$locale");

на
CODE
putenv("LC_ALL=$locale");


Това мнение е било редактирано от hristonev на 13-12-2017, 14:19
PMEmail Poster
Top
escapeboy
Публикувано на: 13-12-2017, 14:32
Quote Post



Име: Никола Кацаров
Група: Потребител
Ранг: Редовен член

Мнения: 412
Регистриран на: 04.12.04



А пишеше ли че трябва да рестартираш сървъра когато променяш .mo файла? (при някои не е нужно де).
На пръв поглед gettext-a е много як, но в последствие е малко тегав. За да обновиш .po/.mo файловете трябва да сканираш php файловете за промени с PoEdit и после да качиш .mo файла на сървъра и да рестартираш. Или да ползваш някакъв versioning в името на файла. Ако правиш често промени става филм.
Мисля, че трябваше да имаш и инсталирал locale-то в самата система.

Измислих си функция която работи на същия принцип, но ползва база данни.
Горе-долу нещо такова е:
CODE

function t($string) {

       if(count(config('app.locales'))==1) return $string;

       $all_translations = config('app.translations');
       $translated = $all_translations->where('hash', md5($string.config('app.locale')))->first();
       if(!$translated){
           $translated = \LaraMod\Admin\Translate\Models\Translations::firstOrCreate([
               'hash' => md5($string.config('app.locale'))
           ]);
           $translated->fill([
               'string' => $string,
               'value' => '',
               'lang' => config('app.locale')
           ])->save();
       }
       if($translated->value) return $translated->value;
       return $string;
   }

Това обаче е за Laravel. Това config('app.translations') всъщност е кеширана версия на всички преводи.
Извиква се функция t('Някакъв текст'), проверява се дали съществува превод, ако няма го добавя в базата данни. Там вече имам в админ панела форма за преводи.


--------------------
Laravel, CodeIgniter... Web бла-бла... и други сложни думи
http://katsarov.biz
https://localz.events
PMEmail PosterUsers Website
Top
CaTzArOv
Публикувано на: 13-12-2017, 14:47
Quote Post



Име: бай Данчо
Група: Потребител
Ранг: Новопостъпил

Мнения: 8
Регистриран на: 13.12.17



За мен ще бъде сложно и невъзможно да направя това с Ларвела, но .mo и .po файловете ще е лесно за всеки уеб дизайнер с бъдещ клиент, който иска сайта му да бъде на друг език, да му изпрати .po файла и да си направи превода сам, на колкото езика си иска icon_smile.gif

От това което можах да разбера сега в движение е, че тези .мо и .по файлове се ползват при Wordpress и чрез тях се превеждат темплейти и цели сайтове.
PMEmail Poster
Top
kapitancho
Публикувано на: 13-12-2017, 14:55
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1067
Регистриран на: 26.02.05



Най-лесният (но не и най-добър) начин за преводи е да направиш няколко файла - примерно lang.en.php, lang.bg.php и т.н. за всеки език.
Вътре имаш нещо от сорта на:
CODE

$lang = [
 'name' => 'Име',
...
];


Съоъветно, според езика include-ваш само файлът, който отговаря на дадения език и след това ползваш $lang['name'] където ти потрябва превод.
Когато го пробваш, ще видиш колко е лесно, но вероятно бързо ще видиш и недостатъците. Но за целите на експеримента - става.

Това мнение е било редактирано от kapitancho на 13-12-2017, 14:58


--------------------
®...¢↓"←—¬ªº±£™×÷⁄...©
PMEmail Poster
Top
CaTzArOv
Публикувано на: 14-12-2017, 11:05
Quote Post



Име: бай Данчо
Група: Потребител
Ранг: Новопостъпил

Мнения: 8
Регистриран на: 13.12.17



Аз се заиграх малко с варианта с арай, който капитанчо предложи, ама отново не ми достигат знанията icon_smile.gif

Създадох файл: lang.en.php

CODE
<?php
$lang = array(
   "greeting" => "Hello World",
      "text" => "This text is on English"
);
?>


Създадох и файл за български: lang.bg.php

CODE
<?php
$lang = array(
   "greeting" => "Здравей Свят",
      "text" => "Този текст е на Български език"
);
?>


Създадох и индекс файл index.php

CODE
<?php
      include 'lang.en.php';
      include 'lang.bg.php';
?>

<a href="?lang=en">English</a> | <a href="?lang=bg">Bulgarian</a> <br><br><hr>

<h1><?php echo $lang['greeting']; ?></h1><br>
<h2><?php echo $lang['text']; ?></h2>


Въпроса ми тук е, как да направя променливата в адреса ?lang=?? да извиква съответния арай в index.php Вероятно ми е нужен някакъв JavaScript или ???
PMEmail Poster
Top
CaTzArOv
Публикувано на: 14-12-2017, 12:21
Quote Post



Име: бай Данчо
Група: Потребител
Ранг: Новопостъпил

Мнения: 8
Регистриран на: 13.12.17



Намерих разрешение, не е с .mo и .po файлове, но подкарах мултиезичност в php файл icon_smile.gif

Да споделя и за други в нужда, как да направят сайт на повече от един език чрез php, без използване на база данни.

1. Създават index.php файл със суичър за промяна на езика и include на lang.php файла, който се създава в стъпка 3
CODE
<?php
include_once("languages/lang.php");
?>

<a href="?lang=en">English</a> | <a href="?lang=bg">Bulgarian</a> | <a href="?lang=ru">Русский</a> <br><br><hr>

<h1><?php echo htmlspecialchars($lang['greeting']); ?></h1><br>
<h2><?php echo htmlspecialchars($lang['text']); ?></h2>


2. Създаване на директория с име language в която ще се съхраняват файловете от стъпка 3,4,5,6

3. Създаване на файл lang.php в папката language
CODE
<?php
if ( isset( $_GET['lang'] ) )
{
   if ( !set_lang_id( $_GET['lang'] ) ) set_lang_id( get_lang_id() );
}
else
{
   set_lang_id( get_lang_id() );
}

function is_language_supported( $lang_id )
{
   $langs = array( "en", "bg", "ru" );

      return ( in_array( $lang_id, $langs ) ) ? true : false;
}

function set_lang_id( $lang_id )
{
   if ( strlen( $lang_id ) == 2 && is_language_supported( $lang_id ) )
      {
          $language_file = includeTrailingCharacter( realpath(dirname(__FILE__)), "/" ) . $lang_id."_language.php";

          if ( is_file( $language_file ) && file_exists( $language_file ) )
       {            
           $expiration_date = time()+3600*24*365;
           setcookie( 'lang', $lang_id, $expiration_date, '/');
              include_once( $language_file );
                  return true;
            }
            else
            {
                return false;
            }
      }
      else
      {
          return false;
      }
}

function get_lang_id()
{
      return ( isset( $_COOKIE['lang'] ) && strlen( $_COOKIE['lang'] ) == 2 && is_language_supported( $_COOKIE['lang'] ) ) ? htmlspecialchars($_COOKIE['lang']) : 'en';
}

function includeTrailingCharacter($string, $character)
{
   if (strlen($string) > 0) {
       if (substr($string, -1) !== $character) {
           return $string . $character;
       } else {
           return $string;
       }
   } else {
       return $character;
   }
}
?>


4. Създаване на файл за Български език с име bg_language.php в папката language
CODE
<?php
global $lang;

$lang['greeting'] = 'Здравей Свят';
$lang['text'] = 'Този текст е на Български език';

?>


5. Създаване на файл за Английски език с име en_language.php в папката language
CODE
<?php
global $lang;

$lang['greeting'] = 'Hello World';
$lang['text'] = 'This text is on English';

?>


6. Създаване на файл за Руски език с име ru_language.php в папката language
CODE
<?php
global $lang;

$lang['greeting'] = 'Привет Мир';
$lang['text'] = 'этот текст на русском языке';

?>


За да добавите нов език във файла lang.php на ред 13 се добавя префикса на новия език, същия префикс трябва да бъде и на ??_language.php файла. Пример: Добавяме нов Испански език, на ред 13 се дописва след ru в скобите , "es" създава се и нов файл es_language.php и в него се слага съдържание от вече преведените други ??_language.php файлове и превежда се на испански. За да се визуализира този език в Index.php файла се добавя за него: <a href="?lang=sp">Spanish</a>

Благодаря на капитанчо, че ми даде идеята с която си разреших казуса и оставям настрани .mo и .po варианта за превод в сайта icon_smile.gif
PMEmail Poster
Top
hristonev
Публикувано на: 14-12-2017, 13:18
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 105
Регистриран на: 19.09.17



Ако оставате на този не добър вариант, то поне си добавете една функция да проверява има ли го елемента в масива. В противен случай трябва да гарантирате, че всички езикови файлове ще имат всички ключови думи. Без функцията ще има бум, рано или късно icon_lol.gif

ПП варианта po/mo е пъти по добър. С малко четене ще стане.
PMEmail Poster
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0