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

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 '^ (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

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") ;;
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



使い方


  • メッセージ設定

./redmine_nyan.sh

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


  • メッセージ設定取消

./redmine_nyan.sh RESET


結果

image.png


注意点


  • あらかじめ redmine_message_customize をインストールしておいてください。


    • redmineの再起動が必要です。

    • 「管理」→「メッセージをカスタマイズする」メニューを表示し、いったん保存してください。


      • settingsテーブルにレコードを作成するためです。





  • 今のところ、PostgreSQL11でしか確認していません。

  • 対象のメッセージを多くしすぎると、MySQLではTEXTカラムの64KB制限に引っかかると思います。