OCI上のWindowsサーバーに言語とシステムロケールを日本語に設定

このシリーズの他の記事は、[オラクル・クラウドの個人ブログ一覧 ](https://qiita.com/letian/items/10152a4fec813c1b7d98)からご覧いただけます。

# 初めに
Oracle Cloud Infrastructure (OCI) の Compute インスタンス作成時には、言語と地域の設定オプションがありません。そのため、インスタンス作成直後の初期状態では、システムロケールが「英語（米国）」、表示言語も英語のみに設定されています。日本語を使用するためには、言語パッケージのインストールとロケールの変更が必要です。

本記事では、Windowsサーバーを例として以下の2つの方法を紹介します：
- 手動での設定方法
- PowerShellスクリプトでの設定方法

スクリプトで環境構築を自動化したい方の参考になれば幸いです。

|No.|設定対象|設定前|設定後|Desktop|PowerShell|
|:--:|:--|:--|:--|:--|:--|
|1|タイムゾーン|UTC|日本標準時|[LINK](#1-1-タイムゾーンの設定)|[LINK](#2-1-タイムゾーンの設定)|
|2|言語|英語(米国)|日本語|[LINK](#1-2-日本語パッケージのインストールと言語表示の設定)|[LINK](#2-2-日本語パッケージのインストールと言語表示の設定)|
|3|地域|米国|日本|[LINK](#1-3-地域設定)|[LINK](#2-3-地域設定)|
|4|システム ロケール|英語(米国)|日本語(日本)|[LINK](#1-4-システム-ロケールの変更)|[LINK](#2-4-システム-ロケールの変更)|
|5|ようこそ画面|なし|ようこそ画面<br>に設定をコピー|[LINK](#1-5-ようこそ画面に設定をコピー)|N/A|

**検証環境**
- インスタンス・イメージ：
  - Windows Server <font color=blue>2019</font> Standard
  - Windows Server <font color=blue>2022</font> Standard
- インスタンス・シェープ：1 OCPU, 12 GBメモリ

※、本記事の内容は、OCI上の Windows Server 2019および2022の両方に対応しています。

**目次**
- [1. デスクトップ上の設定](#1-デスクトップ上の設定)
  - [1-1. タイムゾーンの設定](#1-1-タイムゾーンの設定)
  - [1-2. 日本語パッケージのインストールと言語表示の設定](#1-2-日本語パッケージのインストールと言語表示の設定)
  - [1-3. 地域設定](#1-3-地域設定)
  - [1-4. システム ロケールの変更](#1-4-システム-ロケールの変更)
  - [1-5. ようこそ画面に設定をコピー](#1-5-ようこそ画面に設定をコピー)
- [2. PowerShellでの設定](#2-powershellでの設定)
  - [2-1. タイムゾーンの設定](#2-1-タイムゾーンの設定)
  - [2-2. 日本語パッケージのインストールと言語表示の設定](#2-2-日本語パッケージのインストールと言語表示の設定)
  - [2-3. 地域設定](#2-3-地域設定)
  - [2-4. システム ロケールの変更](#2-4-システム-ロケールの変更)

# 1. デスクトップ上の設定
## 1-1. タイムゾーンの設定
Windowsインスタンスが作成された後、タイムゾーンは<strong>UTC</strong>になります。

現在のタイムゾーンを表示：`tzutil /g`
全てのタイムゾーンを表示：`tzutil /l`

コマンド・プロンプトで現在タイムゾーンを表示：（管理者権限は不要）
```
C:\Users\opc>tzutil /g
UTC
C:\Users\opc>tzutil /l
...略...
(UTC+09:00) Osaka, Sapporo, Tokyo
Tokyo Standard Time
...略...
```

タイムゾーンを変更する場合は、<font color=blue>管理者権限</font>が必要です。
日本標準時(Japan Stand Time)に設定：
```
C:\Windows\system32>tzutil /s "Tokyo Standard Time"

C:\Windows\system32>tzutil /g
Tokyo Standard Time
C:\Windows\system32>
```

## 1-2. 日本語パッケージのインストールと言語表示の設定
※、事前準備として、インターネット接続環境を確保してください。

タスクバーにある検索ボックスに 「language」 と入力し、表示される検索結果から 「language settings」 を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7bf2f7ae-0ee3-465b-ba7d-ea4cc2527010.png", width="350">

"Language"のページに、"Add a language"をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/cf5235af-13b6-460e-8df3-5aa98bde88a1.png", width="600">

リストから「日本語」を選択し、「次へ」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/02e71179-ba79-4cc7-96a4-90701b8750a5.png", width="300">

デフォルトでは「言語パックのインストール」、「音声読み上げ（Text-to-Speech）」および「手書き入力」が選択されていますが、この例では、以下のように選択してインストールを開始します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ce09404e-9f1d-4d69-823c-cf6bcd50d338.png", width="300">

インストールが完了するまで、しばらくお待ちください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/908a2828-b6c9-4dd0-b72d-5f51d4c33942.png", width="600">

完了後、日本語が既定の表示言語となり、次回サインイン時から有効になります（サーバーの再起動は不要です）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/95e63f30-2298-4844-b614-37cdadbb77de.png", width="600">

## 1-3. 地域設定
サイイン後、表示言語が日本語になっています。タスクバーにある検索ボックスに 「region」 と入力し、表示される検索結果から 「地域の設定」 を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/63718bdf-d818-4709-a480-53ebe673f902.png", width="250">

デフォルトの設定は、米国です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/1e9b1388-d614-4b33-ab9d-e5ae52bd6c8b.png", width="550">

リストから、日本を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/761cee9f-4714-4942-b0dd-e29192c9e425.png", width="350">

## 1-4. システム ロケールの変更
現在、日本語表示になっていますが、この時点ではシステムロケールがまだ変更されていないため、コマンドプロンプト内の表示は英語のままです。引き続き、システムロケールの変更を行ってください。

地域設定画面の一番下にある「日付、時刻、地域の追加設定」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/1fbd8e0f-4682-4c73-98e6-f7837e75b5cf.png", width="500">

コントロールパネル → 時計と地域 → 「日付、時刻、数値形式の変更」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/4600044f-2c55-4654-ae9f-f9494e0615d8.png", width="550">

「管理」タブで「システム ロケールの変更」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e3ef827f-eca4-4da0-8979-882eccea4443.png", width="400">

現在のシステム ロケールは「英語（米国）」です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a619ae8a-70f4-908d-780c-5ce78aa1107e.png", width="350">

リストから「日本語（日本）」を選択し、「OK」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f489d79b-5162-91f3-4c97-4697046d4836.png", width="350">

変更を有効にするには、再起動が必要です。Windowsインスタンスの再起動は、サーバー側ではなくOCIコンソールから実施することを推奨します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/766602a0-5efe-dc44-de0c-f0be895fccf0.png", width="300">

再起動後、コマンドプロンプトを開き、日本語が正しく表示されることを確認してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a8605683-ca11-4d21-8346-663688b46802.png", width="500">

## 1-5. ようこそ画面に設定をコピー
コントロールパネル → 時計と地域 → 「日付、時刻、数値形式の変更」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7e6307a1-5b3c-1f5b-7f98-5f6bc91de4f1.png", width="500">

「管理」タブで「設定のコピー」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/095448ac-2067-bbbb-76fe-607a352b7d7e.png", width="400">

「ようこそ画面とシステム アカウント」にチェックを入れ、「OK」ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c5d026df-236c-a4d8-f06d-a83169a327da.png", width="400">

設定の変更後は、再起動が必要です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/766602a0-5efe-dc44-de0c-f0be895fccf0.png", width="300">

再起動後、ようこそ画面が日本語で表示されるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2b500db0-a786-167c-bda9-2bfe6b72cfcf.png", width="400">

# 2. PowerShellでの設定
## 2-1. タイムゾーンの設定
タイムゾーンの取得：`Get-TimeZone`
タイムゾーンの変更：`Set-TimeZone -Id "Tokyo Standard Time"`  (<font color=blue>管理者権限</font>が必要)

```powershell
PS C:\Windows\system32> Get-TimeZone


Id                         : UTC
DisplayName                : (UTC) 協定世界時
StandardName               : 協定世界時
DaylightName               : 協定世界時
BaseUtcOffset              : 00:00:00
SupportsDaylightSavingTime : False



PS C:\Windows\system32> Set-TimeZone -Id "Tokyo Standard Time"
PS C:\Windows\system32> Get-TimeZone


Id                         : Tokyo Standard Time
DisplayName                : (UTC+09:00) 大阪、札幌、東京
StandardName               : 東京 (標準時)
DaylightName               : 東京 (夏時間)
BaseUtcOffset              : 09:00:00
SupportsDaylightSavingTime : False



PS C:\Windows\system32>
```

## 2-2. 日本語パッケージのインストールと言語表示の設定
### コマンドの利用制限

::: note warn
`Install-Language ja-JP` は <strong>Windows 11</strong> では利用可能ですが、OCI上の Windows Server 2019 および 2022 ではインストールされていないため、使用できません。
<strong>Install-Language</strong> 利用可能かどうかを確認するには、以下のコマンドを実行してください。何も返されない場合は、未インストールです。
:::

Windows Server 2019 と 2022 の出力結果：未インストール
```powershell
PS C:\Windows\system32> get-command -Module LanguagePackManagement
PS C:\Windows\system32>
```

Windows 11 の出力結果：インストール済
```powershell
PS C:\WINDOWS\system32> get-command -Module LanguagePackManagement

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Get-Language                                       1.0        LanguagePackManagement
Alias           Get-PreferredLanguage                              1.0        LanguagePackManagement
Alias           Get-SystemLanguage                                 1.0        LanguagePackManagement
Alias           Set-PreferredLanguage                              1.0        LanguagePackManagement
Alias           Set-SystemLanguage                                 1.0        LanguagePackManagement
Cmdlet          Get-InstalledLanguage                              1.0        LanguagePackManagement
Cmdlet          Get-SystemPreferredUILanguage                      1.0        LanguagePackManagement
Cmdlet          Install-Language                                   1.0        LanguagePackManagement
Cmdlet          Set-SystemPreferredUILanguage                      1.0        LanguagePackManagement
Cmdlet          Uninstall-Language                                 1.0        LanguagePackManagement

PS C:\WINDOWS\system32>
```

### 回避策 -  Windows Server 2019 の場合
公式サイトからISOイメージをダウンロードし、言語パッケージをインストールしてください（インターネット接続が必要です）。


- イメージファイル名：`17763.1.180914-1434.rs5_release_SERVERLANGPACKDVD_OEM_MULTI.iso`
- サイズ：約 2.6 GB
- 一時保存先：`C:\Users\opc\Downloads` (任意の場所)
- 言語パッケージのフルパス：`D:\x64\langpacks\Microsoft-Windows-Server-Language-Pack_x64_ja-jp.cab`

**PowerShellスクリプト**
```powershell
# Install Japanese Language Pack in Windows Server 2019 Standard (OCI Compute Instance)

${iso_path} = "https://software-download.microsoft.com/download/pr/"
${iso_file} = "17763.1.180914-1434.rs5_release_SERVERLANGPACKDVD_OEM_MULTI.iso"
${iso_url} = ${iso_path} + ${iso_file}
${download_file} = $home + "\Downloads\" + ${iso_file}

# Download ISO image
$ProgressPreference = 'SilentlyContinue' # Disable process bar, to save download time
Invoke-WebRequest -Uri ${iso_url} -OutFile ${download_file}

# Mount disk image
Mount-DiskImage ${download_file}

# Install the language pack (ja-JP)
${cab_file} = "D:\x64\langpacks\Microsoft-Windows-Server-Language-Pack_x64_ja-jp.cab"
lpksetup /i ja-JP /p ${cab_file}

# Set UI Language to Japanese
Set-WinUserLanguageList ja-JP,en-US -Force
```

__関連コマンドの解説__
| コマンド | 用途 | レファレンス |
|:-|:-|:-:|
| Invoke-WebRequest |ファイルのダウンロード |[リンク](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7.5)|
| Mount-DiskImage |ディスクイメージのマウント |[リンク](https://learn.microsoft.com/en-us/powershell/module/storage/mount-diskimage?view=windowsserver2022-ps)|
|lpksetup |言語パッケージのインストール|[リンク](https://learn.microsoft.com/en-us/previous-versions//dn898585(v=vs.85))|
|Set-WinUserLanguageList|表示言語の設定|[リンク](https://learn.microsoft.com/en-us/powershell/module/international/set-winuserlanguagelist?view=windowsserver2022-ps)|


- **ディスクイメージのマウント**
コマンド：`Mount-DiskImage <ISO_File_Full_Path>`
```powershell
PS C:\Windows\system32> # Mount disk image
PS C:\Windows\system32> Mount-DiskImage ${download_file}


Attached          : True
BlockSize         : 0
DevicePath        : \\.\CDROM0
FileSize          : 2831929344
ImagePath         : C:\Users\opc\Downloads\17763.1.180914-1434.rs5_release_SERVERLANGPACKDVD_OEM_MULTI.iso
LogicalSectorSize : 2048
Number            : 0
Size              : 2831929344
StorageType       : 1
PSComputerName    :



PS C:\Windows\system32>
```
マウント後、ファイルエクスプローラーには次のように表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3fbbee1f-8fda-4b87-bc67-f90f81ddc7e0.png", width="600">

- **言語パッケージのインストール**
コマンド：`lpksetup /i ja-JP /p <言語パッケージのパス>`
上記を実行すると、次の画面が表示されます。インストールが完了するまで、しばらくお待ちください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5b630510-1a2e-4fb2-88c7-3b68279dbec3.png", width="450">
※、完了後、画面は自動的に閉じられます。lpksetupが完了した時点では、日本語はまだ表示言語になっていませんので、引き続き次のステップを実行してください。
※、lpksetupコマンドの他のオプション：
  - `-r`: 操作が完了した後に再起動を抑制する。
  - `-f`: 再起動する必要がある場合、他のユーザーがコンピュータにログオンしていても強制的に再起動する。
  - `-s`: GUIが抑制され、サイレントモードで操作を行う。
  - `-u`: 言語パッケージをアンインストールする。

- **日本語表示の設定**
コマンド：`Set-WinUserLanguageList ja-JP,en-US -Force`
コマンドが完了すると、次のように日本語が表示言語と設定されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d68e5331-dd0e-467c-9496-1f71a66f6dae.png", width="550">
詳細画面を見ると、言語パッケージのみがインストールされています。その他のオプションをインストールしたい場合は、手動で行ってください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/6cf46742-aa50-4974-a8ad-3dfe0ec7af76.png", width="300">

※、設定完了後、次回サインイン時から有効になります（サーバーの再起動は不要です）

### 回避策 -  Windows Server 2022 の場合
公式サイトからISOイメージをダウンロードし、言語パッケージをインストールしてください。
- イメージファイル名：`20348.1.210507-1500.fe_release_amd64fre_SERVER_LOF_PACKAGES_OEM.iso`
- サイズ：約 5.7 GB
- 一時保存先：`C:\Users\opc\Downloads` (任意の場所)
- 言語パッケージのフルパス：`D:\LanguagesAndOptionalFeatures\Microsoft-Windows-Server-Language-Pack_x64_ja-jp.cab`

:::note
サイズが大きいため、ダウンロード前に十分なディスク領域を確保しておいてください。
:::

**PowerShellスクリプト**
```powershell
# Install Japanese Language Pack in Windows Server 2022 Standard (OCI Compute Instance)

${iso_url} = "https://go.microsoft.com/fwlink/p/?linkid=2195333"
${iso_file} = "20348.1.210507-1500.fe_release_amd64fre_SERVER_LOF_PACKAGES_OEM.iso"
${download_file} = $home + "\Downloads\" + ${iso_file}

# Download ISO image
$ProgressPreference = 'SilentlyContinue' # Disable process bar, to save download time
Invoke-WebRequest -Uri ${iso_url} -OutFile ${download_file}

# Mount disk image
Mount-DiskImage ${download_file}

# Install the language pack (ja-JP)
${cab_file} = "D:\LanguagesAndOptionalFeatures\Microsoft-Windows-Server-Language-Pack_x64_ja-jp.cab"
lpksetup /i ja-JP /p ${cab_file}

# Set UI Language to Japanese
Set-WinUserLanguageList ja-JP,en-US -Force
```
実行結果の詳細を省略します。

コマンド`Set-WinUserLanguageList`が完了すると、日本語が既定の表示言語となり、次回サインイン時から有効になります（サーバーの再起動は不要です）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/4a0f5201-902d-4dfe-b5af-73af0dc1cdc3.png", width="550">


## 2-3. 地域設定
国（地域）の設定：`Set-WinHomeLocation -GeoID 122` （日本のGeoIDは<font color=blue>122</font>です） 
地域フォーマットの設定：`Set-Culture ja-JP`

```powershell
PS C:\Windows\system32> Set-WinHomeLocation -GeoID 122
PS C:\Windows\system32> Get-WinHomeLocation

GeoId HomeLocation
----- ------------
  122 日本


PS C:\Windows\system32> Set-Culture ja-JP
PS C:\Windows\system32> Get-Culture

LCID             Name             DisplayName
----             ----             -----------
1041             ja-JP            日本語 (日本)


PS C:\Windows\system32>
```

## 2-4. システム ロケールの変更
コマンド：`Set-WinSystemLocale ja-JP`

※、<font color=blue>管理者</font>として実行してください。
※、システムロケールの変更後は、再起動が必要です。

```powershell
PS C:\Windows\system32> Get-WinSystemLocale

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)


PS C:\Windows\system32> Set-WinSystemLocale ja-JP
PS C:\Windows\system32>
```

**ようこそ画面にロケール設定をコピー**
※、次のコマンドレットは、<strong>Windows 11</strong> には含まれていますが、OCI上の Windows Server 2019 および 2022 には含まれていません。そのため、Windows Server 2022 で設定を行いたい場合は、[STEP 1-5](#1-5-ようこそ画面に設定をコピー)を参照して、手動で実行してください。
```powershell
Copy-UserInternationalSettingsToSystem -WelcomeScreen $True -NewUser $True
```

お使いの環境でこのコマンドレットが利用可能かどうかを確認するには、次のコマンドを実行してください。
```powershell
Get-Command -Module International
```


以上

----
__参考資料__
[Windows  PowerShell  Reference - International](https://learn.microsoft.com/en-us/powershell/module/international/?view=windowsserver2022-ps)
[Cannot configure a language pack for Windows Server 2019 Desktop Experience](https://learn.microsoft.com/en-us/troubleshoot/windows-server/shell-experience/cannot-configure-language-pack-windows-server-desktop-experience)