Revitアドインを多言語対応させる

# はじめに
Autodesk App StoreなどでRevitアドインを公開する際、より多くの人にダウンロードしてもらうためには、日本語版だけでなく英語版を公開する必要があります。そこで、以下のシンプルなRevitアドインを例として、複数言語に対応させる方法を解説します。

:::note info
本記事ではRevit2024/.NET Framework4.8を使用していますが、Revit2025/.NET 8でもやり方は同じです
:::

```C#:App
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.UI;
using Addin.Utils;

namespace Addin
{
    class App : IExternalApplication
    {
        public Result OnStartup(UIControlledApplication a)
        {
            var panel = AppUtils.AddPanel(a, "たぶ");
            panel.AddItem(AppUtils.CreateButton("ぼたん", "Addin.Commands.Hello", "つーるちっぷ", revit));
            return Result.Succeeded;
        }
    
        public Result OnShutdown(UIControlledApplication application)
        {
            return Result.Succeeded;
        }
    }
}
```

```C#:Command
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.ApplicationServices;

namespace Addin.Commands
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    public class Hello : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            var window = new Views.MaterialDesignWindow(commandData);
            window.ShowDialog();
            return Result.Succeeded;
        }
    }
}
```

```xml:View
<Window x:Class="Addin.Views.HelloWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="500">
    <Grid>
        <TextBlock Text="こんにちは, Revit!" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24"/>
    </Grid>
</Window>
```



# リソースの追加
プロジェクトのプロパティの __リソース__ を開き、__このプロジェクトには既存のリソースファイルが...__ をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059946/a78e1fb4-9df3-01fa-9c09-d17c3011346c.png)

以下のようにリソースが作成されるので、アクセス修飾子を __Public__ に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059946/ae4a6de7-72a6-f734-1382-5e4b131bdad0.png)

ソリューションエクスプローラーの __Properties__ を右クリックして __追加__ ➡ __新しい項目__ で __新しい項目の追加__ ウィンドウを開き、`Resources.ja.resx`というファイルを新規追加します。

:::note info
ファイル名は`Resources.{ニュートラルカルチャ}.resx`もしくは`Resources.{カルチャ}.resx`とします。カルチャの種類は [こちら](https://docwiki.embarcadero.com/RADStudio/Sydney/ja/%E8%A8%80%E8%AA%9E%E3%82%AB%E3%83%AB%E3%83%81%E3%83%A3%E5%90%8D%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89%E3%80%81%E3%81%8A%E3%82%88%E3%81%B3_ISO_%E5%80%A4) を参考にしてください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059946/56f88470-fbd8-ddfa-81f3-314f95dcc327.png)

リソースエクスプローラーを開くと、Addin/Resourcesに「ニュートラル値」と「ja」の列が表示されているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059946/c27d21aa-aa5f-d97c-9375-7f1f545cc383.png)

`CMD_NAME` `CMD_TOOLTIP` `TAB_NAME` `TXT_HELLO` の4項目を追加して、「ニュートラル値」に英語の値を、「ja」に日本語の値をそれぞれ入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059946/978b41b2-c3bf-875e-89a5-05b49f9beb60.png)



# Appの修正
先ほど作成したリソースを`using static`で参照して、ベタ打ちのタブ名、コマンド名、ツールチップをリソースに置き換えます。なお、「ja」が未入力の項目は「ニュートラル値」の値が参照されます。

```diff_c_sharp:App
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.UI;
using Addin.Utils;
+ using static Addin.Properties.Resources;

namespace Addin
{
    class App : IExternalApplication
    {
        public Result OnStartup(UIControlledApplication a)
        {
+           var panel = AppUtils.AddPanel(a, PNL_NAME);
+           panel.AddItem(AppUtils.CreateButton(CMD_NAME, "Addin.Commands.Hello", CMD_TOOLTIP, revit));
            return Result.Succeeded;
        }
    
        public Result OnShutdown(UIControlledApplication application)
        {
            return Result.Succeeded;
        }
    }
}
```

# Viewの修正
Appと同様にリソースを参照して、ベタ打ちのテキストをリソースに置き換えます。

```diff_xml:View
<Window x:Class="Addin.Views.HelloWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+       xmlns:props ="clr-namespace:Addin.Properties"
        Height="300" Width="500">
    <Grid>
+       <TextBlock Text="{x:Static props:Resources.TXT_HELLO}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24"/>
    </Grid>
</Window>
```



# ビルド
__アプリケーション__ ➡ __アセンブリ情報__ ➡ __ニュートラル言語__ を「なし」に設定してからアドインをビルドします。ビルドしたアドインを通常どおりRevitのアドインフォルダに配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059946/577b5458-b9f2-e984-c431-602c504cf236.png)

# 動作確認
まずは日本語版Revitを起動してアドインタブを開き、アドインのコマンドボタンとウィンドウが日本語になっていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059946/2f84603a-e592-9e2b-8156-2c82ca3aa0a4.png)

続いて、コマンドプロンプトで以下のコマンドを実行し英語版Revitを起動します。

```powershell:コマンドプロンプト
"C:\Program Files\Autodesk\Revit 2024\Revit.exe" /language ENU
```

:::note info
通常、WPFアプリの言語はWindowsの言語設定に応じて切り替わりますが、Revitアドインの場合はRevitの言語設定に応じて切り替わります。
:::

Add-Insタブを開くと、アドインのコマンドボタンとウィンドウが英語になっていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059946/f2cf23cc-467a-1898-e249-a1f53e9b86c2.png)


# その他 多言語 Revit 環境での注意点
- システムファミリ名やカテゴリ名はRevitの言語によって異なる
__TODO: 詳しく書く__

# 参考リンク

https://help.autodesk.com/view/RVT/2025/JPN/?guid=GUID-BD09C1B4-5520-475D-BE7E-773642EEBD6C

https://docwiki.embarcadero.com/RADStudio/Sydney/ja/%E8%A8%80%E8%AA%9E%E3%82%AB%E3%83%AB%E3%83%81%E3%83%A3%E5%90%8D%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89%E3%80%81%E3%81%8A%E3%82%88%E3%81%B3_ISO_%E5%80%A4

https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/localization?view=aspnetcore-8.0