LINUX.ORG.RU

И еще бы хотелось чтобы переключатся между языками можно было в любой момент а не только на стартовой страничке.

Без скриптов это реализуется?

А без БД?

я владею и тем и другим но не хочется оверхеда и лишних дыр.

cvv ★★★★★
() автор топика

Переключение языка на веб-страницах я делал посредством апача (index.html.ru, index.html.en). А вот для CGI сделал костыль. В самом CGI использую макросы, например:

printf("<a href=\"%s?Save=1&Tstart=%d&Tend=%d\"'>%s</a>\n", SCRIPT_PATH, t_start, t_end, _L(_s_Save_file_));
Языковые макросы определены в отдельном заголовочном файле:
#define         _LANG(_var, _ru, _en)   char _var##ru[] = _ru;\
                                        char _var##en[] = _en;\
                                        char *_var[2] = {_var##ru,  _var##en};
#define         _L(x)   (x[Lang])

_LANG(_s_Save_file_, "Сохранить файл", "Save file");
Переменная Lang определяется из запроса:
ptr = getenv("HTTP_ACCEPT_LANGUAGE");
if(ptr) if(strncmp(ptr, "ru", 2) == 0) Lang = 0;
И все это дело нормально работает :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

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

В пыхпыхе, насколько я помню, тоже заполняются переменные, соответствующие разным фразам, а исходя из HTTP_ACCEPT_LANGUAGE выбирается нужный номер в массиве (или же переменные инициализируются из нужного пыхпых-файла).

Eddy_Em ☆☆☆☆☆
()

Хранить выбранный пользователем язык в сессии или в куках. Цыферкой, строкой - пофиг.

Иметь функцию, условно, типа:

/**
Get resource by its name, language and optional target encoding

String resource_name - unified resource name
String localiztion - locale in standard notation
opt String encoding - output encoding, default to UTF-8

return String - desired resource
*/

String get_localized_resource(String resource_name,String  localization,[String encoding])

/**
Get user setting from the main registry

String setting_name - name of the desired setting
Source - SETTING_SOURCE_SESSION or SETTING_SOURCE_COOKIE @see spec 1.2

return String - value of the desired setting
*/

String get_user_setting(String setting_name, SettingSource source)

/**
Shortcut for superset of get_localized_resource and get_user_setting with default params for using on the web pages via echo

String resource_name - name of the resource

return String - value of resource, should be echoed
*/

String get_resource(String resource_name){
    return get_localized_resource(resource_name,get_user_setting("ru.example.www.global.locale"),WebLocales.getDefault())
}

(туда добавить экранирование, обработку хаков, продумать структуру реестра вместо пошлого «ru.example.www.global.locale», итп)

и потом юзать (да простит меня Господь за сами знаете что)

<body>
<p><? echo(get_localized_resource("ru.example.www.homepage.greeting")</p>
</body>
stevejobs ★★★★☆
()
Ответ на: комментарий от Eddy_Em

> Если ваш html генерируется динамически, то даже не придется заморачиваться с двумя копиями одного и того же документа.

В том то все и дело что не хочется связыватся с динамикой при статическом контенте ради переключения языков.

В пыхпыхе

Я не ССЗБ. php там будет только через мой труп.

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

В том то все и дело что не хочется связыватся с динамикой при статическом контенте ради переключения языков.

сделай статические страницы в виде шаблонов (на Java есть например Velocity, а на питоне - Cheetah), и потом рендерь в статику.

Способ тот же самый, что и впосте выше, только использование другое:

String resource_name = ru-example-www-mainpage-greeting
context.put(resource_name, get_localized_resource(resource_name));
Template t = ve.getTemplate( "mainpage.vm" );
StringWriter writer = new StringWriter();
t.merge( context, writer );

и дальше делаешь со врайтером чо хочешь. Наприер, String reneredPage = writer.toString();

вот тут дока на Велосити: http://velocity.apache.org/engine/devel/developer-guide.html на Читу сам найдешь )

stevejobs ★★★★☆
()
Ответ на: комментарий от cvv

не хочется связыватся с динамикой при статическом контенте ради переключения языков.

Тогда переводите статику и делайте index.html.ru, index.html.en ...

Правда, в этом случае легче «забыть» перевести какой-нибудь файл при изменении содержания.

Я не ССЗБ. php там будет только через мой труп.

Я тоже пыхпых не люблю :)

Eddy_Em ☆☆☆☆☆
()

как лучше организовать один и тот же контент на разных языках?

не хочется иметь просто три независимые копии

структура каталогов:

/css
/images
/js
/ru
/ru/.htaccess
/ru/index.html
/en
/en/index.html
/en/.htaccess
/.htaccess

.htaccess в /

RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING} lang=(en|ru)
RewriteRule .* $0? [CO=lang:%1:%{HTTP_HOST},R,L]

RewriteCond %{HTTP_COOKIE} lang=(en|ru)
RewriteRule .* %1/$0 [L]

RewriteCond %{HTTP:Accept-Language} ^(en|ru).*$
RewriteRule .* %1/$0 [L]

RewriteRule .* fr/$0 [L]

ExpiresActive On
ExpiresDefault "access plus 0 seconds"

.htaccess в /ru/, /en/:

RewriteEngine Off

Сссылки для переключения языка будут такие:

<a href="?lang=en" rel="nofollow">English</а>
<a href="?lang=ru" rel="nofollow">Русский</а>

Если не охота дублировать код, можно использовать SSI, но при описанном способе это неудобно - страница разобьётся не десятки кусков. Я бы не стал заморачиваться или использовал бы уже динамику.

Reaper ★★
()
Ответ на: комментарий от Reaper

Благодарю. я уже пошел в направлении SSI

cvv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.