MULTI-LANGUAGE???

Kavhann

Registered
Здравейте имам следния проблем,

Искам да направя сайт, който поддържа няколко езика. Прочетох много статии и рових доста. Една ясна и добре написана статия е примерно следната:

http://www.stylusinc.com/website/multilanguage_support.htm

В нея са изложени три модела за направа на многоезичен сайт, от които последния ми хареса най-много. Казано така както аз го разбрах за себе си той гласи следното. Имаме серия от страници:

index.php
site1.php
site2.php
...
siteN.php

В тях няма нищо друго освен дефиниции на елементи, например таблици див елементи, спан и т.н. Всеки един от тези спан, див и прочие има някакво ID. От друга страна имаме поддиректории /BG, /EN ,/FR, /и т.н. Всяка една от тези директории съдържа поредица от *.php файлове, в които имаме голямо количество (е...все пак зависи от Уеб сайта, който правим) масиви. Например:

array1
array2
...
arrayN

Всеки един от тези масиви съдържа текст, HTML код и т.н. Файловете масивите и всичко, което се намира в директория /EN е абсолютно копие на това което е в другите директории, но с това изключение, че за всяка директория езикът, на който са написани текстовете е строго различен.
И така...
Целта на цялото занятие е в зависимост от това какъв език искаме, то зареждаме съдържанието на една или друга директория в предварително дефинираните елементи в:

index.php
site1.php
site2.php
...
siteN.php

Адресирането до тези елементи става чрез техните ID-та.
Ако тази концепция е правилна и не съм объркал нещо имам следните въпроси:

След някакво събитие случило се в siteN.php, как всъщност се правят тези извиквания на масив елементи от *.php файловете???
Как въобще се прави връзката между масивите и див елементите, как се принтира съдържанието на кой да е елемент от масива и т.н. и т.н.???

Надявам се да съм бил ясен. Лек ден иии ще се радвам на отговори.
 
Ами до колкото знам е,че трябва да направиш примирно две папки или там колко ти си ришиш със копие от файловете на сайта,но със разлицен език и да направиш връзки към всеки тях.
 
До тук добре, но как става връзката?
Ще дам пример, за да съм още по-ясен. Ако ползвам AJAX ситуацията ще стои по следния начин:

Имам събитие, което извиква javascript функция. Тази функция създава така наречения xmlHttpRequest() обект, който праща заявка до сървър-а, че има нужда от информация Х. Сървъра отговаря подобаващо като му праща пакети от информация, които ще присвояват на някаква променлива. След това тази променлива се подава на браузъра към елемент с някакво ID. Подаването става с document.getElementByID ... и т.н. нещо такова.
Общо взето процесът е простичък:

Събитие -> Молба към сървъра (дай насам) -> Сървъра казва ОК -> Сървъра дава -> Браузъра взема -> Браузъра изобразява -> Клиентът евентуално е доволен...

Моят въпрос е именно такъв:

Може ли някой да опише подобен процес за извеждане на данни записани в PHP масиви...Нещо такова:

Нещо се случва -> "Нещо казва дай инфото от масива" -> PHP-то вика Дръж -> Браузъра взима и изобразява

Може ли някой да опише този процес ИЗЦЯЛО в контекста на многоезичната (Multi-Language) идея? Мерси.
 
Здравей,

ще се опитам да ти обясня накратко как би могло да стане.

Всичко, което каза е правилно, но изглежда не можеш да го реализираш.

Да кажем, че имаш следните папки и файлове.

Папка EN.
Тя съдържа: main.php
Други файлове няма да давам, защото принципът с тях е същият.

Следващата папка е BG.
Тя съдържа същият файл: main.php с единственото изключение, че съдържанието на файла ще бъда на български, докато при горният файл в папка EN на ангийски.
До тук всичко ти е ясно.


Първо създаваме main.php
Ето ти го за папка EN:
Код:
<?php
$l['main'] = "Hello, welcome!";
$l['bb'] = "Bye :P";
?>
Дал съм ти малко изрази, но въпросът е да ти стане ясно за какво става на въпрос.
Ето ти и main.php, който ще се намира примерно в папка BG:
Код:
<?php
$l['main'] = "Здравейте, добре дошли!";
$l['bb'] = "Чао :P";
?>

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


Сега следва да създадем файла, в който ще си избираме езиците :)
Нека бъде index.php

Код:
<?php
session_start();
?>
<a href="index.php?lang=bg">Български</a> | <a href="index.php?lang=en">Английски</a><br><br><br>

<?php
if (isset($_SESSION['lang']))
{
if ($_GET['lang'] == bg) { $_SESSION['lang'] = "BG"; // сменяме езика на български
}
elseif ($_GET['lang'] == en) { $_SESSION['lang'] = "EN"; // сменяме езика на английски
}
}
else
{
$_SESSION['lang'] = "BG"; // това тук ти е езикът по подразбиране.
}

// След като вече сме избрали език следва да прочетем файлът main.php в една от 2-те директории. Как ще стане това?

$lang = $_SESSION['lang']; // Така променливата $lang има стойността на избраната папка за език.
include("$lang/main.php");

// И сега следва най-лесната част и тя е за изкарването на изразите от main.php
?>
<html>
<head>
</head>
<body>
<?=$l['main']?><br><br><?=$l['b']?>
</body>
</html>


Това е поразгледай какво съм направил и ако нещо не ти е ясно питай, защото не съм много добър в обясненията :P
 
Нека се опитам да пресъздам наученото в няколко изречения:

Основната информация се съдържа в асоциативни масиви под формата на:

$Ime_na_masiv['asociacia'] = "Sudurjanie";

Което на простичък език ще рече, ако имаме масив Ime_na_masiv и му викнем "ШШШ ей asociacia" той ще се обърне към нас и ще каже: "Sudurjanie". Удобно и лесно за писане на бърз и кратък код...разбирам.
И така, отделяме си две папки ако искаме всъщност може и повече и във всяка една от тях записваме идентични по името файлове, в които всичко е едно и също с изключение на съдържанието им. СЪДЪРЖАНИЕТО в тях е запазено с помощта именно на асоциативни масиви.
Във файл намитащ се извън папките, в случая нека да е index.php имаме едно кило <div>, <span> или други елементи, в които чрез PHP код правим следното:

<?php echo $Ime_na_masiv['asociacia']; ?>

И нещо много важно: Ако include-нем онези файлове намиращи се в папка /EN чрез този ред ще се принтира английската версия, ако обаче добавим онези, които са в /BG ще покажем българската версия. Въпросът е каква асоциация ще си направи сървъра, когато реши да метне нещо на браузъра!!! Коя от двете директории ще сочи зависи от това, кой език сме задали чрез някакво меню за избор на езика!
Тази техника работи и я одобрявам. Надявам се, че също така работи и бързо за по-големи сайтове. HunteR имаш точка от мен :?: .

//..................................................................................................

Тук обаче имам един друг въпрос, който също е много ВАЖЕН. ;)

До този момент имах една страница на която имам един, два или няколко <div> елемента с някакви id-та. И! чрез някакво меню, кликайки върху бутоните му правя AJAX заявки, с които принтирам съдържание върху някой от елементите.
Сега обаче когато вече имам и смяна на езика чрез принтиране на променливи положението малко се усложни. Какво имам предвид???

Ами...заради смяната на езика в някой див елементи трябва да имам някакви PHP променливи, който се принтират според езика. До тук ОК! Да предположим обаче, че в някой от тези див елементи искам вече да принтирам съвсем друг текст. Например от:

"Здравейте, това е сайт за глупости..."

да принтирам вече:

"За да видите повече глупости можете да се регистрирате чрез..."

По същество това са два различни асоциативни масива, което значи че преходът от единия към другия изисква подмяна на принтираната PHP променлива. Как да стане това чудо?
Казано по кратко, но не толкова ясно: Как можем да съчетаем многоезичния модел показан по-горе с въможността да преминаваме от една към друга подстраница???
 
ХРУМНА ми следната идея:

Асоциация в асоциацията, която трябва да има следния вид:

Кликването върху бутон или въобще някакво събитие води до промяната на стойност Х някъде си ТАМ! От някъде си ТАМ взимаме стойността и я запаметяваме в следната стойност:

$element = $Nqkude_si_tam

След това в желаният от нас ДИВ елемент принтираме това:

<?php echo $DIV['element']; ?>


Където принтираното може да бъде равно на някой от тези:

$DIV['element'] = $Ime_na_masic['asociacia1']
$DIV['element']=$Ime_na_masic['asociacia2']
$DIV['element']=$Ime_na_masic['asociacia3']
...
$DIV['element']=$Ime_na_masic['asociaciaN']

Кое от тях ще сочи зависи от следната поредица от събития:

Конкретно събитие -> Води до промяна на Някъде си там -> $element от своя страна присвоява тази промяна -> принтираме я чрез <?php echo $DIV['element']; ?>, която според началното събитие сочи конкретеб елемент.
Ако решим да сменим езика: Ако решим да сменим езикаааа чисто и просто...сменяме диекторията към която ще сочим и си взимаме асоциациите от там.
Общо взето звучи, като ще да е ПЕРФЕКЦИЯ ;)
HunteR я разгледай и кажи има ли хляб в тая работа.
 
От всичко написано успях да разбера, че искаш примерно в дадена ситуация да изкарва един текст, а в друга ситуация - друг текст.

Така просто във lang файла си правиш 2 променливи.

$l['text1'] = "Здравейте, това е сайт за глупости..." ;
$l['text2'] = "За да видите повече глупости можете да се регистрирате чрез...";

Така в index.php, който се води за главен файл и там искаш да изкарваш съобщенията просто правиш проверка, кой от двата текста да бъде изкаран.

За това са if и else :)

Примерно да кажем, че искаш да направиш проверка дали потребителя се е регистрирал и влезнал в акаунта.

<?php

// проверяваме дали има отворена сесия за потребителя. Ако има значи си е влезнал в акаунта и продължаваме.

if (isset($_SESSION['user']))
{
echo $l['text1']; // ако си е влезнал в акаунта му изкарва първото съобщение
}
else
{
echo $l['text2']; // ако не си е влезнал в акаунта му изкарва второто съобщение
}

?>

Надявам се си наясно със сесийни променливи ;)

Ако нещо не ти е ясно или съм обяснил нещо, което не ти е нужно - това значи, че не съм разбрал правилно въпросът ти :)

Ако има нещо друго питай ;)
 
Може ли този преход да стане с родител на сешън променливата lang. Какво имам предвид? Виж следния сайт:

http://www.fibank.bg/inside.php?language=1&parent=39

В линк-а има два важни момента:

?language=1

и

&parent=39

Очевидно ?language=1 се ползва за смяна на езика. Тогава аз питам, може ли &parent=39 да ползва в случая за преход от една страница към друга, както попитах по-горе??? Ако да, то как?
 
Да предприемем, че пак разполагаш с папки EN и BG и вътре в тях по 1 файл main.php

Ето кода за index.php
Код:
<?php
session_start();
?>
<a href="index.php?language=1&parent=1">Български</a> | <a href="index.php?language=2&parent=1">Английски</a><br><br><br>
$lang = $_GET['language'];
<?php
if (isset($lang))
{
if ($lang == 1) { $language = "BG"; // сменяме езика на български
}
elseif ($lang == 2) { $language = "EN"; // сменяме езика на английски
}
}
else
{
$language = "BG"; // това тук ти е езикът по подразбиране.
}

// След като вече сме избрали език следва да прочетем файлът main.php в една от 2-те директории. Как ще стане това?

include("$language/main.php");

// И сега следва най-лесната част и тя е за изкарването на изразите от main.php
?>
<html>
<head>
</head>
<body>
<?=$l['main']?><br><br><?=$l['b']?>
</body>
</html>
Като винаги след index.php примерно трябва да имаш ?language=1 или 2 или 3,4,5 и т.н. в зависимост с колко езика разполага сайта.

Това с parent ще стане така.


switch ($_GET['parent'])
{
case "1":
include("str1.php");
break;
case "2":
include("str2.php");
break;
default:
include("default.php");
break;
}

И така include-ваш дадена страница в зависимост от стойността на parent.

Този код може да стане и с if,elseif.
Примерно:

if ($_GET['parent'] == 1) { include("str1.php"); }
elseif ($_GET['parent'] == 2) { include("str2.php"); }
else { include("default.php"); }

Дано примерите ми са ти помогнали.
 
Чакай да прочета горното ти съобщение...и тогава ще кажа дали е това което търся...
 
Е добре де за какво ги дадох тия if-ове :)
Малко преработка и ще стане.

Ето примерна страница:

Код:
<a href="?parent=1">Меню 1</a> <a href="?parent=2">Меню 2</a> <a href="?parent=3">Меню 3</a><br><br><br>
<?php
if ($_GET['parent'] == 1) {
echo "Текст едно :)"; // на мястото на Текст едно можеш да сложиш променлива от lang файла
}
elseif ($_GET['parent'] == 2) {
echo "Текст две :)"; // на мястото на Текст две можеш да сложиш променлива от lang файла
}
elseif ($_GET['parent'] == 3) {
echo "Текст три :)"; // на мястото на Текст три можеш да сложиш променлива от lang файла
}
?>

EDIT: Явно си си редактирал съобщението преди аз да постна това :D
 
Ето го кода на index.php, малко съм го попроменил:

<?php
session_start();
?>
<a href="index.php?lang=bg&parent=1">Български</a> | <a href="index.php?lang=en&parent=1">Английски</a><br><br><br>

<?php
if (isset($_SESSION['lang']))
{
if ($_GET['lang'] == bg) { $_SESSION['lang'] = "BG"; // сменяме езика на български
}
elseif ($_GET['lang'] == en) { $_SESSION['lang'] = "EN"; // сменяме езика на английски
}
}
else
{
$_SESSION['lang'] = "BG"; // това тук ти е езикът по подразбиране.
}

// След като вече сме избрали език следва да прочетем файлът main.php в една от 2-те директории. Как ще стане това?

$lang = $_SESSION['lang']; // Така променливата $lang има стойността на избраната папка за език.
include("$lang/str1.php");

// И сега следва най-лесната част и тя е за изкарването на изразите от main.php




switch ($_GET['parent'])
{
case "1":
include("$lang/str1.php");
break;
case "2":
include("$lang/str2.php");
break;
default:
/*include("default.php");*/
break;
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<a href="index.php?lang=$_SESSION['lang']&parent=1">Menu 1</a>
<a href="index.php?lang=$_SESSION['lang']&parent=2">Menu 2</a>
<br/>
<?php echo $l['main']; ?><br><br>
<?php echo $l['bb']; ?>


</body>
</html>



Ето ги и другите файлове:

/BG
str1.php
<?php
$l['main'] = "Здравейте, добре дошли!";
$l['bb'] = "Чао :P";
?>

str2.php
<?php
$l['main'] = "За да видите услугите на нашия сайт моля регистрирайте се!";
?>

/EN
str1.php
<?php
$l['main'] = "Hello, welcome!";
$l['bb'] = "Bye :P";
?>

str2.php
<?php
$l['main'] = "If you want to see the full aveable services of our web page please register in!";
?>

Благодаря за помощта беше доста полезно!!!!! Ако има още въпроси предполагам, че мога да ги отправя.
 

Back
Горе