diff --git a/audiogame-manager.sh b/audiogame-manager.sh index ab56c7c..a306a24 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -739,8 +739,11 @@ game_launcher() { if [[ "$game" =~ laser-breakout ]]; then pgrep -u "$USER" nvda2speechd &> /dev/null || ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd & fi - if [[ "$game" =~ ^bokurano-daibouken\||bokurano-daibouken-2\| ]]; then - "${0%/*}/speech/clipboard_translator.sh" play.exe & + if [[ "$game" =~ ^bokurano-daibouken-2\| ]]; then + "${0%/*}/speech/clipboard_translator.sh" play.exe bokurano-daibouken2 & + fi + if [[ "$game" =~ ^bokurano-daibouken\| ]]; then + "${0%/*}/speech/clipboard_translator.sh" play.exe bokurano-daibouken & fi if [[ "$game" =~ shadow-line ]]; then find "${WINEPREFIX}/drive_c/" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; diff --git a/speech/clipboard_translator.sh b/speech/clipboard_translator.sh index 3445913..4122723 100755 --- a/speech/clipboard_translator.sh +++ b/speech/clipboard_translator.sh @@ -1,54 +1,77 @@ #!/usr/bin/env bash -cleanup() { - sort -uo "$dictionaryFile" "$dictionaryFile" -} +# Modified from the script at: +# https://gist.github.com/fdietze/6768a0970d7d732b7fbd7930ccceee2a -trap cleanup EXIT +set -Eeuo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/#:~:text=set%20%2Du,is%20often%20highly%20desirable%20behavior. +shopt -s expand_aliases -# Clear the clipboard so you don't accidently send personal info to the translator. -echo "" | xclip -d "${DISPLAY:-:0}" -selection clipboard 2> /dev/null -export dictionaryFile="${XDG_CONFIG_HOME:-$HOME/.config}/storm-games/audiogame-manager/translations.txt" -if [[ ! -r "$dictionaryFile" ]]; then - touch "$dictionaryFile" -fi -if [[ $# -ne 1 ]]; then - echo "Usage: $0 application name." +if [[ $# -ne 2 ]]; then + echo "Usage: $0 \"application name\" \"file name\"." + exit 1 fi # Wait for the application to start while ! pgrep -u "$USER" ^$1 &> /dev/null ; do sleep 0.05 done + +fileName="${2,,}" +fileName="${fileName//[[:space:]]/-}.sqlite" +translationFile="${XDG_CACHE_HOME:-$HOME/.cache}/audiogame-manager/${fileName}" # Read so long as the application is running while pgrep -u "$USER" ^$1 &> /dev/null ; do - newText="" - translatedText="" - newText="$(xclip -d "${DISPLAY:-:0}" -selection clipboard -o 2> /dev/null)" - sleep 0.01 - if [[ "${#newText}" -lt 1 ]]; then - continue - fi - if [[ "${newText}" =~ ^[0-9A-Za-z[:space:][:punct:]]+$ ]]; then - spd-say -- "$newText" + sleep 0.05 + text="$(xclip -d "${DISPLAY:-:0}" -selection clipboard -o 2> /dev/null)" + if [[ "${text}" =~ ^[0-9A-Za-z[:space:][:punct:]]+$ ]]; then + spd-say -- "$text" echo "" | xclip -d "${DISPLAY:-:0}" -selection clipboard 2> /dev/null continue fi - export newText - translatedText="$(awk -v originalText="${newText})==:" 'BEGIN { exitCode = 1; FS = "\\)==:\\[" } - $0~originalText { print $2; exitCode = 0; exit} - END { exit exitCode }' "$dictionaryFile")" - if [[ "${#translatedText}" -ge 1 ]]; then - spd-say -- "$translatedText" - echo "" | xclip -d "${DISPLAY:-:0}" -selection clipboard 2> /dev/null + if [[ -z "$text" ]]; then continue fi - translatedText="$(trans -no-autocorrect -b -- "$newText")" - if ! [[ "${newText}" =~ ^[0-9[:punct:]]+$ ]]; then - echo "${newText})==:[${translatedText}" >> "$dictionaryFile" + q() { sqlite3 -column -init "" "$translationFile" "$@" 2> /dev/null ; } + + + if [[ ! -s "$translationFile" ]]; then + rm -f "$translationFile" + cat << EOF | sqlite3 -init "" "$translationFile" 2> /dev/null +.bail on + +CREATE TABLE translations( + text TEXT NOT NULL, + translation TEXT NOT NULL, + + PRIMARY KEY (text) +); +CREATE INDEX translations_text_idx ON translations (text); +EOF fi - spd-say -- "$translatedText" + + + # https://en.wikipedia.org/wiki/Unicode_equivalence#Combining_and_precomposed_characters + # https://www.effectiveperlprogramming.com/2011/09/normalize-your-perl-source/ + alias nfc="perl -MUnicode::Normalize -CS -ne 'print NFC(\$_)'" # composed characters + + # Normalize different unicode space characters to the same space + # https://stackoverflow.com/a/43640405 + alias normalize_spaces="perl -CSDA -plE 's/[^\\S\\t]/ /g'" + alias normalize_unicode="normalize_spaces | nfc" + + textEscaped="$(echo "$text" | sed "s/'/''/g" | normalize_unicode)" # escape single quotes for sqlite + translated="$(q "SELECT translation FROM translations WHERE text = '$textEscaped' LIMIT 1" | sed 's/\s*$//')" + + if [[ -z "$translated" ]]; then + translated="$(trans -no-autocorrect -no-warn -brief "$text" | head -1 | sed 's/\s*$//' | normalize_unicode)" + if [[ -n "$translated" ]]; then + translatedEscaped="$(echo "$translated" | sed "s/'/''/g")" + q "INSERT OR IGNORE INTO translations (text, translation) VALUES ('$textEscaped', '$translatedEscaped')" + fi + fi + + spd-say -- "$translated" echo "" | xclip -d "${DISPLAY:-:0}" -selection clipboard 2> /dev/null done