Локализация сайтов - выбор лучшего варианта
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Локализация сайтов - выбор лучшего варианта Expand / Collapse
Автор
Сообщение
23.08.2006 11:09


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863

Приветствую.

На данный момент есть достаточно большая база, являющаяся хранилищем данных для сайтов. И есть один .aspx файл, генерирующий эти сайты. Основные составляющие базы - таблицы доменов, страниц, товаров, свойств товаров, картинок.

Задача - локализация сайтов, т.е. надо сделать возможность создавать сайты на разных языках.

Мы пока придумали три способа:

1) Из каждой таблички, требующей локализации вынести локализуемые данные в отдельную табличку с LanguageID. Т.е. если есть таблица Pages (ID, Alias, Title, Body) и Products (ID, Code, Name, Description), то вместо этого сделать так: Pages(ID, Alias) -> PagesLoc(PageID, LangID, Title, Body) и Products (ID, Code) -> ProductsLoc(ProductID, LangID, Name, Description). Этот вариант делать не стал, т.к. не хочется сильно плодить таблички.

2) Сделать одну таблицу - словарик и ссылаться на нее из всех других таблиц. Т.е. Вместо Pages (ID, Alias, Title, Body) будет Pages (ID, Alias, TitleID, BodyID) и словарик Words(ID, LangID, Word varchar(max)) - т.е. ключ будет по первым двум полям. Способ неплохой, но тоже недопустимы. К примеру, чтобы локализовать одну таблицу с 4 полями, придется писать такой запрос:

DECLARE @LangID int

SET @LangID=1

select p.id, t1.word title, t2.word Keywords, t3.word Body, t4.word txt

from _tezdPage p

inner join _tezd t1 on t1.ID=p.TitleID and t1.LangID=@LangID

inner join _tezd t2 on t2.ID=p.KeywordsID and t2.LangID=@LangID

inner join _tezd t3 on t3.ID=p.BodyID and t3.LangID=@LangID

inner join _tezd t4 on t4.ID=p.TextID and t4.LangID=@LangID

Что на мой взгляд достаточно криво и неудобно.

3) Самый продвинутый, как мы решили, вариант. Текущие Title, Body и т .д. заменить с варчара на тип XML. В нем хранить нужное количество языков и вытаскивать нужный. Все бы легко и просто, да вот только проблема появилась. Не можем выдернуть данные. Вот пример:

DECLARE @x XML, @Lang varchar(100)

SET @Lang='rus'

SET @X='

<rus aaa="d">абв</rus>

<eng>abc</eng>

<ukr>a12</ukr>'

SELECT cold.value('(/rus/@aaa)[1]', 'varchar') as result

FROM @x.nodes('/') as Tbl1(cold)

Вот так работает на ура. Если же заменить '(/rus/@aaa)[1]' на '(' + @Lang + '/@aaa)[1]', т.е. так:

SELECT cold.value('(/' + @Lang + '/@aaa)[1]', 'varchar') as result

FROM @x.nodes('/') as Tbl1(cold)

то появляется ошибка: The argument 1 of the xml data type method "value" must be a string literal.

Ответ на это есть вот здесь, но динамический SQL нам точно не подходит. http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=438887&SiteID=1.

3б) Вместо стандартных XML функций использовать написать свою.

Так вот вопрос.

1) Есть ли возможность как-то это обойти? Первый вариант ответа я толком не понял.

2) Странно, почему это не предусмотрели. Может, мы в корне делаем неверно?

Если требуется еще кака-либо информация – пишите.

PS: Простите, что сообщение не отформатированр. Форум теги убивает :((

Сообщ. #903172
23.08.2006 12:01
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 04.08.2008 12:56
Сообщ.: 118, Visits: 1 576
Есть такой вариант на каждый язык сделать сделать таблицу Lang1(ID, Text), Lang2(ID, Text) и т.д. и таблицу Langs(ID, Tables)

где если LangN.ID =LangM.ID, то LangN.Text аутентичен LangM.Text

Сообщ. #903180
23.08.2006 12:09
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 04.08.2008 12:56
Сообщ.: 118, Visits: 1 576
Соответственно каждая "заинтересованная" таблица будет хранить вместо текста его идентификатор, а язык будет выбираться только при отображении.
Сообщ. #903183
23.08.2006 12:27


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863
Не понял логики...

Как выборка будет происходить? Приведите, пожалуйста, пример запроса.

Сообщ. #903187
23.08.2006 13:10
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 04.08.2008 12:56
Сообщ.: 118, Visits: 1 576
Может я что не правильно понял но идея такова: Lang1, Lang2 и т.д. это словари для каждой локализации в которых хранятся все элементы страницы (title, body, keywords и т.д.) вперемешку, где идентификатор для каждого текстового элемента на разных языках одинаков т.о. в динамически формируемом запросе будет фигурировать таблица того языка который нужен.
Сообщ. #903191
23.08.2006 13:57


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863
Ну это и есть мой второй вариант.

Только мой вариант не требует использования динамического SQL.

Сообщ. #903205
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 6:13