Предложение по локализации

Место, где разработчики плагинов могут поделиться своим опытом.
Shmuel
Posts: 5161
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Предложение по локализации

Post by Shmuel » Sat 11 Apr, 2015 16:03

Нынешняя система локализации (языковые файлы формата "lng"), скажем так, не идеальна.
Например, хотелось бы поддержку локализации макросов пользователя со стороны плагина LuaMacro - не получается, т.к. набор макросов у всех разный, а набор языковых файлов плагина - фиксированный.

Собственно, предложение: добавить в API плагинов одну экспортируемую функцию типа
void ProcessLanguageChangeW(const wchar_t *LanguageID) - для простоты понимания аргумент пока представлен не в виде структуры.
Плагин будет оповещаться об изменении языка, при этом он может перегрузить свои "языковые файлы" (которые могут быть любого формата, например, все языки в одном файле), либо предпринять другие действия.

Разница с существующим положением вещей: достаточно легко организовать расширяемость, даже "на лету", то-есть без перезагрузки плагина.
Мне кажется, цена за это невысока, и кода добавить в Фар надо будет совсем немного.

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Предложение по локализации

Post by John Doe » Sat 11 Apr, 2015 17:05

Shmuel wrote: добавить в API плагинов одну экспортируемую функцию
А завтра понадобится ещё какое-нибудь оповещение, неужели ещё один экспорт заводить?
Может лучше какую-то обобщённую функцию для нотификаций?

User avatar
WARP ItSelf
Самый умный
Posts: 1011
Joined: Tue 15 Mar, 2005 23:19
Contact:

Предложение по локализации

Post by WARP ItSelf » Sun 12 Apr, 2015 02:54

Вот лишь бы добавить что-нибудь.

Для начала советую вот так попробовать (подробнее в коде newarc на SVN):

Code: Select all


void ArchiveModuleManager::SetCurrentLanguage(const TCHAR* lpLanguage, bool bForce)
{
	if ( bForce || FSF.LStricmp(lpLanguage, m_strCurrentLanguage) )
	{
		for (unsigned int i = 0; i < m_pModules.count(); i++)
			m_pModules[i]->ReloadLanguage(lpLanguage);

		m_strCurrentLanguage = lpLanguage;
	}
}

void __stdcall EXP_NAME(GetPluginInfo) (
		PluginInfo *pi
		)
{
	static TCHAR *PluginConfigStrings[1];

	PluginConfigStrings[0] = _M(MPluginTitle);

	pi->PluginConfigStrings = (const TCHAR *const*)&PluginConfigStrings;
	pi->PluginConfigStringsNumber = 1;

	string strLanguage;
	apiGetEnvironmentVariable(_T("FARLANG"), strLanguage);

	pManager->SetCurrentLanguage(strLanguage);

	pi->StructSize = sizeof(PluginInfo);
}

И именно, если непонятно, сравнить в GetPluginInfo свой язык с языком Far'а (FARLANG) и что-то поменять при необходимости.
Никто не знал, а я...

Shmuel
Posts: 5161
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Предложение по локализации

Post by Shmuel » Sun 12 Apr, 2015 07:12

John Doe wrote: Может лучше какую-то обобщённую функцию для нотификаций?
"Нотификация" - это в контексте Фара просто синоним для "события". Если есть конкретная идея, как должна выглядеть эта обобщённая функция, то представьте её на рассмотрение.
WARP ItSelf wrote: И именно, если непонятно, сравнить в GetPluginInfo свой язык с языком Far'а (FARLANG) и что-то поменять при необходимости.
GetPluginInfo не вызывается во многих случаях: при нажатии клавиш (которое может активизировать макрос), при поступлении разных событий. Это не является общим решением.

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Предложение по локализации

Post by John Doe » Sun 12 Apr, 2015 08:37

Shmuel wrote: Если есть конкретная идея, как должна выглядеть эта обобщённая функция, то представьте её на рассмотрение.
Вероятно как и прочие:

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Предложение по локализации

Post by John Doe » Sun 12 Apr, 2015 09:13

А чего реально не хватает макросам для локализации сейчас?
GetMsg вроде бы достаточно, если каждый скрипт будет передавать свой гуид.

Остаётся как-то заставить фар загружать lng не из папки плагина (и каким-либо способом сопоставлять им гуиды).
Так может бы нам нужна сервисная функция загрузки произвольных lng?

User avatar
WARP ItSelf
Самый умный
Posts: 1011
Joined: Tue 15 Mar, 2005 23:19
Contact:

Предложение по локализации

Post by WARP ItSelf » Sun 12 Apr, 2015 14:52

Ну, тут вопрос, можно ли изменить в Far'е язык так, чтобы GetPluginInfo не вызвалось. То, что он по нажатию клавиши не вызывается, это понятно.
Никто не знал, а я...

Shmuel
Posts: 5161
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Предложение по локализации

Post by Shmuel » Sun 12 Apr, 2015 14:56

WARP ItSelf wrote:можно ли изменить в Far'е язык так, чтобы GetPluginInfo не вызвалось.
В LuaMacro не вызывается, проверял.

User avatar
WARP ItSelf
Самый умный
Posts: 1011
Joined: Tue 15 Mar, 2005 23:19
Contact:

Предложение по локализации

Post by WARP ItSelf » Sun 12 Apr, 2015 16:24

Я в целом вроде понял, почему так происходит. Но если добавлять новую функцию, то надо действительно одну какую-то для всех нотификаций забабахать, как я думаю. Типа Notify или OnNotify. Обсуждать надо, видимо.

2 JD:

Для Lng надо или какое-то апи по их загрузке или украсть код опять же где-нибудь в ньюарке. Их реально несложно загружать и парсить руками. Хотя единый механизм был бы правильнее, конечно.
Никто не знал, а я...

User avatar
zg
zero-gravity
Posts: 5246
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Предложение по локализации

Post by zg » Sun 12 Apr, 2015 17:50

есть же ProcessSynchroEventW. название не самое удачное, но по большому счёту, какая разница?

User avatar
WARP ItSelf
Самый умный
Posts: 1011
Joined: Tue 15 Mar, 2005 23:19
Contact:

Предложение по локализации

Post by WARP ItSelf » Sun 12 Apr, 2015 18:17

Ну их бы все в одну функцию запихать, конечно. Так то разница только эстетическая.
Никто не знал, а я...

Shmuel
Posts: 5161
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Предложение по локализации

Post by Shmuel » Sun 12 Apr, 2015 18:27

zg wrote: есть же ProcessSynchroEventW. название не самое удачное, но по большому счёту, какая разница?
OK для меня.

User avatar
zg
zero-gravity
Posts: 5246
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Предложение по локализации

Post by zg » Sun 12 Apr, 2015 18:34

WARP ItSelf wrote:Ну их бы все в одну функцию запихать, конечно. Так то разница только эстетическая.
там тип предусмотрен.

User avatar
WARP ItSelf
Самый умный
Posts: 1011
Joined: Tue 15 Mar, 2005 23:19
Contact:

Предложение по локализации

Post by WARP ItSelf » Sun 12 Apr, 2015 19:17

Название несколько стремное, конечно. Но пихайте, потом как-нибудь к 4.0 переименуем и все.
Никто не знал, а я...

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Предложение по локализации

Post by John Doe » Mon 13 Apr, 2015 11:16

WARP ItSelf wrote: Для Lng надо или какое-то апи по их загрузке или украсть код опять же где-нибудь в ньюарке. Их реально несложно загружать и парсить руками. Хотя единый механизм был бы правильнее, конечно.
Lng очень даже просто парсить руками.
Но чем колхозить в каждом плагине, лучше бы иметь единый механизм.

User avatar
John Doe
Бюрократ
Posts: 11127
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 72 times

Предложение по локализации

Post by John Doe » Mon 13 Apr, 2015 12:12

И второй аспект локализации: hlf.
В принципе уже сейчас есть способ переложить на фар выбор с учётом языка:
"<FullPath>Topic" Абсолютная ссылка на тему в файле помощи, находящемся в каталоге FullPath. Путь задаётся c заключительным слешем.

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

Post Reply

Return to “Разработка плагинов”