SW 개발

옵시디언 obsidian - shell 플러그인을 이용한 영한 자동번역 기능만들기

. . . 2021. 11. 17. 15:47
반응형

obsidian 에 대한 팁과 사용방법에 대한글을 계속 작성합니다.

obsidian 구글번역 플러그인

공식적인 플러그인이 없다. 그래서 직접만들기로 하자.

  • 다음의 내용은 win10 에서 작성하고 동작확인완료하였습니다.
  • obsidian shell plugin 이 최신으로 업데이트 되어 다시 작성하였습니다.

사용 플로우

  1. obsidian shell plugin(https://github.com/Taitava/obsidian-shellcommands)을 이용하여 외부 스크립트를 실행하고, 해당 결과를 다시 에디터로 반환 할 수있는 환경을 구성한다.
  2. 번역을 위한 외부 스크립트는 python을 이용한다.
  3. 텍스트를 선택하여 지정한 단축키를 누르면 번역을 한다.

위와같이 할경우 python 을 이용하므로 향후 엄청나게 다양한 원하는 모든 기능들을 만들수있을 것이다.

windows 용 python 설치하기

windows 용 python 을 설치하여 python 스크립트를 동작시킬 수 있도록 한다.

obsidian shell 을 정상적으로 사용하기위한 설정

다음의 두 포스팅을 확인하여 동일하게 진행한다.

위의 포스팅은 powershell 에서 utf8 인코딩을 정상적으로 할 수 있도록 하는 세팅이다. 위대로 설정후 재부팅을 하면 powershell 내에서 호출하는 python 에서도 한글이 정상사용가능하다. (obsidian powershell 도 한글출력가능)

daum 번역용 스크립트 만들기

간단하게 python 스크립트를 다음과같이 만들고, obsidian vault 폴더내의 특정 경로에 스크립트를 생성하자.

코드는 https://gist.github.com/kksworks/25eddb73eede0045cfaec591f5df16fc 에도 확인가능하다.

import os, sys
import requests

import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# source from https://github.com/monologg/kakaotrans
DEFAULT_USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
BASE_URL = 'https://translate.kakao.com/translator/translate.json'
LANGUAGES = {
    'kr': 'korean',
    'en': 'english',
    'jp': 'japanese',
    'cn': 'chinse',
    'vi': 'vietnamese',
    'id': 'indonesian',
    'ar': 'arabic',
    'bn': 'bengali',
    'de': 'german',
    'es': 'spanish',
    'fr': 'french',
    'hi': 'hindi',
    'it': 'italian',
    'ms': 'malay',
    'nl': 'dutch'
}

class Translator(object):
    """ 
    Kakao Translate ajax API implemenation class
    You have to create an instance of Translator to use this API
    """

    def __init__(self, service_url=None, user_agent=DEFAULT_USER_AGENT):

        self.service_url = service_url or BASE_URL

        self.headers = {
            "Host": "translate.kakao.com",
            "Connection": "keep-alive",
            "Accept": "*/*",
            "Origin": "https://translate.kakao.com",
            "X-Requested-With": "XMLHttpRequest",
            "User-Agent": user_agent,
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Referer": "https://translate.kakao.com/",
            "Accept-Encoding": "gzip, deflate, br",
            "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6"
        }

    def translate(self, query, src='en', tgt='kr', separate_lines=False,
                  save_as_file=False, file_name=None):
        """
        Translate text from source language to target langauge
        :param query: The source text to be translated
        :param src: Source language. You can set as 'auto' for auto detecting the source language.
        :param tgt: Target Language
        :param separate_lines: If this is set as True, this function will return the list of translated sentences
        :param save_as_file: Whether save the translated result as file or not
        :param file_name: File name for saving the result. 
        :return: Translated Text
                 If separate_line==False, return the translated result in one sentence
                 If separate_line==True, return the list of multiple translated sentences
        Basic usage:
            >>> from kakaotrans import Translator
            >>> translator = Translator()
            >>> translator.translate("Try your best rather than be the best.")
        """
        # To replace multiple whitespace to single whitespace
        # This helps the translator to understand the query and split the sentences more clearly
        query = ' '.join(query.strip().split())

        # Assert language code
        if src != 'auto' and src not in LANGUAGES:
            raise ValueError('Invalid source language')
        if tgt not in LANGUAGES:
            raise ValueError('Invalid target language')
        if src == tgt:
            raise ValueError("Source language and Target language cannot be same")

        # Send the POST request
        params = {
            'queryLanguage': src,
            'resultLanguage': tgt,
            'q': query
        }
        response = requests.post(self.service_url, headers=self.headers, data=params, verify=False)

        # Check whether the status code is 200
        if response.status_code != 200:
            raise Exception("Response Error")

        translated_lines = response.json()['result']['output'][0]

        # Save the result as file
        if save_as_file and not file_name:
            raise ValueError("You must specified the filename if you want to save the result as file.")

        if save_as_file:
            with open(file_name, 'w', encoding='utf-8') as f:
                for line in translated_lines:
                    f.write(line + '\n')

        if separate_lines:
            return translated_lines
        else:
            return ' '.join(translated_lines)

def daum_translate(target_str) :
    translator = Translator()
    print(translator.translate(target_str))

if __name__ == '__main__':
    daum_translate(sys.argv[1])

obsidian shell 설정

new command 버튼을 누른후 다음의 내용을 추가하자.

python {{vault_path}}\your-path\daum-translate-py  {{selection}}
  • 코드설명
    • 선택한 텍스트코드를 인자로 파이썬 스크립트를 실행한다.

추가한 커맨드의 상세설정으로 이동하여 operation system & shell 탭으로 이동, windows shell 을 powershell5 혹은 powershell core 로 변경한다.

powershell 로 설정

파이썬 스크립트에서 번역한 내용으로 replace 하기 위해서 output 설정은 다음과 같이 caret position 으로 변경한다.

output 지정

사용하기

단축키지정

단축키 확장 플러그인을 설치하자.

단축키지정

필자는 ctrl + shift + G 로 지정함

사용하기

에디트 모드에서 번역하려는 문자열을 선택후에, ctrl + shift + G 를 누르면 자동으로 한글로 구글번역이 된다.

쉽게 사용가능할 수 있다.

시연동영상

View post on imgur.com

결론

obsidian 의 shell plugin 을 이용하면 원하는 거의 모든기능을 구현 할 수 있다.

....

반응형