I have been looking for a way to accelerate my workflow and somehow automate the translation process - opening a translator in browser is kinda slow. I was looking for some API options but large companies like Google and Yandex don't provide free APIs. I was lucky to stumble upon a free Google Translate API which I first converted to an AHK function. The biggest problem was to parse the translation result - as it returned a JSON string without any names, just arrays within arrays. I was trying to do it without external libraries, but it was too difficult so I managed to achieve the result using TheArkive's JXON library. I wrapped the function in a Translator class, because I already had in mind the need for future translation shortcuts and different translation modes. Then I wrote the Qtslate class to implement all the things I needed for the translation script. Below you will find more information on the classes.
Translator is a static AutoHotkey V2 class based on a Google Translate API and uses TheArkive's JXON library for JSON parsing and a Clipsend function by Axlefublr. It consists of a single method and a couple of properties, used as settings.
Properties:
SourceLanguage
TargetLanguage
Methods:
Translate
SourceLanguage
- self-explanatory. Defaulted to "auto", used as a parameter for the Translate method.
TargetLanguage
- self-explanatory. Defaulted to "ru", feel free to fork and change to your liking.
Translate(Text, TargetLanguage := this.TargetLanguage, SourceLanguage := this.SourceLanguage)
- the main method which does the translation. Just provide a text as a parameter, the SourceLanguage
and TargetLanguage
properties are optional and by default as the same as the class properties.
The basic working principle is the following:
- Send a request to server
- Parse the response JSON
- Return translation
Below you will find a couple of examples of possible use.
Basic translation using languages from the class properties (defaults are "ru" and "auto"):
translation := Translator.Translate(text)
MsgBox(translation)
Let's change the target language:
translation := Translator.Translate(text, "de")
MsgBox(translation)
Now let's try to change also the source:
translation := Translator.Translate(text, "de", "es")
MsgBox(translation)
Qtslate is an extension class for the Translator which implements a few methods for a seamless integration of the Translator in your workflow. Using switch between multiple translation modes and change both source and target languages.
Properties:
TranslationMode
CurrentModeIndex
Languages
SourceLanguageIndex
TargetLanguageIndex
Methods:
SwitchMode
CycleTargetLanguage
CycleSourceLanguage
Activate
ShowCurrentSettings
Display
InPlace
UserInput
FromClipboard
TranslationMode
- internal array for switching between the translation modes (see corresponding methods).
CurrentModeIndex
- index used to switch the translation mode.
Languages
- internal array of language codes.
SourceLanguageIndex
- index used to choose the source language of the text. Default is 1 ("auto").
TargetLanguageIndex
- index used to choose the target language of the text. Default is 3 ("ru").
SwitchMode(backwards := false)
- Method for switching Qtslate between translations methods - 'From Clipboard', 'In place' and 'User Input'.
CycleTargetLanguage(backwards := false)
- Method for cycling target languages. Based on a counter to cycle through the array of languages. Skips the index #1 which is 'auto' because you must specify the target language.
CycleSourceLanguage(backwards := false)
- Method for cycling languages. Based on a counter to cycle through the array of languages.
Activate()
- Call a translation method based on the current translation mode.
ShowCurrentSettings()
- Method to display currently active translation mode and languages.
Display(translation)
- Method used by other translation modes for displaying the translated text in a new window. The Copy
button can be used to copy the translation result. Otherwise, Escape
button can be pressed to close the GUI.
InPlace()
- Translation mode used to translate text within a text editor. For example, in MS Word you can select a word or a whole paragraph and call this method. The selection will be copied, translated and pasted in place.
UserInput()
- Translation mode used to show an input box. The entered text will then be translated and displayed in a new window via Display method.
FromClipboard()
- Translation mode used to translate text from the clipboard. The translation will then be displayed in a new window via Display method.
As an example I have written a Qtslagent.ah2 which is basically the ready-to-go script. The shortcuts are following:
My default settings:
#x::ExitApp
- Press Win+X
to terminate script.
^!r::Reload
- Press Ctrl+Alt+R
to reload the script.
Translation forkflow:
#t::QTslate.Activate()
- Press Win+T
to translate text based on the default or chosen mode/languages.
#MButton::QTslate.ShowCurrentSettings()
- Press Win+Mousewheel
to display the currently selected mode and languages in a ToolTip.
#+t::QTslate.SwitchMode()
- Press Win+Shift+T
to switch between translation modes.
#+WheelUp::QTslate.CycleSourceLanguage(true)
- Use Win+Shift+Mouse wheel up
to cycle through source languages backwards.
#+WheelDown::QTslate.CycleSourceLanguage()
- Use Win+Shift+Mouse wheel down
to cycle through source languages forward.
#WheelUp::QTslate.CycleTargetLanguage(true)
- Use Win+Mouse wheel up
to cycle through source languages backwards.
#WheelDown::QTslate.CycleTargetLanguage()
- Use Win+Mouse wheel down
to cycle through source languages.