A long-lived project that still receives updates
Client for the CopyTuner copy management service
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

>= 0
>= 0
>= 0
~> 8.0
>= 0

Runtime

>= 0.5.0
>= 0
 Project Readme

CopyTuner Client

Build Status

Getting started

Add it to your Gemfile

gem 'copy_tuner_client'

Create config/initializers/copy_tuner.rb

CopyTunerClient.configure do |config|
  config.api_key = 'YOUR-API-KEY'
  config.project_id = 77
  config.host = 'COPY-TUNER-HOST-NAME'

  # I18n keys and messages will be sent to server if the locale matches
  config.locales = [:ja, :en]
end

CopyTunerの翻訳ファイルをymlとして出力する

該当のRailsプロジェクトで下記のrakeを実行する

bundle exec rake copy_tuner:export

これで、config/locales/copy_tuner.yml に翻訳ファイルが作成されます。

特定のキーをローカル YAML 優先にする(段階移行)

config.local_first_key_regexp を設定すると、locale を除いたキー(例 views.foo.bar)がその正規表現にマッチした場合、CopyTuner サーバのキャッシュをスキップして、ローカルの config/locales/*.ymlI18n::Backend::Simple)を優先的に参照します。

CopyTunerClient.configure do |config|
  # ...
  # views.* で始まるキーはローカル YAML を優先する
  config.local_first_key_regexp = /\Aviews\./
end

CopyTuner で一元管理している翻訳を、views.* のような単位で段階的にローカル YAML へ移行するためのオプションです。

  • マッチしたキーは CopyTuner キャッシュを一切参照せず、ローカル YAML のみを引きます(完全分離)。
  • ローカル YAML にも存在しない場合は未訳(nil / MissingTranslation)となります。CopyTuner へのフォールバックや新規キーのアップロードは行いません。これにより移行漏れを未訳として検知できます。
  • マッチしたキーには、ビューヘルパー(t / translate)および SimpleForm のラベルで CopyRay オーバーレイマーカー(<!--COPYRAY key-->)を注入しません。これらのキーは CopyTuner 上で編集できないため、編集可能だと誤認させないためです。

Rails 標準の数値フォーマットキーは常にローカル優先(組み込み)

local_first_key_regexp の設定有無にかかわらず、以下の Rails 標準キーは常にローカル YAML 優先になります(CopyTuner をバイパス)。

  • number.format / number.currency.format / number.percentage.format / number.human.format(およびその配下)

これらは precision(整数)や significant / strip_insignificant_zeros(真偽値)といった非文字列値を含みます。CopyTuner は文字列値しか保持できないため、経由するとこれらが欠落し、number_to_currency などが意図しない表示(小数桁数や記号の崩れ)になります。これを防ぐため gem 側で固定的にローカル優先にしています。

アプリ独自の number.* キー(例 number.gift_amount)は対象外で、従来どおり CopyTuner で管理できます。

Middleware の挿入位置

CopyTuner は開発環境で RequestSync / CopyrayMiddleware を Rack の middleware スタックに挿入します。RequestSync はリクエスト毎に CopyTuner サーバと同期し、CopyrayMiddleware はページ内のマーカー(⟦CT:key⟧)を除去・変換します。

挿入位置は自動で決まるため、通常は設定不要です。Devise(Warden)を使っているアプリでは Warden::Manager の直前、それ以外の環境ではスタック末尾に挿入されます。

Devise 併用時に Warden の直前へ寄せるのは throw :warden の挙動に対応するためです。throw :wardenWarden::Managercatch(:warden) までスタックを巻き戻すため、CopyTuner の middleware が Warden より内側にあると、認証エラー時のレスポンス(Devise::FailureApp が返す HTML)を受け取れず、Copyray のマーカーがページに残ってしまいます。

位置を変えたい場合は config.middleware_position{ before: SomeMiddleware } または { after: SomeMiddleware } を指定すると、このデフォルトを上書きできます。

CopyTunerClient.configure do |config|
  # ...
  config.middleware_position = { after: Rack::Runtime }
end

指定した middleware がスタックに存在しない場合、Rails の起動時に例外(No such middleware to insert before: ... / ... insert after: ...)が発生します。

Claude Code スキル

skills/ 以下に Claude Code 向けのスキルが含まれています。

gh skill install SonicGarden/copy-tuner-ruby-client <スキル名> --scope project

copy-tuner スキル

i18n キーの操作を支援するスキルです。翻訳キーの検索・登録・確認などの依頼に自動的に使用されます。

詳細: skills/copy-tuner/SKILL.md

copy-tuner-to-locales-migrate-prefix スキル

copy_tuner が集中管理する i18n キーを、prefix(正規表現)単位で config/locales のローカル YAML 管理へ移行するスキルです。gem は残したまま特定 prefix だけをローカル化する「部分ローカル化」と、全 prefix を移して完全撤去する「全移行」の両方に使えます。明示的に呼び出したときのみ動作します。

詳細: skills/copy-tuner-to-locales-migrate-prefix/SKILL.md

copy-tuner-to-locales-cleanup スキル

copy-tuner-to-locales-migrate-prefix で全 prefix の移行が完了した後に、gem・初期化子・CI・deploy・ドキュメント・MCP 設定を一括撤去し、copy_tuner 依存を完全に取り除くスキルです。明示的に呼び出したときのみ動作します。

詳細: skills/copy-tuner-to-locales-cleanup/SKILL.md

copy-tuner-to-t-migrate スキル

copy_tuner_client v2.0.0 で削除された独自ヘルパー tt の呼び出しを、Rails 標準の ttranslate)へ置換するスキルです。機械的に安全な箇所は一括変換し、文字列加工や label の第一引数に渡している箇所は 1 件ずつ確認しながら置換します。破壊的な一括書き換えを含むため、明示的に呼び出したときのみ動作します。

詳細: skills/copy-tuner-to-t-migrate/SKILL.md

Development

クライアント用コード

src以下を編集してください。 app/assets/*を直接編集したらダメよ!

Node.js と pnpm は mise で管理しています(mise install でセットアップ)。

$ pnpm install   # 依存インストール
$ pnpm dev       # 開発時
$ pnpm build     # ビルド
$ pnpm check     # Lint + Format(Biome)

Spec

default spec

$ bundle exec rspec

release gem

$ bundle exec rake build      # build gem to pkg/ dir
$ bundle exec rake install    # install to local gem
$ bundle exec rake release    # release gem to rubygems.org