Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Локализация ресурсов 
:(
    Опции темы
iiizxc
  Дата 5.3.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2008

Репутация: нет
Всего: нет



Имеется проект, его ресурсник представляет из себя 2 секции - для русской и английской локализации.
Код

#define APSTUDIO_READONLY_SYMBOLS
#include "atlres.h"
#undef APSTUDIO_READONLY_SYMBOLS

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif

...

#endif

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
#pragma code_page(1252)
#endif

...

#endif 


Секция английских ресурсов является небольшим фрагментом секции русской (проверяю корректность работы).
В свойствах проекта resources->general->culture стоит Russian (0x419).
Что получается в собранном приложении: те элементы ресурсов, которые определены в английской секции, берутся оттуда. Остальные - из русской. В ОС локаль поставлена russian/russian. При изменении culture в свойствах проекта на English (United States) (0x409) (да и вообще на что угодно) - результат такой же.

Где я натупил, почему результат не соответствует очевидному ожидаемому?
PM MAIL   Вверх
Earnest
Дата 5.3.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



А вот, из MSDN:
Цитата

The FindResource function determines the location of a resource with the specified type and name in the specified module. 
To specify a language, use the FindResourceEx function.

Ничего не написано, как FindResource учитывает язык. Скорее всего, никак. Т.е. находит первый попавшийся.
А MFC ищет все ресурсы именно с помощью FindResource.
Поэтому:
никто не делает в одном модуле разноязычных ресурсов (для поддержки локализации). Ибо сильно геморройно все делать ручками через FindResourceEx, в то время как в MFC реализован сквозной поиск по всем модулям. Но вот язык не учитывается. Видимо, по историческим причинам.
Поэтому ресурсы разделяют по разным модулям. И подгружают тот, который соответствует языку. Это один из возможных способов, есть и другие.
Тема неоднократно обсуждалась, поройся.


--------------------
...
PM   Вверх
Bukmop
Дата 5.3.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.6.2006
Где: Москва

Репутация: 2
Всего: 3



iiizxc, из своего опыта могу сказать, что приложение выбирает ресурсы,  которые соответствуют локалицации установленной ОС в которой оно выполняется.
PM MAIL   Вверх
Dem_max
Дата 6.3.2009, 10:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
iiizxc
Дата 6.3.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2008

Репутация: нет
Всего: нет



Earnest, вся досада в том, что не я разрабатывал приложение. Оно уже есть, хренова туча кода, где на каждом шагу используются диалоги и строчки из ресурсов через ATL обертку. И вот тут ВНЕЗАПНО оказалось очень нужно сделать поддержку в приложении английского языка. И это уже моя работа. При этом, естественно, архитектуру менять нельзя, и вообще лучшше код как можно меньше изменять.
PM MAIL   Вверх
Earnest
Дата 6.3.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Да, это проблема... локализацию хорошо бы закладывать в проект.
Тогда остается путь такой: 1) выделить все ресурсы в отдельную DLL 2) сделать копию и перевести 3) подгружать на старте в зависимости от языка и устанавливать как можуль ресурсов вызовом AfxSetResourceHandle. Тогда все ресурсы сначала будут искаться в этой DLL, а потом уже в остальных. При этом насчет картинок и прочих непереводимых ресурсов можно не парится и оставить где есть; только строки, диалоги, меню.

Добавлено через 3 минуты и 59 секунд
Вариация, чтобы меньше париться:
1) оставляем все как есть, но для локализованных ресурсов создаем отдельную DLL и КОПИРУЕМ туда диалоги, меню, строки
2) На старте либо загружаем нашу локализованную DLL и вызываем  AfxSetResourceHandle? либо нет - в зависимости от языка.


--------------------
...
PM   Вверх
iiizxc
Дата 6.3.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2008

Репутация: нет
Всего: нет



Earnest, проблема #2: в ресурсах лежат не только диалоги/строчки, но и много другой чертовщины, которая тоже используется часто. Так, прийдется все это тоже пихать в локализационную DLL.
Да, дизайн проекта - <очень плохой>.
PM MAIL   Вверх
Earnest
Дата 6.3.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



А что еще, кроме диалогов\меню\строк нуждается в переводе? Впрочем, бывают локале-зависимые картинки, а также ресурсы собственных форматов. Все это соверщенно непринципиально, поскольку подход один. И выполняться может поэтапно (по одноц штуке диалога за раз), т.к. недостающий ресурс будет найден в родном модуле.
"Зато" почти ничего не надо программировать. В кавычках, т.к. работа несложная, но долгая и нудная, полное счастье для программиста  smile Может, сумеешь объяснить начальству (после пары первых проб), что с этой работой вполне справится чайник Вася, немного обученный? А то ведь помрешь с тоски...


--------------------
...
PM   Вверх
iiizxc
Дата 6.3.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.11.2008

Репутация: нет
Всего: нет



ATL по части ресурсов веселая штука. Где-то ресурсы берутся из инстанса _AtlBaseModule.GetResourceInstance(), где-то юзается APIшный LoadResource( UINT ). Прекрасно.
PM MAIL   Вверх
jonie
Дата 10.3.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118




у меня както была такая засада.. тока на VB6... открываю формочку в дизайнере - а там тока таймер и посередине ничего не значащий прогресс бар. Смотрю на работу этой же формы - гриды, куча кнопок и activex объектов на С++ писанных, дофига фильтров, куча текстовых данных с БД и системы оповещения осообщениях сыпется...и все "шевелится" в "почти реалтайме"... эта был кошмар. 


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0490 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.