Недоработки механизма локализации (???)

Автор Тема: Недоработки механизма локализации (???)  (Прочитано 21041 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Доброго времени суток.

- AutoCAD 2009 SP3 Enu
- AutoCAD 2014 SP1 Enu

Одна из перегруженных версий конструктора CommandMethod имеет следующую сигнатуру:
Код - C# [Выбрать]
  1. public CommandMethodAttribute(string groupName, string globalName, string localizedNameId, CommandFlags flags, Type contextMenuExtensionType, string helpFileName, string helpTopic);

Третий параметр (localizedNameId) задаётся строкой, выступающей в качестве идентификатора для поиска соответствующей записи в локализованном словаре ресурса текущего класса. Однако параметры helpFileName и helpTopic жёстко задаются строковыми значениями. В результате, не зависимо от того, какая локализация используется, справочная система вызывается всегда одна и та же, а не её локализованный вариант. Это неправильно. Механизм обработки выше обозначенных мною двух параметров должен быть тем же, который обрабатывает параметр localizedNameId, т. е. имя файла справки и имя нужного раздела справки так же должны читаться из файла локализованных ресурсов, а не жёстко прописываться в коде.

Причём желательно, чтобы в локализованных ресурсах имя фала справочной системы можно было бы указывать в т. ч. и в относительной форме, чтобы полный путь вычислялся относительно каталога, в котором находится данная сборка, т. к. справка может находится в некотором подкаталоге (у каждой локализации свой). Т. е. возможны, как минимум два варианта хранения локализованной справки:

Первый вариант (имя справки одинаково, но файлы хранятся в разных местах):

- ..\help\Ru-ru\myHelpFile.chm
- ..\help\En-us\myHelpFile.chm

Второй вариант (файлы хранятся в одном месте, но имеют разные имена):

- ..\help\myHelpFile.Ru-ru.chm
- ..\help\myHelpFile.En-us.chm

Откровенно говоря, обозначенную в этой теме проблему я считаю багом.

P.S. Точно не помню, возможно я уже и сообщал о проблеме в ADN пару-тройку лет назад, но на всякий случай обозначаю её в этой ветке форума.
« Последнее редактирование: 27-12-2013, 12:33:32 от Андрей Бушман »

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Для чего в локализованную версию устанавливать нелоколизованную справку (и наоборот, зачем  в базовой версии сваливать все локализации)?? Класть "правильную" справку нужно во время установки...

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Для чего в локализованную версию устанавливать нелоколизованную справку (и наоборот, зачем  в базовой версии сваливать все локализации)??
А для чего в программах имеется возможность переключение между локализациями? Или Вы и это считаете "сваливанием всех локализаций"? Или же по-Вашему это нормально, когда юзер указывает удобную ему локализацию, а справка остаётся от прежней локализации (именно это и получится, если следовать Вашим рекомендациям)?

В самом .NET заложен механизм, отделяющий код от локализаций и позволяющий выбирать нужную из имеющегося перечня. Локализованные ресурсы представлены в виде отдельных dll файлов. Добавление\удаление локализации сводится к банальному добавлению\удалению такой dll. И это правильное решение. Аналогично грамотным решением является и предоставление локализованных версий справочной системы, соответствующих тем локализациям, которые добавлены в программу, дабы когда юзер переключит локализацию, справка соответствовала ей.

Класть "правильную" справку нужно во время установки...
Получается, что решение о том, какая локализация справки является "правильной" решаете Вы, а не пользователь, переключающий локализацию приложения. Это неправильно. 99% моих .NET-плагинов под AutoCAD - это обычные zip архивы, а не MSI, которые в данном контексте считаю ненужными.
« Последнее редактирование: 26-12-2013, 13:00:51 от Андрей Бушман »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Выскажу своё предположение из-за чего имеет место ограничение в локализации справки.
Всё завязано на то, что AutoCAD .NET API в основном обертки для ObjectARX. В данном случае речь идет об обертке функции acedSetFunHelp, у которой есть такие параметры:
Код - C++ [Выбрать]
  1. int acedSetFunHelp(
  2.     const ACHAR* pszFunctionName, // Имя команды
  3.     const ACHAR* pszHelpfile, // Имя файла помощи
  4.     const ACHAR* pszTopic, // Имя раздела файла помощи
  5.     int iCmd // неиспользуемый параметр
  6. );
Т.е. локализацией в этой функции не пахнет. С другой стороны можно проверить текущую локализацию и запустить эту функцию с нужными параметрами в зависимости от локализации. Кстати, и в .NET через P/Invoke это сделать достаточно просто.
« Последнее редактирование: 07-10-2015, 13:14:04 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Может я подотстал от последних версих - а где Вы видели в автокаде переключение локализаций на лету (как это действительно есть во многих других программах). Да есть соответствующие механизмы (и не только в .Net) для выбора соответствующих библиотек, но к автокаду-то это не относится. По моему, то что формат хранения Ваших плагинов на данном этапе "не дружит" с локализацией (то есть, дружит, но с тем вариантом который есть в .Net, но отсутствует в Автокад) - это Ваш баг, а не автодеска. Реализовывать или нет соответствующие "навороты" системы решать им - мне вот тоже не нравится то, что объектная модель не поддерживает асинхронные операции - и что - почему это баг?? Не забывайте, что автокад (пока) написан не на .Net и все что видно из него - это только обертка - я уверен, что если делать с нуля, то на .Net автокад будет дешевле (в програмисточасах) и менее глючней, но поди напиши все по новой за год (а маркетинг того требует).

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
@Александр Ривилис
Не путайте белое с пушистым! В данном случае речь о .NET, а не о ARX. Обратите внимание на то,  что в управляемой обёртке, написанной Autodesk, параметр localizedNameId извлекает именно локализованное значение, обращаясь для этого к ресурсам класса. И, как видим, функция acedSetFunHelp никак не помешала этой реализации... Кроме того, вы не путайте файл справки AutoCAD с файлом справки плагина - менять локализацию плагина можно на лету, чего нельзя сделать с AutoCAD.

Так что же помешало по аналогии с localizedNameId сделать это и для параметров helpFileName, helpTopic? Реализация занимает  всего пару строк кода (если нужно, могу показать их).
Цитата: Александр Ривилис
Т.е. локализацией в этой функции не пахнет. С другой стороны можно проверить текущую локализацию и запустить эту функцию с нужными параметрами в зависимости от локализации. Кстати, и в .NET через P/Invoke это сделать достаточно просто.
Я не спрашивал о том, как проверять текущую локализацию или менять её - это я прекрасно умею делать (причём без всяких P/Invoke). Мой вопрос был совсем о другом.

Цитата: Дима_
а где Вы видели в автокаде переключение локализаций на лету (как это действительно есть во многих других программах).
А я и не писал о переключений локализаций на лету для самого AutoCAD... Я писал о смене локализаций применительно к плагинам. Такое переключение делается достаточно просто и время от времени в своих .net плагинах я это делаю (когда не ленюсь). Значение желаемой локализации  (её имя) хранится в файле настроек плагина. Если указанная не найдена, то используется та, что Default. Если найдена - то на момент работы команды текущей устанавливается та, что указана (локализация интерфейса) и по завершению работы возвращается прежняя. Если в файле настроек указать др. локализацию, то следующий вызов команды плагина применит эту локализацию (перезагрузка не требуется). Но по умолчанию происходит считывание той локализации, которую имеет AutoCAD. Поэтому, если AutoCAD английский, то и локализация в плагине будет искать прежде всего английскую, а если AutoCAD русский - то русскую. Если пользователь захочет для плагина принудительно указать иную (например, русскую в английском автокаде), то может сделать это в настройках. И заметьте: этот механизм не я придумал - это родной механизм, реализованный в .NET, а я всего лишь пользуюсь им (как и AutoCAD, применительно к localizedNameId).

Цитата: Дима_
Да есть соответствующие механизмы (и не только в .Net) для выбора соответствующих библиотек, но к автокаду-то это не относится. По моему, то что формат хранения Ваших плагинов на данном этапе "не дружит" с локализацией (то есть, дружит, но с тем вариантом который есть в .Net, но отсутствует в Автокад) - это Ваш баг, а не автодеска.
Прочитайте внимательней ещё раз первое сообщение данной темы... AutoCAD как раз таки использует механизм, реализованный в .NET - ещё раз смотрите на параметр localizedNameId. Но разработчики реализовали это так, что используют его только для одного параметра, хотя по хорошему следовало сделать это для трёх. Это недоработка обёртки!

Цитата: Дима_
Реализовывать или нет соответствующие "навороты" системы решать им
Это не "навороты", а недоделка, исправление которой укладывается в две строки кода. Я бы не задавал такого вопроса, если бы и localizedNameId не обращался к локализованным ресурсам. Но если уж начали делать, то доделывайте до конца (имхо).

Цитата: Дима_
Не забывайте, что автокад (пока) написан не на .Net и все что видно из него - это только обертка
Я пишу не об абстрактном сферическом коне в вакууме, а о конкретной ситуации. Кроме того, как я уже писал выше - исправление занимает всего две строки кода.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Андрей. Ты видимо не понял, что localizedNameId появилось лишь (!!!) потому, что у AcEdCommandStack::addCommand из ObjectARX есть аналогичный параметр. Всё это сделано не для того, чтобы ты мог локализовывать свои плагины, а для единообразия локализации команд в AutoCAD'е, которые имеют глобальное и локализованное имя. Причем локализованное имя команды зависит только от локализации самого AutoCAD. Если же тебе нужно расширить возможности локализации своего плагина (например, переключать локализацию налету) - тут тебе придется поработать самому.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Вы вчера добавляли свойство количества вершин в полилинию (родного такого нет) - причем которое будет работать естественно только из под .Net - это тоже баг по Вашему?? Наделать "свистелок" на 2-5002 строки можно бесконечное множество. Есть родной функционал, он развивается (и может через 3 версии добавится и тот, о чем Вы сейчас говорите), но это никак не баг - не умеет она этого, и не обязана, несмотря на то что .Net такое поддерживает, и автокад подобное реализует - но в другом месте. Я могу взять ЛЮБОЙ ваш плагин и найти там таких (чего он не умеет, а добавь 2 строчки - сможет) "багов" вагон (да и уверен, что юзеры Вас постоянно просят - а можно чтоб еще...).
з.ы. лично мне тоже много чего в автокаде не хватает (и даже раздражает), но вариантов-то нет...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
В данном случае чтобы реализовать то, что нужно Андрею, следует в методе IExtensionApplication.Initialize проверить локализацию и вызвать acedSetFunHelp с параметрами, зависящими от локализации. В этом случае нажатие F1 в AutoCAD для данной команды (команд) должно приводит к вызову соответствующей справки.
Фактически acedSetFunHelp занимается тем, что заносит во внутреннюю таблицу AutoCAD тройку строк имя команды-имя файла помощи-имя раздела помощи. При нажатии F1 AutoCAD проверяет эту таблицу и вызывает нужный раздел нужной справки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
@Дима_
0. А я разве где-то писал, что отсутствие количества точек в полилинии - это баг? Не нужно коверкать меня. Хотя, несомненно, реализовать это свойство было бы несложно и оно было бы достаточно восстребованным.

1. Я никогда не ставил (и не ставлю) свой код в качестве образца - ошибок в нём хватает, как собственно и в Вашем. При чём здесь мой код? По Вашей логике получается, что Autodesk на любое замечание\пожелание может отвечать: "да на свой код посмотрите, нефиг на наш смотреть" и по Вашему это будет считаться исчерпывающим ответом (раз Вы сейчас переключаетесь в этот режим)...

2. На моём старом сайте зачастую код не самой последней версии (если уж на то пошло).

3. В теме я обозначил конкретную проблему и обозначил способ её решения, который достаточно просто реализуется (см. код ниже).

Код - C# [Выбрать]
  1. // Это у них уже должно иметься, поскольку через менеджер ресурсов AutoCAD
  2. // получает локализованное значение для localizedNameId
  3. ResourceManager resMng = new ResourceManager(GetType());
  4.  
  5. // здесь код Autodesk...
  6.  
  7. // А добавить нужно всего лишь это (только вместо строк имена переменных):
  8. String helpFileName = resMng.GetString("helpFileName");
  9. String helpTopic = resMng.GetString("helpTopic");
  10.  


Цитата: Джон Роббинс
Баг, это всё что угодно, что заставляет пользователя страдать:
- аварии и зависания
- низкая производительность и масштабируемость
- неверные результаты
- нарушения безопасности
- противоречивые пользовательские интерфейсы
- неудовлетворённые ожидания

В данном случае, видя в плагине русский интерфейс, он ожидает увидеть русскую справка, а при виде английского - английскую.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Недоработка механизма локализации
« Ответ #10 : 26-12-2013, 16:10:22 »
4. В теме я обозначил конкретную проблему и обозначил способ её решения, который достаточно просто реализуется (см. код ниже).
Решение этой проблемы породит кучу проблем для них самих - а именно переработку массы собственных и сторонних команд, которые используют тот же конструктор. Единственный вариант, это создание еще одного конструктора.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Недоработка механизма локализации
« Ответ #11 : 26-12-2013, 16:14:52 »
Причем локализованное имя команды зависит только от локализации самого AutoCAD.
Да это всё понятно...
Если же тебе нужно расширить возможности локализации своего плагина (например, переключать локализацию налету) - тут тебе придется поработать самому.
Эту работу я без проблем делаю одной единственной строкой кода. Да услышьте же Вы меня на конец: у меня нет проблем с переключением локализаций своего плагина!!! Проблема в том, что когда пользователь набирает в консоли AutoCAD имя моей команды и, не нажимая Enter, жмёт клавишу F1, то открываться будет всегда один и тот же файл справки, не зависимо от локализации как плагина так и AutoCAD. Это неправильно!

Цитата: Александр Ривилис
Единственный вариант, это создание еще одного конструктора.
Ну или так... Важен результат, а не цвет "фенечек".

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Недоработка механизма локализации
« Ответ #12 : 26-12-2013, 16:15:58 »
В данном случае, видя в плагине русский интерфейс, он ожидает увидеть русскую справка, а при виде английского - английскую.
Повторюсь. Логика работы AutoCAD во все времена: "язык плагина" == "язык AutoCAD". Соответственно и справка должна быть на том языке, на котором AutoCAD. Например, в IExtensionApplication.Initialize ты копируешь в нужное место соответствующий языку локализации файл. И тогда AutoCAD будет использовать именно его.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Недоработка механизма локализации
« Ответ #13 : 26-12-2013, 16:17:03 »
Проблема в том, что когда пользователь набирает в консоли AutoCAD имя моей команды и, не нажимая Enter, жмёт клавишу F1, то открываться будет всегда один и тот же файл справки, не зависимо от локализации как плагина так и AutoCAD. Это неправильно!
Андрей. Ты это попробовал: http://adn-cis.org/forum/index.php?topic=417.msg1109#msg1109 ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Недоработка механизма локализации
« Ответ #14 : 26-12-2013, 16:24:59 »
То Андрей:
Я не про ошибки в кодах, а про то что в любой програмный продукт можно еще чего-то добавить, что обязательно кому-нибудь понадобиться (не предеться делать самому). Да есть вещи которые "производителю" решить объективно проще.
То Александр - да перегрузку-то с еще какой-нибудь коомбинацией типов придумать-то можно, технически это действительно не проблемма, просто надо очерчивать границы функционала - у нас и так в системе классов (перегрузок методов) которые НИ РАЗУ не были и не будут запущенны.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Недоработка механизма локализации
« Ответ #15 : 26-12-2013, 16:41:56 »
Повторюсь. Логика работы AutoCAD во все времена: "язык плагина" == "язык AutoCAD". Соответственно и справка должна быть на том языке, на котором AutoCAD.
Дело в том, что в .NET нет такого понятия как "язык плагина" (если отделять локализацию от кода, что собственно я обычно и делаю): один и тот же плагин может быть установлен как в русском, так и в английском AutoCAD. А поскольку локализованные ресурсы выносятся в отдельный файл ресурсов (dll), то нужная локализация автоматически находится и подставляется самой .NET, в виду чего один и тот же плагин в английском автокаде отображает английский интерфейс, а в русском - русский. Но сам по себе плагин (dll файл с кодом команд) один. А вот справка... Она же читается не автоматом из dll, а из файла chm, который нужно как-то указать уникально для каждой локализации свой...

Цитата: Александр Ривилис
В данном случае чтобы реализовать то, что нужно Андрею, следует в методе IExtensionApplication.Initialize проверить локализацию и вызвать acedSetFunHelp с параметрами, зависящими от локализации. В этом случае нажатие F1 в AutoCAD для данной команды (команд) должно приводит к вызову соответствующей справки.
Фактически acedSetFunHelp занимается тем, что заносит во внутреннюю таблицу AutoCAD тройку строк имя команды-имя файла помощи-имя раздела помощи. При нажатии F1 AutoCAD проверяет эту таблицу и вызывает нужный раздел нужной справки.
Я не увидел этот ответ, только сейчас заметил. Да, нужно будет попробовать, хотя у меня безуспешные попытки вроде уже были.

Например, в IExtensionApplication.Initialize ты копируешь в нужное место соответствующий языку локализации файл.
Хм... Как вариант, конечно же подходит, если файлы справки хранятся в каталоге, доступном юзеру для редактирования (например, в %AppData%).
« Последнее редактирование: 26-12-2013, 17:24:52 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Недоработка механизма локализации
« Ответ #16 : 26-12-2013, 17:37:49 »
Кстати, вот же ещё неприятный момент:
Цитировать
Чтобы справка открывалась не только под отладкой, нужно в каталоги поиска САПР (Support File Search Path) добавить путь к каталогу плагина (в абсолютной или относительной форме).
Если это выполнять для каждого плагина, то сами понимаете, во что превратится Support File Search Path... Было бы неплохо, если бы AutoCAD искал справку плагина относительно каталога его сборки.

Пока что попробую разрулить этот момент через acedSetFunHelp.

Ну, давайте, закидывайте меня бананами....

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Недоработка механизма локализации
« Ответ #17 : 26-12-2013, 17:42:53 »
Ну, давайте, закидывайте меня бананами...
Бананами не буду. Если использовать технологию с acedSetFunHelp то просто пропишешь полные пути и всё. А вот с учетом того, что и для CommandAttribute используется тот же acedSetFunHelp и после этого AutoCAD уже понятия не имеет о том, что этот вызов был из твоего модуля - тут вряд ли возможно что-то сделать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Возвращаясь к нашим бананам...

- AutoCAD 2014 SP1 x64 Enu
- AutoCAD 2009 SP3 x64 Enu

Читаю это:
Цитата: acedSetFunHelp
Defines a Help call that should be made if a transparent Help request is made during a command line prompt for the function named pszFunctionName.

This function registers Help for functions that are called from the AutoCAD command line so that the appropriate Help file and topic are called when help is requested at a user prompt. acedSetFunHelp() may be used for ObjectARX commands, as well as ObjectARX and AutoLISP commands that start with C:.
По началу, меня несколько насторожило  отсутствие упоминания команд, написанных на .NET... Однако практика показала, что опасения были напрасны. В качестве "подопытной кошки" выступал chm-файл, прикреплённый во вложении.

Код - C# [Выбрать]
  1. // Commands.cs
  2. // © Andrey Bushman, 2013
  3. // Перехват и обрабока вызова раздела справочной системы для команд AutoCAD
  4.  
  5. // Microsoft
  6. using System;
  7. using System.Resources;
  8. using System.IO;
  9. using System.Runtime.InteropServices;
  10.  
  11. // Autodesk
  12. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  13. using Ed = Autodesk.AutoCAD.EditorInput;
  14. using Rtm = Autodesk.AutoCAD.Runtime;
  15.  
  16. [assembly: Rtm.ExtensionApplication(typeof(Bushman.CAD.Tests.Commands))]
  17. [assembly: Rtm.CommandClass(typeof(Bushman.CAD.Tests.Commands))]
  18.  
  19. namespace Bushman.CAD.Tests {
  20.         public class Commands : Rtm.IExtensionApplication {
  21.  
  22. #if acad_newer_than_2012
  23.                 const String acedSetFunHelpOwner = "accore.dll";
  24. #else
  25.                 const String acedSetFunHelpOwner = "acad.exe";
  26. #endif
  27.                 // © Adam Nagy, 2012
  28.                 // Source: http://adndevblog.typepad.com/autocad/2012/05/change-help-file-and-topic-associated-to-a-given-command.html
  29.                 // In case of AutoCAD 2013 and above
  30.                 // replace "acad.exe" with "accore.dll"
  31.                 [DllImport(acedSetFunHelpOwner, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl,
  32.                         EntryPoint = "acedSetFunHelp")]
  33.                 private static extern int acedSetFunHelp(String functionName, String helpFile, String helpTopic,
  34.                         Int32 cmd);
  35.  
  36.                 [Rtm.CommandMethod("bushman", "test", Rtm.CommandFlags.Modal)]
  37.                 public void Test() {
  38.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  39.                         ed.WriteMessage("\nHello, World!\n");
  40.  
  41.                         // Чтобы можно было проверить вызов справки для командной строки в AutoCAD 2009
  42.                         ed.GetInteger("Type some integer value");
  43.                        
  44.                 }
  45.  
  46.                 public void Initialize() {
  47.                         Ed.Editor ed = cad.DocumentManager.MdiActiveDocument.Editor;
  48.                         ed.WriteMessage("\nThe {0} loaded...\n", Path.GetFileName(this.GetType().Assembly.Location));
  49.  
  50.                         // В качестве теста взял один из своих старых файлов справки (DrawingQuickCopyHelp.chm)
  51.                         // и закинул его на "рабочий стол" - тренируюсь, так сказать, "на кошках"...
  52.  
  53.                         acedSetFunHelp("C:LINE", Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
  54.         "DrawingQuickCopyHelp.chm"), "dwgquickcopy", 0);
  55.                         acedSetFunHelp("C:CIRCLE", Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
  56.                                 "DrawingQuickCopyHelp.chm"), "settings", 0);
  57.  
  58.                         // Регистрирую свою ".net" команду
  59.                         acedSetFunHelp("test", Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
  60.                                 "DrawingQuickCopyHelp.chm"), "contacts", 0);
  61.  
  62.                         ed.WriteMessage("\nThe help info registered...\n");
  63.                 }
  64.  
  65.                 public void Terminate() {
  66.                         // is empty
  67.                 }
  68.         }
  69. }

Маленькое отступление... А.Н. Ривилис здесь дал комментарий:
Цитата: Alexander Rivilis
Hi, Adam!
What about that LINE is not Autolisp-definded command and so you have to use not "C:LINE", but "LINE" in your's code?

Я проверял для команд LINE и CIRCLE два варианта - с префиксом "C:" и без него: в обоих случаях результат получается один и тот же. Теперь о результатах, полученных в AutoCAD 2014 SP1:

1. В случае с Line и Circle переопределение справки работает для "риббонов" и "туллбаров", но не для командной строки AutoCAD.
2. В случае с Test (т. е. для моей .NET команды) переопределение справки работает для "риббонов" и командной строки AutoCAD, но не для "туллбаров".

А вот в AutoCAD 2009 SP3, для определённых мною .net команд, это работает во всех трёх ситуациях (риббон\туллбар\командная строка). ;D Хотя для команд LINE и CIRCLE в AutoCAD 2009 SP3 поведение наблюдается такое же, как и в случае с AutoCAD 2014 SP1, но для меня важно, чтобы корректно работало для созданных мною команд.  ;)

P.S. Я пробовал регистрировать и полное имя команды, с указанием её пространства имён: "bushman.test" (думал: мало ли, может это поможет), но в этом случае открывается справка AutoCAD, а не моя. Значит регистрацию всегда нужно проводить без участия namespace команды.
« Последнее редактирование: 27-12-2013, 12:41:00 от Андрей Бушман »

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Кончено в зависимости от ситуации, но "топорный" метод проверки локализации и переноса в случае необходимости .chm может быть даже более "интересным" - например в случае 1 сборка, 1 .chm и кучка команд.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Кончено в зависимости от ситуации, но "топорный" метод проверки локализации и переноса в случае необходимости .chm может быть даже более "интересным" - например в случае 1 сборка, 1 .chm и кучка команд.
я не понял этой фразы.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Александр Ривилис, в этой теме предлагал 2 варианта решения, 1 "правильный" - использовать импорт acedSetFunHelp и установить в ручную привязки путей помощи, и 2-ой "топорный" - во время загрузки библиотеки - IExtensionApplication.Initialize - проверить соответствие локализации файлу помощи и если необходимо - заменить. Пути к помощи при этом "жестко" прописанны в соответствующем аттрибуте CommandMethod. Минус что справку придеться хранить в доступной для записи области и "работать с файлами" при загрузке, но зато (если 1 справка на все команды), не париться с установкой на каждую команду (то есть исключаються варианты типа добавил команду в сборку, в справку, но забыл ее правильно инициализировать).

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
но зато (если 1 справка на все команды), не париться с установкой на каждую команду (то есть исключаються варианты типа добавил команду в сборку, в справку, но забыл ее правильно инициализировать).
А как AutoCAD будет знать, что ему нужно обработать еще одну команду? Т.е. в любом случае для каждой команды нужен будет  свой CommandAttribute с именем файла справки и раздела справки. Хотя идею с IExtensionApplication.Initialize можно развить на "правильном" пути - при помощи Reflection получить все команды в сборке и им назначить через acedSetFunHelp справку. Вот тогда действительно можно будет "не парится" с назначением помощи каждой из команд.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Хотя идею с IExtensionApplication.Initialize можно развить на "правильном" пути - при помощи Reflection получить все команды в сборке и им назначить через acedSetFunHelp справку. Вот тогда действительно можно будет "не парится" с назначением помощи каждой из команд.
Именно это я сейчас и делаю в качестве примера... :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
А вот в AutoCAD 2009 SP3, для определённых мною .net команд, это работает во всех трёх ситуациях (риббон\туллбар\командная строка). ;D
Странно. В той же статье Адам Наги пишет, что для тултипов работать не должно - нужно править CUIx.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Странно. В той же статье Адам Наги пишет, что для тултипов работать не должно - нужно править CUIx.
Я в CUI создал новую кнопку, палитру кнопок, палитру риббона, вкладку риббона. Назначил кнопке свою команду test. Добавил в текущий workspace свою вкладку риббона и обычную палитру с кнопкой. Вот на этом и тестировал.

В AutoCAD 2009 нет CUIx меню, они появились только начиная с 2010.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Цитировать
Т.е. в любом случае для каждой команды нужен будет  свой CommandAttribute с именем файла справки и раздела справки
Да нужно, но она 1 - не надо будет "обрабатывать" каждую команду. То есть делаешь аттрибут как будто справка на 1 языке, и забываешь.
А насчет - через Reflection назначить сразу всей сборке - тогда надо придумывать (и соблюдать) алгоритм взаимосвязи имени (или других аттрибутов) функции от названия файла справки и названия топика - что по моему лишнее.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Тут то как раз всё просто: "имя команды" == "имя раздела справки", "имя файла справки" == "имя сборки".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Первые наброски готовы... Я написал пример плагина в котором:

1. При загрузке его в AutoCAD, в консоль AutoCAD выводится информация о командах, определённых в составе этого плагина: глобальные и локализованные имена команд, с указанием их групп (если они заданы). Так же выводится локализованное краткое примечание по каждой команде (что она делает). Вся обозначенная выше информация вычисляется динамически (через Reflection), не зависимо от того, сколько классов\методов определено в сборке.

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

3. По умолчанию в плагине используется локализация AutoCAD, но пользователь может указать иную. В этом случае при очередном вызове команд или попытке посмотреть их справку, вся информация будет предоставляться на указанной юзером локализации (перезагрузка AutoCAD не требуется). Если ресурсов под указанную локализацию нет, то используются те, что Default.

Можно использовать как заготовку для новых плагинов, чтобы каждый раз заново не реализовывать в плагине механизм, обозначенный выше. Сегодня уже не успеваю оформить презентабельно - если в воскресенье (у нас рабочий день) успею, то оформлю и опубликую. А так, всё работает пучком...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Будет интересно посмотреть и покритиковать!  :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Будет интересно посмотреть и покритиковать!  :)

Мне видится две возможные реализации (с прицелом на повторное использование):

1. В виде шаблона MS Visual Studio, в составе которого находится непосредственно исходный код, выполняющий перечисленные мною выше операции.

2. В виде отдельно скомпилированной DLL, подключаемой к плагину. Реализуя в своём плагине метод IExtenionApplication.Initialize, программист должен будет всего лишь вызвать в нём некий статический метод, определённый в составе обозначенной выше DLL,  например public static void PluginServices.InitializeLocalizedInfo(Assembly asm).

На текущий момент я реализовал идею в виде первого варианта, но всё же я больше склоняюсь ко 2-му, поскольку предпочитаю строить решение на основе множества маленьких блоков, вместо того, чтобы формировать один большой. Маленькие кусочки легче отлаживать, с ними проще работать и поддерживать их. Если потребуется внести изменения в исходный код, то при использовании 2-го варианта придётся сделать это лишь в одном месте, после чего просто заменить старую DLL на новую. Но если использовать первый - то такие правки придётся вносить во все плагины.

Жду Ваших комментариев по обозначенным вариантам :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Второй вариант конечно имеет свои преимущества, но при переходя на другую версию .NET (как я понимаю) потребуется перекомпиляция подключаемой DLL...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Второй вариант конечно имеет свои преимущества, но при переходя на другую версию .NET (как я понимаю) потребуется перекомпиляция подключаемой DLL...
Но Вас же не пугает то, что каждый третий год Вам приходится выполнять перекомпиляцию ваших ARX программ? Почему же Вас пугает то, что при переходе на очередную версию .NET (или при внесении изменений в функционал API, используемый в Вашем плагине) придётся перекомпилировать управляемый плагин? :)

Перекомпиляция занимает не так много времени ;) .... Да и Microsoft не каждый год выпускает очередную версию .NET Framework. :)

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Хоть мне и не надо - но по моему правильней второй. Но ИХМО указывать сборку это "вторая" перегрузка, по умолчанию - та откуда вызван метод.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Хоть мне и не надо - но по моему правильней второй. Но ИХМО указывать сборку это "вторая" перегрузка, по умолчанию - та откуда вызван метод.
Я буду Вам весьма признателен, если Вы постараетесь более развёрнуто излагать свои мысли. Нередко мне достаточно сложно понять то, что Вы пытаетесь написать: либо вообще не понимаю, либо возникает неоднозначность, либо понимаю неправильно.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Будет интересно посмотреть и покритиковать! 
Можете приступать. Опубликовано здесь.

P.S. Тестировал в AutoCAD 2009 SP3 x64 Enu и в AutoCAD 2014 SP1 x64 Enu. Проверить в локализованных версиях AutoCAD не имею возможности.
« Последнее редактирование: 29-12-2013, 20:44:05 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Пока ехал с работы домой решил, что, пожалуй, завтра стоит внести в текущую реализацию ряд изменений:

1. Следует управление локализацией интерфейса плагина отделить от управления локализацией справочной системы. Например, я предпочитаю работать с английским интерфейсом, но если в доступе есть справка на русском, то предпочитаю её английской. В текущей реализации получается, что если в настройках установлена локализация Ru-ru, то и опции, выводимые в консоли и справка будут на русском. Соответственно мне придётся постоянно переключаться на клавиатуре между русской\английской раскладкой. А учитывая вот такой баг AutoCAD, этот процесс будет весьма сильно раздражать....

2. Помимо текущего набора переменных, которые можно использовать в XML файле настроек, пожалуй стоит добавить переменную %Platform%, значение которой автоматически будет подставляться либо x86 либо x64 (зависит от разрядности AutoCAD). Переменная может быть задействована при формировании каталогов и имён файлов, содержащих в своём составе информацию о зависимости к конкретной платформе.
« Последнее редактирование: 29-12-2013, 20:46:19 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Обратите внимание на скрины консоли: AutoCAD 2014 SP1 "сливает" всё форматирование (пустые строки, посредством которых я группирую информацию). А в AutoCAD 2009 SP3 всё отображается корректно (форматирование присутствует).

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Обратите внимание на скрины консоли: AutoCAD 2014 SP1 "сливает" всё форматирование (пустые строки, посредством которых я группирую информацию).
Для проверки написал такое:
Код - C# [Выбрать]
  1. [CommandMethod("TestPrint", CommandFlags.Modal)]
  2. static public void TestPrint()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   Editor ed = doc.Editor;
  6.   ed.WriteMessage("\nLine 1");
  7.   ed.WriteMessage("\n\tLine 2");
  8.   ed.WriteMessage("\n\n\t\tLine 3");
  9. }

В консоли действительно пустые строки AutoCAD 2014 убирает - с учетом того что консоль достаточно ограниченна по размеру может это и правильно:



Зато в текстовом окне пустые строки все на месте и форматирование присутствует:


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Если я правильно понял твой код, то на время действия своих команд ты переключаешь системную локализацию. Я бы был с этим крайне осторожен, так как она влияет и на вывод разделителя целой и дробной части действительных чисел. Больше ничего сказать не могу, так как не вижу исходника Bushman.CAD.PluginServices.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Больше ничего сказать не могу, так как не вижу исходника Bushman.CAD.PluginServices.
Значит вы не до конца прочитали, т. к. все исходники там присутствуют - в самом конце заметки выложен архив с проектом.
Цитата: Александр Ривилис link=topic=417.msg1162#msg1162 date=1388356141
Если я правильно понял твой код, то на время действия своих команд ты переключаешь системную локализацию. Я бы был с этим крайне осторожен, так как она влияет и на вывод разделителя целой и дробной части действительных чисел.
Культура культуре рознь... Вы мне пишете об этой. А я временно переключаю совсем другую - вот эту. Но если бы вы открыли исходники, которые я выложил в той же заметке в виде архива, то смогли бы и сами это увидеть. ;)

Более того, в примерах я показываю переключение на время выполнения команды. Однако делать это каждый раз вовсе необязательно: можно один раз переключить культуру пользовательского интерфейса на нужную и оставить её текущей, не переключая обратно. Тогда сразу все .NET плагины подхватят это изменение, которое будет действовать до конца сеанса работы acad.exe.

Например можно сделать так: в диалоговом окне Options добавить дополнительную вкладку, на которой разместить элементы, позволяющие управлять дополнительными общими настройками плагинов. В частности - два ComboBox, при помощи которых пользователь мог бы указать предпочитаемую им локализацию пользовательского интерфейса плагинов, а так же предпочитаемую им локализацию справочной системы. Делается это достаточно просто: настройки того же CAD Recovery я именно так и оформил (см. вложенный файл).
« Последнее редактирование: 30-12-2013, 11:31:36 от Андрей Бушман »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Значит вы не до конца прочитали, т. к. все исходники там присутствуют - в самом конце заметки выложен архив с проектом.
Я намекал, но ты не понял, что исходники не полные (в архиве нет проекта NetExtensions целиком), т.к. архивировал ты только одну папку.
Культура культуре рознь... Вы мне пишете об этой. А я временно переключаю совсем другую - вот эту. Но если бы вы открыли исходники, которые я выложил в той же заметке в виде архива, то смогли бы и сами это увидеть. ;)
По поводу исходников - смотри выше. По поводу культуры - будем считать, что мне показалось.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Цитата: Александр Ривилис
Я намекал, но ты не понял, что исходники не полные (в архиве нет проекта NetExtensions целиком), т.к. архивировал ты только одну папку.
А вон оно что... Я и не заметил. :) Исправлюсь. Внёс изменения, упомянутые мною выше (отделил управление локализацией интерфейса от локализации справочной системы). Перезаписал запись блога, перезалил исходники. Можно смотреть.
« Последнее редактирование: 30-12-2013, 16:07:31 от Андрей Бушман »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Ежели у кого есть возможность проверить обозначенный код в русском AutoCAD - буду признателен. :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Новый год на носу. Какие проверки? :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В текущей реализации библиотеки NetExtension, локализация интерфейса команд и интерфейса справки определяется в таком порядке:

1. Если локализации указаны в конфигурационном файле плагина, то они применяются.
2. Если в конфиг. файле плагина локализации не указаны, то применяются те, которые являются текущими в AutoCAD.
3. Если в реализации плагина отсутствует локализация, соответствующая текущей локализации AutoCAD, то применяется локализация, которая в плагине обозначена как default (т.е. используемая по умолчанию).

Т.о. в текущей реализации NetExtension получается, что если у юзера плагинов много, то ему придётся ковырять конфиг. файл каждого плагина, дабы в них прописывать предпочитаемые локализации для интерфейса и справки. Это достаточно неудобно.

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

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

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

Я, пожалуй, склоняюсь к первому варианту -  так сказать "от частного к общему", но на всякий случай спрашиваю, у кого какие мысли по данному пункту?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Я бы задумался над тем есть ли необходимость иметь индивидуальные настройки локализации для разных плагинов. Я слабо себе представляю ситуацию когда для одного плагина предпочитают русскую локализацию, а для другого английскую.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Я слабо себе представляю ситуацию когда для одного плагина предпочитают русскую локализацию, а для другого английскую.
Если один плагин имеет русскую и английскую локализацию, а второй английскую и китайскую.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Если один плагин имеет русскую и английскую, а второй английскую и китайскую.
Согласен. Теоретически такой вариант возможен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Я слабо себе представляю ситуацию когда для одного плагина предпочитают русскую локализацию, а для другого английскую.
Если один плагин имеет русскую и английскую локализацию, а второй английскую и китайскую.
Я бы перефразировал так:
Цитировать
Если один плагин имеет французскую и английскую локализацию, а второй английскую и китайскую.
Причём в первом случае в качестве default первым программистом указана французская, а во втором - китайская (вторым программистом). :)
В этой ситуации, если пользователь укажет русскую локализацию в качестве предпочитаемой, то данные плагины будут отображаться на французском и китайском соответственно. Поэтому индивидуально для этих плагинов потребуется задать наименее страшный вариант - английскую.

Я так понял, что мыслей по обозначенному вопросу (о приоритетах настроек) нет :) Хотя... из логики выше обозначенного вытекает всё же первый вариант...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Я так понял, что мыслей по обозначенному вопросу (о приоритетах настроек) нет :)
Так как менять эти значения в реестре вручную сложнее, чем в конфигурационном файле, то (IMHO) у конфигурационного файла приоритет выше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
менять эти значения в реестре вручную сложнее
Да собственно это и не проблема: можно написать команду, которая будет это делать - либо в отдельном диалоговом окне юзер из списка существующих локализаций выберет предпочитаемые, либо просто добавить на свою вкладку в диалоговом окне Options два ComboBox с выбором локализаций.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
либо просто добавить на свою вкладку в диалоговом окне Options два ComboBox с выбором локализаций.
А на каком языке будет эта вкладка? :D
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
А на каком языке будет эта вкладка? :-D
Например на C#.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Например на C#.
Русский, английский, французский, китайский, язык AutoCAD, язык Windows???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Русский, английский, французский, китайский, язык AutoCAD, язык Windows???
Если в реестре нет значений, то локализация вкладки будет та же, что и Windows. Если такая не будет найдена в плагине, то - локализация AutoCAD или же default, если искомые не будут найдены среди доступных локализаций плагина. Но если в реестре будет указана локализация, то в первую очередь будет пытаться примениться она. Мне кажется, что такая очерёдность будет более удобной.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13166
  • Карма: 1701
  • Рыцарь ObjectARX
  • Skype: rivilis
Мне кажется, что такая очерёдность будет более удобной.
Я бы поменял между собой приоритеты между языком AutoCAD и Windows. Считаю более естественным если по-умолчанию язык этой вкладки не будет отличатся от языка соседних вкладок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Я бы поменял между собой приоритеты между языком AutoCAD и Windows. Считаю более естественным если по-умолчанию язык этой вкладки не будет отличатся от языка соседних вкладок.
Ну тогда по такой логике и локализация плагинов и справочной системы должны быть английскими, чтобы выглядеть "более естественно". А ежели после сохранения в реестре пользовательских предпочтений, локализация вкладки будет читаться оттуда и при этом отличаться от локализации AutoCAD, то какой смысл равняться в первую очередь на локализацию AutoCAD (всё равно ведь затем локализация вкладки изменится)? Мне кажется, что локализация операционной системы с гораздо большей долей вероятности будет соответствовать предпочтениям пользователя. Английский AutoCAD предпочитают вовсе не из любви к английскому языку. :)