Автор Тема: Многоезичен сайт - CodeIgniter 2.0  (Прочетена 7267 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

borovaka

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 1
  • -Получени: 48
  • Публикации: 906
Многоезичен сайт - CodeIgniter 2.0
« -: 26 Февруари 2011, 20:13:52 »
Обсъждане на урока **Многоезичен сайт - CodeIgniter 2.0**
Автор: Методи
« Последна редакция: 15 Април 2015, 21:03:05 от Avalanche »
Та извода е прост: "Колкото по-големи ла*ната - толкова по-малка щетата! ... моралната де, не материалната"

thehell

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 3
Re:Многоезичен сайт - CodeIgniter 2.0
« Отговор #1 -: 01 Март 2011, 20:48:18 »
Много добър урок БРАВО! ;) ;)

thestrong

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 7
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #2 -: 11 Юли 2012, 21:27:51 »
Да попитам нещо:
Иска ми се сайтът ми (онлайн магазин) да е двуезичен в такъв случай в базата данни съм си добавил една таблица:
IDL   Language
 1       Bulgarian
 2        English/

И към всяка таблица, в която ще се добавя информация на двата езика съм сложил полето IDL.
Удачно ли е да го направа така?

Ще може ли да се интегрира показанато в клипа ако табиците са повече и почти във всяка оттях ще се съдържа информация и на български и на английски? Ако може дайте някакви насоки и препоръки как ще стане.

Много ще се радвам ако някой ми обясни по-подробно, тъй като нямам опит.

Благодаря за отделеното внимание! :)

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #3 -: 11 Юли 2012, 22:36:19 »
Ми пробвай и ще разбереш...

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #4 -: 11 Юли 2012, 22:45:48 »
Нямам опит с codeigniter, но при първи чек в google гледам, че се препоръчва ползването на тази библиотека -> http://maestric.com/doc/php/codeigniter_i18n
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #5 -: 11 Юли 2012, 23:03:09 »
@jazzman Това което си дал е обяснено в урока, тая библиотека се използва за функционалността да работят няколко езика към CI (поне така си спомням де).

Не мисля, че е нужно да правиш отделна таблица за езиците. Ако примерно трябва да използва 2-3 чужди езика, може да си направиш отделно поле за тях в базата данни, примерно структурата би била по този начин:
id   -   title_bg   -   title_en   -   title_nl
1   -   заглавие   -   title   -   titel

Мисля, че в урока е обяснено как става.

Ако вече става въпрос за нещо по-голямо с много повече езици, тогава може би трябва да обмислиш вариант с отделна таблица за текстовете, в която да записваш id на съдържанието и id на езика, или нещо от този сорт.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

jazzman

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 25
  • -Получени: 190
  • Публикации: 3624
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #6 -: 11 Юли 2012, 23:08:20 »
Шъ мъ извините. Виноват. Не знаех  :o
Java is to Javascript as fun is to funeral.

http://nau4i.me/forum/index.php/topic,15129.0.html

thestrong

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 7
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #7 -: 12 Юли 2012, 09:25:01 »
@jazzman Това което си дал е обяснено в урока, тая библиотека се използва за функционалността да работят няколко езика към CI (поне така си спомням де).

Не мисля, че е нужно да правиш отделна таблица за езиците. Ако примерно трябва да използва 2-3 чужди езика, може да си направиш отделно поле за тях в базата данни, примерно структурата би била по този начин:
id   -   title_bg   -   title_en   -   title_nl
1   -   заглавие   -   title   -   titel

Мисля, че в урока е обяснено как става.

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




ДОбре ако после като правя търсенето по заглавие трябва да търся и в двете колони на таблицата в моят случай ( а пък ако е с 5 -6 езика във всяка поле ли ще търся). Това ли е най-удачния вариант. Ако може дайте съвети.



Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #8 -: 12 Юли 2012, 10:07:37 »
Това вече зависи от твоите нужди и колко сложна искаш да си направиш търсачката. Ти така или иначе знаеш потребителя на какъв език е във всеки един момент, така че може да търсиш и само по определен език.
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

NoBBy

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 4
  • -Получени: 38
  • Публикации: 309
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #9 -: 12 Юли 2012, 15:13:42 »
интернационализация 101:

Код: MySQL
  1. mysql> select * from posts; --всякакви данни които не се нуждаят от i18n
  2. +----+-------+----------------+
  3. | id | views | comments_count |
  4. +----+-------+----------------+
  5. |  1 |    50 |             30 |
  6. |  2 |    20 |             10 |
  7. +----+-------+----------------+
  8.  
  9. mysql> select * from posts_ml;
  10. +----+----------+--------+--------------+
  11. | id | language | title  | content      |
  12. +----+----------+--------+--------------+
  13. |  1 | bg       | Пост 1 | Съдържание 1 |
  14. |  1 | en       | Post 1 | Content 1    |
  15. |  2 | bg       | Пост 2 | Съдържание2 |
  16. |  2 | en       | Post 2 | Content 2    |
  17. +----+----------+--------+--------------+
  18.  
  19.  
  20. mysql> SELECT * FROM `posts` AS `p`
  21.     -> INNER JOIN `posts_ml` AS `pml`
  22.     -> ON `p`.`id` = `pml`.`id`
  23.     -> WHERE `pml`.`language` = "bg";
  24. +----+-------+----------------+----+----------+--------+--------------+
  25. | id | views | comments_count | id | language | title  | content      |
  26. +----+-------+----------------+----+----------+--------+--------------+
  27. |  1 |    50 |             30 |  1 | bg       | Пост 1 | Съдържание 1 |
  28. |  2 |    20 |             10 |  2 | bg       | Пост 2 | Съсъдржание2 |
  29. +----+-------+----------------+----+----------+--------+--------------+
  30. 2 rows in set (0.00 sec)
  31.  

thestrong

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 7
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #10 -: 21 Юли 2012, 13:47:11 »

Има ли някакъв урок или друга информация за добавянето на многоезичност към даден сайт без използване на CodeIgniter и да не е с обектно-ориентиран PHP?  :(





HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #11 -: 21 Юли 2012, 14:13:08 »
Като гледам колегите са обяснили нещата. Не знам  защо бягаш от OOP?  Aко не го разбираш напълно може би е по-добре да седнеш да почетеш. Мога да ти предложа два варианта. Ако искаш по мързеливия начин може да си дръпнеш някакъв cms(Wordpress, Joomla, Маgento и други..), там може да използваш готови плъгини и ще се наложи само да го конфигурираш.  Другия начин е да прочетеш по детайлно поста на @Nobby  и по-точно за интернационализация-та. Това е най-лесния начин. Иначе има и други начини

thestrong

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 7
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #12 -: 21 Юли 2012, 16:21:08 »
Като гледам колегите са обяснили нещата. Не знам  защо бягаш от OOP?  Aко не го разбираш напълно може би е по-добре да седнеш да почетеш. Мога да ти предложа два варианта. Ако искаш по мързеливия начин може да си дръпнеш някакъв cms(Wordpress, Joomla, Маgento и други..), там може да използваш готови плъгини и ще се наложи само да го конфигурираш.  Другия начин е да прочетеш по детайлно поста на @Nobby  и по-точно за интернационализация-та. Това е най-лесния начин. Иначе има и други начини




ItemID   ItemType   price   size   description   IDL   LNG   CatID
1             Тениска                                            1       bg            1
2  (1)      t-shirt                                                2       en           (1)
3  (2)      sneakers                                          2       en              2


CatID   CatName   IDL   LNG
1           Дрехи         1          bg
2  (1)   Clothes         2         en
3  (2)   Обувки         1         bg

Ако в БД имам следните таблици с примерните данни вътре.
Когато искам да добавя нов артикул

INSERT INTO item VALUES ('1',' Тениска ', 22 ,64, дсдд,  'bg', '1');
INSERT INTO item VALUES ('1',' t-shirt ','22',64,dfdf', '1');

(1)   да е пак 1


Тениска и t-shirt са в една и съща категория ( на български и на англйски и става вапрос за едно и също нещо) , но тъй като ItemID , CatID са ми primary keys ( съответно са и autoincrement) не става да ги добавя с едно и също ID. И се чудя как да ги направя в БД ( съответно и primary key да се запази) да може и за двата езика  да се отнася ена и съща категория. Това много ме обърква и се чудя.


Също мислех и да е както в ItemID ( 1, 2, 3 да са си primary keys  и първо си въвеждама данните на БГ след това на ЕН и си ползвам съответните ID –та  и  да си е отделен скрипт за БГ и отделен за ЕН) И съответно да направя php скрипта на БГ и там да достъпвам само БГ въведените данни в БД и на EN да достъпвам въведените на англйски


Това много ме обърква  и се чудя как да го направя? (за това са малко объркващи и обясненията ми)   ???
Някакви препоръки, съвети и идеи. Благодаря! 


« Последна редакция: 21 Юли 2012, 16:25:47 от thestrong »

Stan

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 27
  • -Получени: 135
  • Публикации: 641
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #13 -: 21 Юли 2012, 22:02:19 »
Щом държиш id-тата и на двете таблици да са auto increment аз бих ти предложил следния вариянт:
Таблицата с артикулите(items):

ItemIDItemTypepricesizedescriptionLNGCatID
1Тениска20lvXLописаниеbg1
2t-shirt20lvXLdescriptionen1
3sneakers30lvLdescriptionen2

Таблицата с категориите(categories):

CatIDCatName_enCatName_bg
1ClothesДрехи
2ShoesОбувки

Вече имаме всичко необходимо да направим следната заявка:

Код: PHP
  1. //примерно ако взимаш езика и id-то на категорията чрез гет параметър
  2. $cat_id = (int)$_GET['category'];
  3. $lang = $_GET['lang'] == 'en' ? 'en' : 'bg';
  4.  
  5. $query = 'SELECT `t1`.`ItemType` , `t1`.`price` , `t1`.`size` , `t1`.`description` , `t2`.`CatName_'.$lang.'` AS `CatName`
  6.          FROM `items` AS `t1` , `categories` AS `t2`
  7.          WHERE `t2`.`CatID` = '.$cat_id.'
  8.          AND `t1`.`CatID` = `t2`.`CatID`
  9.          AND `t1`.`LNG` = '.$lang;
  10.            
  11. $resource = mysql_query($query);

Така в зависимост от съответния език ще вадиш написани на него артикулите и категорията им.

Edit: Бях забравил условието за избиране на дадена категория.
« Последна редакция: 21 Юли 2012, 22:22:19 от Stan »

NoBBy

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 4
  • -Получени: 38
  • Публикации: 309
Re: Многоезичен сайт - CodeIgniter 2.0
« Отговор #14 -: 23 Юли 2012, 13:03:12 »
Айде малко пояснения че от мързел предния път не написах и явно има проблеми.

За всяка таблица която има данни които ще се интернационализират (i18n) ще си правим по една друга таблица, която ще съдържа САМО данните, имащи нужда от интернационализация. Ще използваме същото име със суфикс ml (multilanguage) но всякакво име върши работа.

Започваме със структурата на таблицата за категориите:

Код: MySQL
  1. mysql> DESCRIBE categories;
  2. +-------+---------+------+-----+---------+----------------+
  3. | Field | Type    | Null | Key | Default | Extra          |
  4. +-------+---------+------+-----+---------+----------------+
  5. | catId | int(11) | NO   | PRI | NULL    | auto_increment |
  6. +-------+---------+------+-----+---------+----------------+
  7. 1 row in set (0.04 sec)

И съдържанието:
Код: MySQL
  1. mysql> SELECT * FROM categories;
  2. +-------+
  3. | catId |
  4. +-------+
  5. |     1 |
  6. |     2 |
  7. +-------+
  8. 2 rows in set (0.00 sec)

В таблицата имаме само ай-дита на категориите - униклани и аутоинкреметн. По принцип е тъпо това и можем да пропуснем таблицата, но в повечето случаи ще имаш някаква мета информация, като дали е изтрита или невидима категорията, "майчини" категории ако имаш йерархична структура, поредност (ако няма да ползваш азбучен ред) и др.

Записите в таблицата ще са уникални, но за всяка категория тук ще имаш n на брой редове в таблицата categories_ml, като n е броят езици, който поддържаш.
Ето и структурата и данните в categories_ml:
Код: MySQL
  1. mysql> DESCRIBE categories_ml;
  2. +---------+-------------+------+-----+---------+-------+
  3. | Field   | Type        | Null | Key | Default | Extra |
  4. +---------+-------------+------+-----+---------+-------+
  5. | catId   | int(11)     | NO   | MUL | NULL    |       |
  6. | catName | varchar(64) | NO   |     | NULL    |       |
  7. | lng     | varchar(8)  | NO   |     | NULL    |       |
  8. +---------+-------------+------+-----+---------+-------+
  9. 3 rows in set (0.01 sec)

Тук вече имаме айди-то на категорията, езика и самото наименование на съответният език. полето catId тук не е аутоинкремент или уникален ключ...само външен.
Уникалност на реда се указва едновременно от полето catId и lng.

Съдържанието на таблицата:
Код: MySQL
  1. mysql> SELECT * FROM categories_ml;
  2. +-------+---------+-----+
  3. | catId | catName | lng |
  4. +-------+---------+-----+
  5. |     1 | Дрехи   | bg  |
  6. |     2 | Обувки  | bg  |
  7. |     1 | Clothes | en  |
  8. |     2 | Shoes   | en  |
  9. +-------+---------+-----+
  10. 4 rows in set (0.00 sec)

Както се вижда за всеки език и категория имаме по 1 запис.

Правим абсолютно същото за items/items_ml:

items структура:
Код: MySQL
  1. mysql> DESCRIBE `items`;
  2. +--------+---------+------+-----+---------+----------------+
  3. | Field  | Type    | Null | Key | Default | Extra          |
  4. +--------+---------+------+-----+---------+----------------+
  5. | itemId | int(11) | NO   | PRI | NULL    | auto_increment |
  6. | price  | double  | NO   |     | NULL    |                |
  7. | size   | int(11) | NO   |     | NULL    |                |
  8. | catId  | int(11) | NO   | MUL | NULL    |                |
  9. +--------+---------+------+-----+---------+----------------+
  10. 4 rows in set (0.01 sec)

items съдържание:
Код: MySQL
  1. mysql> SELECT * FROM `items`;
  2. +--------+-------+------+-------+
  3. | itemId | price | size | catId |
  4. +--------+-------+------+-------+
  5. |      1 |    25 |    1 |     1 |
  6. |      2 |    50 |   42 |     2 |
  7. +--------+-------+------+-------+
  8. 2 rows in set (0.00 sec)

items_ml структура:
Код: MySQL
  1. mysql> DESCRIBE items_ml;
  2. +-------------+--------------+------+-----+---------+-------+
  3. | Field       | Type         | Null | Key | Default | Extra |
  4. +-------------+--------------+------+-----+---------+-------+
  5. | itemId      | int(11)      | NO   | MUL | NULL    |       |
  6. | itemType    | varchar(64)  | NO   |     | NULL    |       |
  7. | description | varchar(512) | NO   |     | NULL    |       |
  8. | lng         | varchar(8)   | NO   |     | NULL    |       |
  9. +-------------+--------------+------+-----+---------+-------+
  10. 4 rows in set (0.01 sec)

items_ml съдържание:
Код: MySQL
  1. mysql> SELECT * FROM items_ml;
  2. +--------+-----------+-------------------------------+-----+
  3. | itemId | itemType  | description                   | lng |
  4. +--------+-----------+-------------------------------+-----+
  5. |      1 | тениска   | описание на тениската на бг   | bg  |
  6. |      1 | t-shirt   | t-shirt description in en     | en  |
  7. |      2 | маратонки | описание на маратонките на бг | bg  |
  8. |      2 | sneakers  | sneakers description in en    | en  |
  9. +--------+-----------+-------------------------------+-----+
  10. 4 rows in set (0.00 sec)

Важи същото, което писах за категориите. Данните, които няма да се интернационализират в items, останалите в items_ml със съответното айди (не е аутоинкремент) и език.

---------------------------------------------------------------------------------------------------

Със структурата по-горе няма да имаш проблем със добавянето на категории и продукти. Просто първо добавяш информацията във основната таблица (items, categories) и после взимаш полученото след инсърта id и го ползваш за да вкараш данните за интернационализация на съответните езици.

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

Код: MySQL
  1. mysql> SELECT  `cat`.`catId` ,  `cml`.`catName` ,  `items`.`itemId` ,  `iml`.`itemType` ,  `items`.`size` ,  `items`.`price` ,  `iml`.`description`
  2.     -> FROM  `items`
  3.     -> INNER JOIN  `categories` AS  `cat` ON  `items`.`catId` =  `cat`.`catId`
  4.     -> INNER JOIN  `items_ml` AS  `iml` ON  `items`.`itemId` =  `iml`.`itemId`
  5.     -> INNER JOIN  `categories_ml` AS  `cml` ON  `cat`.`catId` =  `cml`.`catId`
  6.         -> AND  `iml`.`lng` =  `cml`.`lng`
  7.     -> WHERE  `iml`.`lng` =  "en";
  8. +-------+---------+--------+----------+------+-------+----------------------------+
  9. | catId | catName | itemId | itemType | size | price | description                |
  10. +-------+---------+--------+----------+------+-------+----------------------------+
  11. |     1 | Clothes |      1 | t-shirt  |    1 |    25 | t-shirt description in en  |
  12. |     2 | Shoes   |      2 | sneakers |   42 |    50 | sneakers description in en |
  13. +-------+---------+--------+----------+------+-------+----------------------------+
  14. 2 rows in set (0.00 sec)

С обикновена смяна в where клаузата на "bg" ще изкараш същата информация на български.

--------------------------------------------------------------------------------------------------------------
Варианта, който Stan ти е дал също става, но ако решиш да добавяш нов език ще трябва да правиш ALTER на таблицата за категориите, което като цяло не е много добра идея