Translator en-pl, modyfikacja kodu bash

0

Znalazłem skrypt pod linuxa wykorzystujący tłumacza google w jakiejkolwiek aplikacji (np. pdf). Problem jest taki, że niepotrzebnie wyświetla w okienku tłumaczenia oryginalny tekst. Przez to nie wyświetla się całe polskie tłumaczenie.W sumie może się oryginał wyświetlać byle tłumaczył się cały zaznaczony tekst.
To nie jest ograniczenie liczby znaków samego tłumacza bo np. pod firefoxem dodatek S3 translator tłumaczy całość.

Libnofity:

#!/usr/bin/env bash
notify-send --icon=info "$(xsel -o)" "$(wget -U "Mozilla/5.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=$(xsel -o | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2, $6}')"

Zenity:

#!/usr/bin/env bash
text="$(xsel -o)"
translate="$(wget -U "Mozilla/5.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=en&dt=t&q=$(echo $text | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2, $6}')"
echo -e "Original text:" "$text"'\n' > /tmp/notitrans
echo "Translation:" "$translate" >> /tmp/notitrans
zenity --text-info --title="Translation" --filename=/tmp/notitrans[/code]

Tak to wygląda teraz (w Zenity):

screen.png

link: http://www.webupd8.org/2016/03/translate-any-text-you-select-on-your.html

0

Zmieniłem tak, że w zenity nie wyświetla się oryginalny tekst, ale i tak nie tłumaczy całego zaznaczenia.

#!/usr/bin/env bash
text="$(xsel -o)"
translate="$(wget -U "Mozilla/5.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t&q=$(echo $text | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2, $6}')"
echo -e '\n' > /tmp/notitrans
echo "$translate" >> /tmp/notitrans
zenity --text-info --title="Translation" --filename=/tmp/notitrans
0

@treeev: skoro zwraca Ci JSONa, to ja bym spróbował użyć jq zamiast seda. Będzie działać lepiej i powinno być zdecydowanie czytelniej.

0

Trochę wolno działa, ale rozwiązaniem jest chyba coś takiego:

#!/bin/bash

echo "$(xsel -o)" | sed -e 's/[[:blank:]]{1,}/ /g' | sed -e '/^[ \n]*$/ d' | sed -e 's/\./\.\n/g'  > /tmp/tekst

echo > /tmp/notitrans
s=/tmp/tekst
cat < "$s" | while read line
do
echo "$(wget -U "Mozilla/56.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t&q=$(echo $line | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2}')" | sed -e 's/\.\n/\./g' | tr '\n' ' ' >> /tmp/notitrans
done

zenity --text-info --title="Tłumaczenie" --filename=/tmp/notitrans
0
wojtek p. napisał(a):

Trochę wolno działa, ale rozwiązaniem jest chyba coś takiego:

#!/bin/bash

echo "$(xsel -o)" | sed -e 's/[[:blank:]]{1,}/ /g' | sed -e '/^[ \n]*$/ d' | sed -e 's/\./\.\n/g'  > /tmp/tekst

echo > /tmp/notitrans
s=/tmp/tekst
cat < "$s" | while read line
do
echo "$(wget -U "Mozilla/56.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t&q=$(echo $line | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2}')" | sed -e 's/\.\n/\./g' | tr '\n' ' ' >> /tmp/notitrans
done

zenity --text-info --title="Tłumaczenie" --filename=/tmp/notitrans

Popraw

0
#!/bin/bash

set -eo pipefail # zawsze ustawiaj to w skryptach

tmpfile=$(mktemp)
trap "rm \"$tmpfile\"" EXIT
 
xsel -o | sed -e 's/[[:blank:]]{1,}/ /g' -e '/^[[:blank:]]*$/ d' -e 's/\./&\n/g'  | while read line
do
  curl -A 'Mozilla/56.0' 'http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t' --data-urlencode "q=$line" | jq -r .[0][0][0]
done > "$tmpfile"

zenity --text-info --title="Tłumaczenie" --filename="$tmpfile"

Jedynym wymaganiem względem starego programu jest to, że teraz wymaga jq. Ale można go jeszcze bardziej usprawnić:

#!/bin/bash

set -eo pipefail # zawsze ustawiaj to w skryptach

translate_line() {
  curl -A 'Mozilla/56.0' 'http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t' \
    --data-urlencode "q=$1" \
  | jq -r .[0][0][0]
}
 
output=$(xsel -o | tr -s ' ' | sed -e '/^\s*$/d' -e 's/\./&\n/g' | while read line; do translate_line "$line"; done)

zenity --text-info --title="Tłumaczenie" --text="$output"
0

Dzięki, kod pierwszy z posta wyżej działa ładnie.Drugi nic nie wyświetla, jest puste okienko (jq zainstalowałem)

Xclip ma tę zaletę, że okienko samo znika. Można prosić o modyfikację kodu tak żeby xclip tłumaczył dłuższe zdania ew. nie wyświetlał oryginału?

#!/usr/bin/env bash
text="$(xsel -o)"
translate="$(wget -U "Mozilla/5.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t&q=$(echo $text | sed "s/[\"'<>]//g$
echo "$translate" | xclip -selection clipboard
notify-send --icon=info "$text" "$translate"

0

U mnie (macOS, Bash 3.2.57 więc dość stary, jq 1.5 i curl 7.54.0 oraz moreutils) takie coś działa bez problemu dla pojedynczych zdań:

curl 'http://translate.googleapis.com/translate_a/single' \
    -A 'Mozilla/5.0' \
    --data-urlencode 'client=gtx' \
    --data-urlencode 'sl=auto' \
    --data-urlencode 'tl=pl' \
    --data-urlencode 'dt=t' \
    --data-urlencode "q=$(</dev/stdin)" \
    | jq -r .[0][0][0] \
    | pee cat pbcopy terminal-notifier

Dla większej ilości zdań jedyne co trzeba zrobić to zmienić $(</dev/stdin) na jakąś zmienną, np. tak:

tr -ds '\n' ' ' | awk -v RS=. '{ print $0"." }' | while read line
do
    curl -s 'http://translate.googleapis.com/translate_a/single' \
        -A 'Mozilla/5.0' \
        --data-urlencode 'client=gtx' \
        --data-urlencode 'sl=auto' \
        --data-urlencode 'tl=pl' \
        --data-urlencode 'dt=t' \
        --data-urlencode "q=$line" \
        | jq -r .[0][0][0]
done | pee cat pbcopy terminal-notifier

Gdzie pbcopy to program, który zachowuje standardowe wejście w schowku na macOS a terminal-notifier to skrypt wyświetlający powiadomienia.

0

Żeby okienka znikały można zastosować timeout. Np żeby okienko wyświetlało sie przez 10 sekund, musi być --timeout 10. Moje rozwiązanie jest takie:

#!/usr/bin/env bash
tekst=$( xsel -o | sed -e 's/[[:blank:]]{1,}/ /g' | sed -e '/^[ \n]*$/ d' | sed -e 's/\./\.\n/g')

echo "$tekst" | while read line
do
echo "$(wget -U "Mozilla/56.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t&q=$(echo >$line | sed "s/["'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2}')" | sed -e 's/.\n/./g' | tr '\n' ' '
done | zenity --text-info --timeout 10 --title="Tłumaczenie"

0

Zrobiłem jeszcze wersję monitorującą zaznaczenie. Działa u mnie na ubuntu. Tłumaczenie po każdym zaznaczeniu wyświetla się w terminalu. Może poprawisz...

#!/bin/bash
if [ ! -e /dev/pts/0 ]
then
gnome-terminal
fi
spr ()
{
ter=`xsel -o`
if [ "$ter" = "$wcze" ]
then
sleep 2
else
echo -e "\n---------------------" > /dev/pts/0
echo "$ter" | while read line
do
echo "$(wget -U "Mozilla/56.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t&q=$(echo >$line | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2}')" | sed -e 's/\.\n/\./g' | tr '\n' ' ' > /dev/pts/0 
done
sleep 2
wcze="$ter"
fi
}

while :
do
spr
done

0

Jest taki problem, że po zaznaczeniu tekstu do tłumaczenia pojawia się on w katalogu domowym jako plik (nazwa pliku jest zaznaczonym tekstem) .Jest to pusty plik.Robi się przez to niezły śmietnik

Eycja; po przeładowaniu systemu już nie ma tego problemu. Tak ,że jest ok, nie pojawiają sie puste pliki

0

Chodzi o ten ostatni skrypt. U mnie po zaznaczeniu nic sie nie wyświetla (tłumaczenie) tylko zaznaczony tekst pojawia w postaci pliku. Mam Minta a to system oparty na Debianie.

0

Ja mam ubuntu i u mnie działa. Ale był w nim mały błąd w 4 linii. Powinno być
gnome-terminal &
Czyli prawidłowo powinno wyglądać tak:

#!/bin/bash
if [ ! -e /dev/pts/0 ]
then
gnome-terminal &
fi
spr ()
{
ter=`xsel -o`
if [ "$ter" = "$wcze" ]
then
sleep 2
else
echo -e "\n---------------------" > /dev/pts/0
echo "$ter" | while read line
do
echo "$(wget -U "Mozilla/56.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t&q=$(echo >$line | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2}')" | sed -e 's/\.\n/\./g' | tr '\n' ' ' > /dev/pts/0 
done
sleep 2
wcze="$ter"
fi
}

while :
do
spr
done

Nie wiem jak jest w mincie. U mnie to działa. Może tam jest jakiś inny terminal i inny plik reprezentujący terminal i dlatego nie chce działać, chociaż nie wiem dlaczego tworzy ci jakieś pliki w katalogu domowym.

0

@treeev, wypróbuj to:

#!/bin/bash
if [ "$czy" != "wejdz" ]
then
export czy=wejdz
mate-terminal -t TŁUMACZENIE --geometry 152x5 -e $0 
else
terminal=`tty`
spr ()
{
ter=`xsel -o`
if [ "$ter" = "$wcze" ]
then
sleep 2
else
echo "$ter" | sed -e 's/[[:blank:]]{1,}/ /g' | sed -e '/^[ \n]*$/ d' | sed -e 's/\./\.\n/g' | while read line
do
echo "$(wget -U "Mozilla/56.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t&q=$(echo >$line | sed "s/[\"'<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2}')" | sed -e 's/\.\n/\./g' | tr '\n' ' ' > $terminal 
done
echo -e "\n----------------------------------------" >> $terminal
sleep 2
wcze="$ter"
fi
}


while :
do
spr
done

fi

Powinno działać w Linux Mint.

0

W kodzie poprzednim (po wpisaniu właściwego , swojego tty) wyświetlają się kreski (----------------------------------------)
Po użyciu kodu ostatniego też pojawiają się kreski.
Czyli ostatni kod dobrze przechwytuje terminal ale wynik tłumaczenia jest jak napisałem.

W sumie używam teraz do tłumaczenia

#!/usr/bin/env bash
text="$(xsel -o)"
translate="$(wget -U "Mozilla/5.0" -qO - "http://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl=pl&dt=t&q=$(echo $text | sed "s/[\"'<>]//g$<>]//g")" | sed "s/,,,0]],,.*//g" | awk -F'"' '{print $2, $6}')"

echo "$translate" | xclip -selection clipboard
notify-send --icon=info "$text" "$translate"

tylko nie wiem dlaczego zawsze na końcy przetłumaczonego tekstu jest en

1 użytkowników online, w tym zalogowanych: 0, gości: 1