Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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

スクリプト

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

注意点

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

変更

  • 2019/09/04
    • labelを追加したので、末尾が”:”のパターンを考慮
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away