Redmineの label/notice/error/field/setting/permission/button メッセージに”にょ”を付加する（今のところPostgresだけ）

2019/05/18(土)に行われた、第16回redmine.tokyo勉強会で[ファーエンドテクノロジー](https://www.farend.co.jp/)の石川さんから、[redmine_message_customize](https://github.com/ishikawa999/redmine_message_customize)プラグインの発表がありました。

これはいいオモチャをいただいた！ということで、Redmineのメッセージを<font color="red">安全に</font>いじって遊ぶことにします。
出オチなので、変数や句点の不整合は無視してます。

## スクリプト

```file:redmine_nyan.sh
#!/bin/bash
#####################################################
# 環境依存値
DB_NAME=db_redmine
PG_USER=postgres
LOCALE_FILE=/opt/redmine/config/locales/ja.yml
SUFFIX="にょ"
# 固定置換用
declare -A FIX_REP
FIX_REP["button_submit"]="目からビーム"
#####################################################
PID=$$

if [ "$1" == "RESET" ]; then

cat << EOS > /tmp/${PID}.sql
UPDATE settings
   SET value=E'--- \n:custom_messages: {} \n'
 WHERE name='plugin_redmine_message_customize'
EOS

else
  IFS_BACKUP=$IFS
  IFS=$'\n'
  declare -a NOTICES=( $(grep -E '^  (label|notice|error|field|setting|permission|button)' ${LOCALE_FILE} ) )


  for NOTICE in ${NOTICES[@]}
  do
    MSG_KEY=$(echo $NOTICE | awk -F': ' '{print $1}' | sed -e 's/ //g' )
    MSG_VALUE=$(echo $NOTICE | awk -F': ' '{c="";for(i=2;i<=NF;i++) c=c $i": "; print c}' | sed -e 's/: $//g' )

    # 下のいずれでもない
    REP_PTN=0
    # 固定置換あり
    if [ "${FIX_REP[${MSG_KEY}]}" != "" ]; then
      REP_PTN=1
    fi
    # 句点を含む
    echo ${MSG_VALUE} | grep -E '。' > /dev/null
    if [ $? -eq 0 -a "${REP_PTN}" == "0" ]; then
      REP_PTN=2
    fi
    # ダブルクォートで終わる
    echo ${MSG_VALUE} | grep -E '"$' > /dev/null
    if [ $? -eq 0 -a "${REP_PTN}" == "0" ]; then
      REP_PTN=3
    fi
    # シングルクォートで終わる
    echo ${MSG_VALUE} | grep -E "'$" > /dev/null
    if [ $? -eq 0 -a "${REP_PTN}" == "0" ]; then
      REP_PTN=4
    fi
    # コロンで終わる
    echo ${MSG_VALUE} | grep -E "：$" > /dev/null
    if [ $? -eq 0 -a "${REP_PTN}" == "0" ]; then
      REP_PTN=5
    fi

    case "${REP_PTN}" in
    "0" ) MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/$/${SUFFIX}/g") ;;
    "1" ) MSG_VALUE=${FIX_REP[${MSG_KEY}]} ;;
    "2" ) MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/。/${SUFFIX}。/g") ;;
    "3" ) MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/\"$/${SUFFIX}\"/g") ;;
    "4" ) MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/'$/${SUFFIX}'/g") ;;
    "5" ) MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/：$/${SUFFIX}：   /g") ;;
    esac

    MSG_VALUE=$(echo ${MSG_VALUE} | sed -e "s/'/''/g")

    MSG+="    ${MSG_KEY}: ${MSG_VALUE}\n"
  done

cat << EOS > /tmp/${PID}.sql
UPDATE settings
   SET value=E'--- \n:custom_messages: \n  ja:\n${MSG}'
 WHERE name='plugin_redmine_message_customize'
EOS
fi

IFS=$IFS_BACKUP

sudo su - ${PG_USER} -c "psql ${DB_NAME} -f /tmp/${PID}.sql"
rm -f /tmp/${PID}.sql

sudo systemctl restart redmine
```

## 使い方

* メッセージ設定

```
./redmine_nyan.sh
```
語尾をつけるのではなく、固定で置換したい場合は```FIX_REP``` の行をコピーして増やしてください。

* メッセージ設定取消

```
./redmine_nyan.sh RESET
```

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63464/dfa2383a-cb5b-fb10-5111-2c1aa4e78acf.png)



## 注意点

- あらかじめ redmine_message_customize をインストールしておいてください。
  - redmineの再起動が必要です。
  - 「管理」→「メッセージをカスタマイズする」メニューを表示し、いったん保存してください。
     - settingsテーブルにレコードを作成するためです。
- 今のところ、PostgreSQL11でしか確認していません。
- 対象のメッセージを多くしすぎると、MySQLではTEXTカラムの64KB制限に引っかかると思います。

## 変更
- 2019/09/04
 - labelを追加したので、末尾が”：”のパターンを考慮