powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / двухязычный интерфейс
12 сообщений из 12, страница 1 из 1
двухязычный интерфейс
    #33581530
fyodma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
опыта никакого, задача интереснаят, но базируется на multi-language интерфейсе
думаю создать словарь с captions объектов на формах, который будет пополнять автоматом, а юзера будут туда вводить свои перевоты терминов.
Но для этого надо элементарно суметь в Init (наверно) формы перебирать все объекты на форме -а я чо-то позабыл как это сделать
что-то типа
for each objest in thisform... - не проходит, ессно

Помогите, а?
Заранее спасибо!
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33581672
kdanylo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Пишем функцию GetCaption принимающую два параметра: имя контрола и идентификатор языка и возвращающую Caption:
Код: plaintext
1.
2.
3.
4.
5.
function GetCaption (tcName, tcLangId)
*--тут смотрим в табличку

return lcCaption
endfunc

В методе Init формы пишем:
Код: plaintext
1.
SetCaption (thisform)

Эта рекурсивная функция присваивает нужные надписи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
FUNCTION SetCaption (toContainer)
LOCAL lni
FOR lni = 1  TO toContainer.ControlCount
IF PEMSTATUS(toContainer.Controls[lni], 'Caption', 5 )
toContainer.Controls[lni].Caption = GetCaption(toContainer.Controls[lni].Name, goApp.LangId)
ENDIF
IF PEMSTATUS(toContainer.Controls[lni], 'Controls', 5 ) && контейнер
SetCaption (toContainer.Controls[lni])
ENDIF
ENDFOR


goApp - объект приложения;
LangId - свойство приложения - идентификатор языка приложения (напрмер: "ua")
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33582654
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi kdanylo!

У многих объектов-контейнеров нету свойства ControlCount и коллекции
Controls. А вот коллекция Objects есть у всех контейнеров (появилось это
начиная с VFP5 или 6).
Кроме того вполне можно использовать и более простые, неитеративные схемы -
например запрашивать Caption из Init контрола (естественно прописав это в
своём классе - т.е. один раз, а не на каждом объекте). Если же нужно
обеспечить "динамику" - то можно использовать метод SetAll, и своё свойство
с Assign методом.
Кстати обычно при "переводах" возникает сложная проблема подгонки размеров
контролов - редко когда надписи на разных языках занимают одинаковое место
на экране...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33585259
Фотография Vladimir M Sklyar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто гдже хранит собственно эти надписи на разных языках ??
В отдельно отведенной таблице или непосредсвенно в неком методе (типа Init) тупо: this.Caption = IIF(LnId, "русский", "не русский")

Меня вот тут еще один вопрос мучает: если интерфейс программы можно сделать мультиязычным, то как быть с самими данными в таблицах (рабочие данные) ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33585358
kdanylo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему зависит от кодовой страницы. Английский, украинский и русский спокойно можно хранить в одной табличке CP=1251
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33585941
Strong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо мультиязычный интерфейс, надо проектировать следующим образом.
Создавать файл языка(неважно в каком формате дбф или текстовый )
Все надписи делать присваивая значения переменных хранящихся в языковом файле.
И сделать настройку, позволяющую выбрать языковой файл.
Имхо 1 файл - 1 язык.
При старте проги файлик лучше всего выгружать в массив.
искать в массиве это намного быстрее.
Например процедурка LangUse() без параметров выгружает файл языка в массив.
А с параметрами ищет например
Код: plaintext
thisform.caption=LangUse("mainformCaption")



______________________________________
Strong
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33587947
kdanylo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Hi kdanylo!

У многих объектов-контейнеров нету свойства ControlCount и коллекции
Controls. А вот коллекция Objects есть у всех контейнеров (появилось это
начиная с VFP5 или 6).


Согласен полностью. Заменяем функцию SetCaption новой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
FUNCTION SetCaption (toContainer)
LOCAL lni
IF PEMSTATUS(toContainer, 'Caption',  5 )
toContainer.Caption = GetCaption(toContainer.Name, goApp.LangId)
ENDIF

FOR lni = 1  TO toContainer.Objects.Count
IF PEMSTATUS(toContainer.Objects[lni], 'Caption', 5 )
toContainer.Objects[lni].Caption = GetCaption(toContainer.Objects[lni].Name, goApp.LangId)
ENDIF
IF PEMSTATUS(toContainer.Objects[lni], 'Objects', 5 ) && контейнер
SetCaption (toContainer.Objects[lni])
ENDIF
ENDFOR

Igor Korolyov
Кроме того вполне можно использовать и более простые, неитеративные схемы -
например запрашивать Caption из Init контрола (естественно прописав это в
своём классе - т.е. один раз, а не на каждом объекте). Если же нужно
обеспечить "динамику" - то можно использовать метод SetAll, и своё свойство
с Assign методом.


Эта функция универсальна.
В придачу - одна точка входа для всей формы. Не задевает существующей или будущей функциональности интерфейса. А использование субкласированных контролов совсем не проще, так как требует много времени на анализ и выбор правильной иерархии.
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33591987
fyodma
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо, буду думать, еще и свои мыслишки появились.
Но вот при наличии словаря(где ключевое поле - имя формы + имя контрола на этой форме) заменить captions на текущей форме не кажется сложным, то как быть с меню (главное горизонтальное с выпадающими popup-ами)???? Ума не приложу, прям хоть программируй меню программно, что ли? Можно ли подобраться к нему как к составному объекту?
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33594712
kdanylo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fyodmaTo как быть с меню (главное горизонтальное с выпадающими popup-ами)???? Ума не приложу, прям хоть программируй меню программно, что ли? Можно ли подобраться к нему как к составному объекту?

Работать с меню как объектом нельзя, по-крайней мере без стороних продуктов.
Самый простой способ сделать меню незавсимым от конкретного языка я бы разбил на 4 этапа:
1 Создать меню в Дизайнере;
2 Сгенерировать меню - получиться файл с расширением .mpr.
3 Скопировать полученый файл (его будем править)
4 Заменить строки типа
Код: plaintext
1.
PROMPT "Bar1" 
вызовом функции:
Код: plaintext
1.
PROMPT  GetPrompt ("Bar1", goApp.LangId)

При любых изменениях меню ты его сможешь переделать в Дизайнере, потом опять создать копию .mpr файла и добавить вызовы функции.
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33594765
kdanylo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объектно-ориентированое меню для FoxPro 6.0 :

http://www.spacefold.com/colin/archive/articles/oo_menus/menus.htm
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33594769
andrewkor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdanylo2 Сгенерировать меню - получиться файл с расширением .mpr.
3 Скопировать полученый файл (его будем править)
4 Заменить строки типа
...
Можно один раз изменить в GenMenu.prg (FUNCTION defbars) строку
Код: plaintext
\\ PROMPT "<<m.prompt>>"
на строки
Код: plaintext
1.
2.
3.
4.
5.
	if left(m.prompt, 1 )=="~"
		\\ prompt <<subs(m.prompt, 2 )>>
	else
		\\ prompt "<<m.prompt>>"
	endif
Теперь в дизайнере можно писать выражения, предваряя их символом "~", например
~GetPrompt("Bar1", goApp.LangId)
...
Рейтинг: 0 / 0
двухязычный интерфейс
    #33595238
kdanylo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2andrewkor

Работает. Спасибо, класный хак.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / двухязычный интерфейс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]