Site Kit by Google for WordPress を日本語に戻す（スクリプト付き）

WordPressのプラグイン「Site Kit by Google」を更新すると表記が英語になってしまいます。
これを日本語に戻す方法を説明します。後半に自動化するスクリプトがあります。

![site_kit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55550/5bf16256-389d-9839-1584-af2035d51329.png)

:::note info
一般の人はファイルマネージャーかFTPクライアントを利用する方法でやってください。分かる人はシェルで。
:::

# ファイルマネージャーかFTPクライアントを利用

1. 翻訳ファイルをダウンロード
   ブラウザで[言語パックの一覧](https://translate.wordpress.org/projects/wp-plugins/google-site-kit/language-packs/)ページを開き、Japaneseのzipファイルをダウンロードします。
1. ダウンロードしたzipファイルを展開
   ダウンロードしたzipファイルを任意のフォルダに展開します。
1. レンタルサーバーのファイルマネージャーかFTPクライアントで`（WordPressディレクトリ）/wp-content/languages/plugins/`を開きます。
1. 展開したファイルをアップロードします。
1. 完了
   Site Kitの表記は日本語に戻っています。
   
   > 気になる人は、`google-site-kit-ja-07ec685b783960660a163bf261d52602.json`といった旧いファイルを削除してもよいでしょう。

# シェルを利用

1. 翻訳プラグインのディレクトリに移動
   ```shell-session
   cd （WordPressディレクトリ）/wp-content/languages/plugins
   ```
1. 翻訳ファイルをダウンロード
   ```shell-session
   wget -qO- "https://translate.wordpress.org/projects/wp-plugins/google-site-kit/language-packs/" | \
   grep -o 'https://downloads.wordpress.org/[^"]*/ja.zip' | \
   xargs wget
1. ファイルを展開
   ```shell-session
   unzip -o ja.zip
   ```
1. ダウンロードしたファイルを削除
   ```shell-session
   rm -f ja.zip
   ```
1. 古い翻訳ファイルを削除する（任意）
   ```shell-session
   # 対象のファイルを確認（1日以前）
   find . -name "google-site-kit-ja-*.json" -mtime +2 -print | xargs ls -lh

   # 対象のファイルを削除
   find . -name "google-site-kit-ja-*.json" -mtime +2 -exec rm {} \;
   ```
1. 完了
   Site Kitの表記は日本語に戻っています。

# Google Site Kit 翻訳ファイルの自動更新スクリプト

ここまで、手動で更新する方法について書きました。
その過程を自動化する PowerShell スクリプトを作成しました。

## 更新の背景

- 複数のサイトを管理している場合、手動更新は時間がかかる
- 自動化により、更新作業の効率化と人為的ミスの削減が可能に

## スクリプトの概要

このスクリプトは以下の機能を提供します：

1. WordPress.org から最新の Google Site Kit 日本語翻訳ファイルをダウンロード
2. FTP または SSH を使用して、指定された複数のサイトに接続
3. 各サイトの既存の翻訳ファイルを削除
4. 新しい翻訳ファイルをアップロード

## 使用上の注意

- このスクリプトは PowerShell で書かれています。Windows 10 以降または PowerShell Core がインストールされている環境で動作します。（PowerShell Core は Windows、macOS、Linux で利用可能です。）
- FTP と SSH の両方の接続方法に対応しているため、さまざまなホスティング環境で使用可能です。

## 非 Windows 環境でのスクリプト実行
`System.Net.FtpClient` を利用するか、`lftp` や `scp` を利用するようにスクリプトを書き換える必要があります。

`System.Net.FtpClient` のインストール:
```powershell
Install-Module -Name System.Net.FtpClient -Scope CurrentUser
```
`lftp` をインストール:
```shell
sudo apt-get install lftp
```

## スクリプトの使い方

1. スクリプト内の接続情報を自分の環境に合わせて変更します。
   - FTP ホスト、ユーザー名、パスワード
   - SSH ホスト、ユーザー名、秘密鍵のパス
2. `$sites` 配列内のサイト情報を自分が管理するサイトの情報に更新します。
3. PowerShell を開き、スクリプトを実行します。

## 最後に

このスクリプトにより、Google Site Kit の翻訳ファイル更新作業が大幅に効率化されます。皆さんの管理作業の助けになれば幸いです。

質問やフィードバックがありましたら、コメント欄でお知らせください。

### Site Kit 自動更新スクリプト

```powershell:PowerShell
# Google Site Kit翻訳ファイル 複数サイト順次更新スクリプト

# FTP接続情報
$ftpHost1 = "your_host.example.com"
$ftpUser1 = "your_username"
$ftpPass1 = "your_password"

# SSH接続情報
$sshHost1 = "your_host.example.com"
$sshUser1 = "your_username"
$sshKeyPath1 = "C:\Path\To\Your\SSH\Key"

# サイト情報
$sites = @(
    @{
        Name = "site1"
        Type = "FTP"
        HostName = $ftpHost1
        User = $ftpUser1
        Pass = $ftpPass1
        Path = "www/site1/wp-content/languages/plugins/"
    },
    @{
        Name = "site2"
        Type = "SSH"
        HostName = $sshHost1
        User = $sshUser1
        KeyPath = $sshKeyPath1
        Path = "/home/username/site2/wp-content/languages/plugins"
    }
)

# FTP接続の準備
function Get-FtpWebClient {
    param (
        [string]$user,
        [string]$pass
    )
    $webclient = New-Object System.Net.WebClient
    $webclient.Credentials = New-Object System.Net.NetworkCredential($user, $pass)
    return $webclient
}

# 既存のGoogle Site Kit翻訳ファイルを削除する関数 (FTP)
function Remove-ExistingTranslationFilesFTP {
    param (
        [string]$hostName,
        [string]$user,
        [string]$pass,
        [string]$path
    )
    $ftpUrl = "ftp://${hostName}/${path}"
    $webclient = Get-FtpWebClient -user $user -pass $pass
    try {
        $listRequest = [System.Net.FtpWebRequest]::Create($ftpUrl)
        $listRequest.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectory
        $listRequest.Credentials = $webclient.Credentials
        $listResponse = $listRequest.GetResponse()
        $streamReader = New-Object System.IO.StreamReader($listResponse.GetResponseStream())
        $directoryList = $streamReader.ReadToEnd()
        $files = $directoryList -split "`r`n"

        foreach ($file in $files) {
            if ($file -like "google-site-kit-ja*") {
                try {
                    $deleteRequest = [System.Net.FtpWebRequest]::Create($ftpUrl + $file)
                    $deleteRequest.Method = [System.Net.WebRequestMethods+Ftp]::DeleteFile
                    $deleteRequest.Credentials = $webclient.Credentials
                    $deleteResponse = $deleteRequest.GetResponse()
                    Write-Host "削除成功 (FTP $path): $file"
                    $deleteResponse.Close()
                }
                catch {
                    Write-Host "エラー (FTP $path): $file の削除中にエラーが発生しました: $($_.Exception.Message)"
                }
            }
        }
    }
    catch {
        Write-Host "エラー (FTP $path): ファイル一覧の取得中にエラーが発生しました。"
        Write-Host $_.Exception.Message
    }
}

# 既存のGoogle Site Kit翻訳ファイルを削除する関数 (SSH)
function Remove-ExistingTranslationFilesSSH {
    param (
        [string]$hostName,
        [string]$user,
        [string]$keyPath,
        [string]$path
    )
    $sshCommand = "find $path -name 'google-site-kit-ja*' -type f -delete"
    $result = ssh -i $keyPath "${user}@${hostName}" $sshCommand 2>&1
    if ($LASTEXITCODE -eq 0) {
        Write-Host "削除成功 (SSH $path): 既存の翻訳ファイルを削除しました。"
    } else {
        Write-Host "エラー (SSH $path): 既存の翻訳ファイルの削除中にエラーが発生しました。"
        Write-Host $result
    }
}

# 新しい翻訳ファイルをアップロードする関数 (FTP)
function Send-TranslationFilesFTP {
    param (
        [string]$hostName,
        [string]$user,
        [string]$pass,
        [string]$path,
        [string]$tempDir
    )
    $ftpUrl = "ftp://${hostName}/${path}"
    $webclient = Get-FtpWebClient -user $user -pass $pass
    Get-ChildItem -Path $tempDir -File | ForEach-Object {
        try {
            $uri = New-Object System.Uri($ftpUrl + $_.Name)
            $webclient.UploadFile($uri, $_.FullName)
            Write-Host "アップロード成功 (FTP $path): $($_.Name)"
        }
        catch {
            Write-Host "エラー (FTP $path): $($_.Name) のアップロードに失敗しました。"
            Write-Host $_.Exception.Message
        }
    }
}

# 新しい翻訳ファイルをアップロードする関数 (SSH)
function Send-TranslationFilesSSH {
    param (
        [string]$hostName,
        [string]$user,
        [string]$keyPath,
        [string]$path,
        [string]$tempDir
    )
    $files = Get-ChildItem -Path $tempDir -File
    foreach ($file in $files) {
        $result = scp -i $keyPath $file.FullName "${user}@${hostName}:$path" 2>&1
        if ($LASTEXITCODE -eq 0) {
            Write-Host "アップロード成功 (SSH $path): $($file.Name)"
        } else {
            Write-Host "エラー (SSH $path): $($file.Name) のアップロードに失敗しました。"
            Write-Host $result
        }
    }
}

# 翻訳ファイルをダウンロードする関数
function Get-TranslationFiles {
    $tempDir = New-Item -ItemType Directory -Force -Path "$env:TEMP\google-site-kit-translation"
    try {
        $webPage = Invoke-WebRequest -Uri "https://translate.wordpress.org/projects/wp-plugins/google-site-kit/language-packs/"
        $downloadUrl = $webPage.Links | Where-Object { $_.href -like "*ja.zip" } | Select-Object -First 1 -ExpandProperty href
        $zipPath = Join-Path $tempDir "ja.zip"
        Invoke-WebRequest -Uri $downloadUrl -OutFile $zipPath
        Expand-Archive -Path $zipPath -DestinationPath $tempDir -Force
        Remove-Item -Path $zipPath -Force
        return $tempDir
    }
    catch {
        Write-Host "エラー: 翻訳ファイルのダウンロード中にエラーが発生しました。"
        Write-Host $_.Exception.Message
        return $null
    }
}

# メイン処理
$tempDir = Get-TranslationFiles
if ($null -ne $tempDir) {
    foreach ($site in $sites) {
        Write-Host "サイト $($site.Name) の処理を開始します..."

        Write-Host "既存の翻訳ファイルを削除しています..."
        if ($site.Type -eq "FTP") {
            Remove-ExistingTranslationFilesFTP -hostName $site.HostName -user $site.User -pass $site.Pass -path $site.Path
        } else {
            Remove-ExistingTranslationFilesSSH -hostName $site.HostName -user $site.User -keyPath $site.KeyPath -path $site.Path
        }

        Write-Host "新しい翻訳ファイルをアップロードしています..."
        if ($site.Type -eq "FTP") {
            Send-TranslationFilesFTP -hostName $site.HostName -user $site.User -pass $site.Pass -path $site.Path -tempDir $tempDir
        } else {
            Send-TranslationFilesSSH -hostName $site.HostName -user $site.User -keyPath $site.KeyPath -path $site.Path -tempDir $tempDir
        }

        Write-Host "サイト $($site.Name) の処理が完了しました。"
        Write-Host "----------------------------------------"
    }
    # 一時ディレクトリの削除
    Remove-Item -Path $tempDir -Recurse -Force
    Write-Host "すべての処理が完了しました。"
}
else {
    Write-Host "翻訳ファイルのダウンロードに失敗したため、処理を中止します。"
}
```