про файл ресурсов и мультиязычность программ

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Valery_II
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.07.2004 (Пн) 6:41

про файл ресурсов и мультиязычность программ

Сообщение Valery_II » 19.07.2004 (Пн) 7:27

Задача: сделать интерфейс на нескольких языках.

Мое решение: все подписи и тексты в файр ресурсов. Сначала язык1, затем последовательно язык2 и т.д. в одном столбце При смене языка задаю смещение. Все работает, но!

Недостатки: приложение большое и при создании файла ресурсов возможно что-нибудь пропустить, если все в одном столбце последовательно. Особенно морочно при наличии более 2 языков или при добавлении нового.

ВОПРОС: В ресурсах можно сделать несколько столбцов. Соответственно язык переключать сменой столбца, а не задачей смещения вниз по одному. Это гораздо удобнее, т.к. сразу видно, не пропустил ли при переводе какой элемент. Но не знаю как снять значение с добавленных столбцов. Как обратиться в файле ресурсов к следующему столбцу?

заранее спасибо

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.07.2004 (Пн) 9:22

Такой подход (хранить локализацию в файле ресурсов) удобен для небольших проектов. Более гибким является хранить тексты в lng-файлах. Т.е. в проекте используется локаль по умолчанию (english). При загрузке программы определяется выбранный язык (русский) и считывается файл russian.lng. Если какого-то строкового ресурса нет, то текст просто не заменяется (остается на изначальном языке).
Сама структура lng-файлов на твой выбор, может быть бинарник, но проще всего использовать текстовый формат, со структурой ini-файлов.
Lasciate ogni speranza, voi ch'entrate.

Valery_II
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.07.2004 (Пн) 6:41

Сообщение Valery_II » 19.07.2004 (Пн) 11:12

В принципе, я не замахиваюсь создать новую Винду или что-то такое же грандиозное. Пару сотен пунктов можно и в ресурсах.
Просто, во-первых, описанная мной в вопросе возможность имеется, а я не знаю как её использовать, во-вторых, редактировать ресурс удобнее если иметь две колонки, а не ловить соответствие ниже по колонке. Что чревато как раз ошибками, тратой времени на выявление и исправления.
Спасибо за комментарий, но если знаешь ответ на мой вопрос, то буду счастлив выслушать.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.07.2004 (Пн) 12:36

В таком случае используй API. Детали здесь, а вкратце: тебе нужно использовать функцию GetStringType(Ex). Первым аргументом идет локаль, которую нужно загрузить.
Lasciate ogni speranza, voi ch'entrate.

Valery_II
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.07.2004 (Пн) 6:41

Сообщение Valery_II » 19.07.2004 (Пн) 13:54

Гм... Странно что в VB введена спрашиваемая мной возможность, а чтобы ей воспользоваться надо обращаться к API!
Я надеялся что имеется что-то кроме
LoadResString(), LoadResData() и LoadResPicture()

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.07.2004 (Пн) 15:16

LoadResString загружает стринг именно в той локали, в которой запущена (или компилировалась) программа. Это просто сделано для "удобства" пользователей, чтобы им не пришлось указывать лишние аргументы :) Если тебе такие удобства не нужны, делаешь ручками.
Lasciate ogni speranza, voi ch'entrate.

Valery_II
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.07.2004 (Пн) 6:41

Сообщение Valery_II » 20.07.2004 (Вт) 8:07

Ну, ручками так ручками. А поконкретнее?

"Ручками" - это "не связываешься с файлом ресурсов и просто в каждом контроле прописываешь названия"?
Или "ручками" - это какой-то способ все же, пусть и коряво, обратиться ко второму и т.д. столбцу?

А то либо я такой тупой либо ты недомолвками объясняешь. Можно пример кода? Так, для конкретизации дискуссии. Для этого же я цитирую предмет обсуждения из первого своего сообщения:
"...Как обратиться в файле ресурсов к следующему столбцу?..."

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 20.07.2004 (Вт) 9:56

Я поискал в библиотеке MSDN. Действительно можно создать многотабличный файл ресурсов. Но там нет ниодного намека для доступа к ней стандартными средствами. :shock:
После создания второго столбца появляется еще одна строка. Даже незнаю, что советовать. Надо экспериментировать. Позже поищу посерьезней...

Keen
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 25.04.2004 (Вс) 10:45
Откуда: Россия => Москва

Сообщение Keen » 20.07.2004 (Вт) 10:26

В файле ресурсов можно для стороковых данных создавать несколько столбцов. Там ведь не даром рядом с Id есть вкладка с языками :). Мне кажется (но я не уверен), что просто надо создать несколько таких столбцов с разными языками и все - программа сама все определит в зависимости от языка ОС. (Коряво как-то получилось)

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 20.07.2004 (Вт) 10:29

Я тоже так думал, но пока эксперимент утверждает обратное...

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 20.07.2004 (Вт) 11:02

Вот результаты поиска:

The resource file can contain more than one string table for use with different languages. When it runs, the application automatically selects the right table based on the system's LCID. If the LCID doesn't match a table, the application uses the first table.

Это означает, что программа автоматом распознает язык. А чтоб это проверить, тебе понадобятся ОС с соответствующей локалью.
Посмотри пример:
Вложения
intl2.zip
Пример использования многотабличного файла.
(5.59 Кб) Скачиваний: 44

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 20.07.2004 (Вт) 11:09

Но я тебе советую прислушаться Alibek по поводу lng-файлов.
Рес-файл ты компилируешь с ехе, при добавлении следующего языка тебе надо заново компилировать свою программу. Это и есть потеря гибкости.
В случае lng-файла, ты просто создаешь новый не меняя свою проект. :)

Valery_II
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.07.2004 (Пн) 6:41

Сообщение Valery_II » 20.07.2004 (Вт) 11:54

Никакой траблы не вижу при добавлении нового языка. Судите сами:

Допущение - создаем прогу с несколькими языками интерфейса, которые можно менять в процессе выполнения, а не инсталяции (в этом случае легче просто подменять файлы ресурсов при установке локализованой версии).

1. Как в случае одного столбца и смещения, так и в случае нескольких столбцов в ресурсе, проект исправляется и компилируется примерно одинаково - в диалоге добавляется язык и подправляется код.
2. В случае большого проекта в обоих случаях перекомпилируется только модуль с глобальными данными и процедурами. Тоже разница минимальна.
3. Единственная разница - в момент исправления файла ресурсов гораздо удобнее работать с двумерной таблицей чем с одномерной.

Попробую проверить гипотезу о автовыборе на разных версиях ОС.

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 20.07.2004 (Вт) 12:09

Интересно, как проверять собираешься. :?: :)
Будешь ставить ОС к примеру французский, немецский или испанский??? :shock:
Я ничего ни имею против компиляции.
Представь ситуацию. У тебя готовая программа. Люди пользуются ею давно. В случае с lng-файлом они просто качают новый файл языковой поддержки (естественно кому нужно). А в твоем случае - целиком твою программу заново. Вот и вся разница! :)
Решать только тебе: будут ли качать юзеры многометровые файлы или плюнут на это.......

Valery_II
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 19.07.2004 (Пн) 6:41

Сообщение Valery_II » 20.07.2004 (Вт) 12:51

Бог миловал удаленно ставить проги. :D
если я такое тут отшебучу, непоймутсс, Азияс. Тут все должно быть солидно: вызвали, поставили, умно поглазели в экран, значительно покивали головами и т.д. Ааа! и главное, соответственно этому шоу оплатили :wink:

А для проверки достаточно рус и англ версии. Если при запуске само вкрячит нужный язык, то хорошо. Вот только проблема с принудительным переключением. Оттого вопрос и возник.

Я конечно и методом смещения все сделаю. Только мню кажется в двумерной таблице и работа приятнее и элегантнее выглядит. Можешь считать это нездоровой любознательностью.


ЛЮДИИИИИИ!!! как этой хренью пользоваться?!!! :D

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 20.07.2004 (Вт) 13:07

Ну флаг тебе в руки. :)
Я больше, чем Microsoft советовать не могу! :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: PetalBot и гости: 12

    TopList