Revit 2017.1.1
В официальной документации по Revit API присутствует информация о том, как можно выполнять
локализацию внешних команд и внешних приложений Revit
посредством файла манифеста, ссылаясь в нём на соответствующие записи файла локализованных ресурсов. Информация достаточно простая и понятная, как показалось на первый взгляд. Однако моя попытка применить это на практике положительных результатов не дала...
В обозначенной заметке присутствует ссылка на
Walkthrough: Creating Managed Satellite DLLs, где рассказывается о том, как в Visual Studio 2013 на основе шаблона
Visual Studio Add-in создать управляемую сборку-сателит, содержащую ресурсы, доступные для использования внешним сборкам. Однако у меня Visual Studio 2015 и обозначенного шаблона я в ней не нашёл. В виду этого сгенерировал файлы ресурсов таким же способом, каким успешно делаю это уже многие годы...
Обычно я работаю с локализованными ресурсами посредством
ResourceManager, однако обозначенный в документации способ мне был доселе не знаком и потому я решил попробовать этот новый способ...
В
Walkthrough: Creating Managed Satellite DLLs имеется такой фрагмент текста:
17. In Solution Explorer, right-click Resource1.resx and then click Properties.
18. In the Properties window, change Build Action from Embedded Resource to None.
This prevents the resource from being built into the add-in assembly.
Если это выполнить, то при компиляции локализованные ресурсы создаваться не будут и потребуется вручную выполнять пункты 20-22. Насколько я понимаю, выполнение этих пунктов даёт в итоге тот же результат, который получается при значении
Embedded Resource для файлов
Resource1.en.resx и
Resource1.ru.resx, с той лишь разницей, что результат будет получен вручную, а не сгенерирован автоматически.
Встраивание ресурсов в основную сборку происходит только для resx-файлов, не имеющих в составе своего имени суффикса, указывающего на локализацию (en, ru, en-US, ru-RU). Это так называемые
default-локализации, которые используются в том случае, когда не найдены ресурсы с нужной локализацией. А ежели суффикс с локализацией присутствует у resx-файла, то на его основе создаётся ресурсный файл и помещается в подкаталог, имеющий имя суффикса локализации.
Ок, всё же пробуем выполнить вручную то, что советуют в обозначенной статье:
cd /D "C:\Users\root\Documents\visual studio 2015\Projects\HelloWorld"
Resgen Resource1.resx
AL.exe /embed:Resource1.resources /culture:en /out:HelloWorld.resources.dll
Однако сгенерированные таким образом (п.20-22) файлы и закинутые по подкаталогам
en и
ru в основном каталоге внешней команды, проблему не решили - ресурсы по прежнему не задействованы манифестом. В виду этого я для RESX-файлов вернул обратно значение
Embedded Resource вместо
None.
Полный исходный код своего примера
HelloWorld я опубликовал на
BitBucket. Обращаю ваше внимание на то, что в указанной версии дистрибутива RESX-файлам назначено свойство
Embedded Resource вместо
None, и соответственно локализованные ресурсы генерируются автоматически.
Файл манифеста такой:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
<AddIn Type="Command">
<Assembly>HelloWorld\HelloWorld.dll</Assembly>
<AddInId>{39E8DC8B-DC8F-44A5-ABC9-39442B5031ED}</AddInId>
<FullClassName>HelloWorld.ExternalCommand</FullClassName>
<Text>@Text</Text>
<VendorId>@VendorId</VendorId>
<VendorDescription>@VendorDescription</VendorDescription>
<VisibilityMode>NotVisibleInFamily</VisibilityMode>
<Discipline>Structure</Discipline>
<Discipline>Architecture</Discipline>
<AvailabilityClassName>HelloWorld.ExternalCommandAvailability</AvailabilityClassName>
<LongDescription>@LongDescription</LongDescription>
<TooltipImage>@TooltipImage</TooltipImage>
<LargeImage>@LargeImage</LargeImage>
</AddIn>
</RevitAddIns>
Пара скринов, показывающих состав ресурсов:
Результат выглядит следующим образом:
Как видим, ресурсы не используются.
Я пробовал размещать содержимое моей внешней команды непосредственно в каталоге, где находится соответствующий addin-файл (внеся в него соответствующие правки), но это так же не помогло.
Как добиться ожидаемого результата, воспользовавшись
обозначенным в документации способом локализации интерфейса?
Может быть способ локализации интерфейсов внешних команд и приложений посредством привязки файла манифеста к записям локализованных ресурсов всё же не работает в Revit?