본문 바로가기
개발 공부 기록하기/- Python

ChatGPT와 함께 Android strings.xml 자동번역 및 추가 10초만에 하기

by soulduse 2023. 8. 22.
반응형

자동 번역 스크립트는 왜 필요한가?

현재 개발하고 있는 안드로이드 앱의 values 폴더들이다. 다국어 지원을 위해 영어, 아랍어, 독일어, 스페인어, 프랑스어, 이탈리아어, 일본어, 한국어, 중국어와 같이 많은 언어들을 다루고 있다.

 

이렇게 되면 엄청난 번거로움이 생기는데 strings.xml에 번역된 내용 하나만 추가해줘도 수많은 작업이 발생하게 된다.

 

"데이터 로딩 중입니다. 잠시 후 다시 시도해주세요" 라는 문구를 strings.xml에 추가하기로 하는 상황을 살펴보자.
  1. strings.xml에 해당 내용을 추가하기 위한 변수명을 지어야 한다.(변수명 짓는것도 고민을 하게 되므로 생각보다 시간을 많이 뺏긴다)
  2. 각 나라별로 번역을 한다. (벌써부터 머리가 아파온다..) 어찌저찌 파파고와 구글 번역기를 돌려 번역본을 구했다.
  3. 이제 위 폴더를 순회하며 나라별로 폴더를 찾아서 strings.xml에 번역된 내용을 추가 해야한다.

 

strings.xml에 값 하나만 추가하려고 해도 정말 수많은 노가다를 해야한다. 

이런 작업이 1개가 아니라 10개를 진행해야 한다면? 정작 중요한 비즈니스 개발을 하기전에 지쳐서 개발할 기력이 남아있지 않게 될 것이다.

그래서 어떻게 하는데?

위 모든 번거로움을 단 10초 이내에 작업할 수 있게 파이썬 스크립트를 작성하였다. 이 스크립트와 함께 ChatGPT를 부려먹으면 된다.

add_translation.py
import os

def get_folder_name(lang):
    """언어 코드를 받아와 해당 언어의 폴더 이름을 반환합니다."""
    return "values" if lang == 'en' else f"values-{lang}"

def ensure_directory(directory):
    """주어진 디렉토리가 있는지 확인하고, 없다면 생성합니다."""
    if not os.path.exists(directory):
        os.makedirs(directory)

def update_translation_in_file(file_path, key, translation):
    """주어진 파일 경로에서 XML 파일을 업데이트하거나 생성합니다."""
    if os.path.exists(file_path):
        with open(file_path, 'r', encoding='utf-8') as file:
            content = file.read()

        existing_key = f'<string name="{key}">'
        if existing_key in content:
            # 기존 키를 새로운 번역으로 대체
            content = content.replace(f'{existing_key}.*?</string>', f'{existing_key}{translation}</string>')
            new_content = content
        elif '</resources>' in content:
            new_content = content.replace('</resources>', f'    <string name="{key}">{translation}</string>\n</resources>')
        else:
            new_content = content + f'\n<string name="{key}">{translation}</string>\n</resources>'

        with open(file_path, 'w', encoding='utf-8') as file:
            file.write(new_content)

    else:
        with open(file_path, 'w', encoding='utf-8') as file:
            file.write(f'<?xml version="1.0" encoding="utf-8"?>\n<resources>\n    <string name="{key}">{translation}</string>\n</resources>')

def add_translation(key, translations):
    """번역을 추가하는 메인 함수입니다."""
    languages = ['en', 'ar', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'zh-rTW', 'zh']
    translation_list = translations.split('|')

    if len(translation_list) != len(languages):
        print("Error: Number of translations provided does not match the number of supported languages.")
        return

    base_path = "app/src/main/res/"

    for lang, translation in zip(languages, translation_list):
        folder_name = get_folder_name(lang)
        directory = f"{base_path}{folder_name}"

        ensure_directory(directory)

        file_path = f"{directory}/strings.xml"
        update_translation_in_file(file_path, key, translation)

if __name__ == "__main__":
    import sys

    if len(sys.argv) < 3:
        print("Please provide all the required parameters.")
        exit()

    add_translation(sys.argv[1], sys.argv[2])

 

사용 방법

1. 해당 파이썬 파일(add_translation.py)을 프로젝트 root 디렉토리(최상단)에 생성한다.

2. 본인이 번역하고자 하는 언어에 맞게 아래 부분을 수정한다.

languages = ['en', 'ar', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'zh-rTW', 'zh']

3. 터미널에서 아래 명령어를 입력한다.

  • python3 add_translation.py : 파이썬 코드를 실행하겠다는 명령
  • data_loading : 파라미터중 하나로 strings.xml에 key 이름 역할을 한다.
  • 위에서 나열한 languages 순서에 맞게 번역된 데이터를 | 키워드로 분할하여 넣어준다
  • 번역본 + | 키워드 나열을 전부 "" 따옴표로 감싸준다.
python3 add_translation.py data_loading "Loading data. Please try again in a moment.|جاري تحميل البيانات. يرجى المحاولة مرة أخرى بعد قليل.|Daten werden geladen. Bitte versuchen Sie es in einem Moment erneut.|Cargando datos. Por favor, inténtelo de nuevo en un momento.|Chargement des données. Veuillez réessayer dans un moment.|Caricamento dati. Si prega di riprovare tra un momento.|データをロード中です。少し待ってから再度お試しください。|데이터 로딩 중입니다. 잠시 후 다시 시도해주세요.|正在加载数据,请稍后再试。|正在載入資料 ,請稍後再試。"

번역된 데이터를 함께 넣고 실행해야되기 때문에 스크립트를 작성하는건 ChatGPT를 활용하여 그 역할을 위임할것이다. 

 

Script 작성 및 번역을 쉽게 하는 방법(w. ChatGPT)

ChatGPT를 부려먹기 위해 다음과 같이 프롬프트를 작성하였다.

 

prompt

Android strings.xml을 자동화 하기 위한 파이썬 스크립트를 작성했어.

코드는 다음과 같아.

```python
import os

def get_folder_name(lang):
    """언어 코드를 받아와 해당 언어의 폴더 이름을 반환합니다."""
    return "values" if lang == 'en' else f"values-{lang}"

def ensure_directory(directory):
    """주어진 디렉토리가 있는지 확인하고, 없다면 생성합니다."""
    if not os.path.exists(directory):
        os.makedirs(directory)

def update_translation_in_file(file_path, key, translation):
    """주어진 파일 경로에서 XML 파일을 업데이트하거나 생성합니다."""
    if os.path.exists(file_path):
        with open(file_path, 'r', encoding='utf-8') as file:
            content = file.read()

        existing_key = f'<string name="{key}">'
        if existing_key in content:
            # 기존 키를 새로운 번역으로 대체
            content = content.replace(f'{existing_key}.*?</string>', f'{existing_key}{translation}</string>')
            new_content = content
        elif '</resources>' in content:
            new_content = content.replace('</resources>', f'    <string name="{key}">{translation}</string>\n</resources>')
        else:
            new_content = content + f'\n<string name="{key}">{translation}</string>\n</resources>'

        with open(file_path, 'w', encoding='utf-8') as file:
            file.write(new_content)

    else:
        with open(file_path, 'w', encoding='utf-8') as file:
            file.write(f'<?xml version="1.0" encoding="utf-8"?>\n<resources>\n    <string name="{key}">{translation}</string>\n</resources>')

def add_translation(key, translations):
    """번역을 추가하는 메인 함수입니다."""
    languages = ['en', 'ar', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'zh-rTW', 'zh']
    translation_list = translations.split('|')

    if len(translation_list) != len(languages):
        print("Error: Number of translations provided does not match the number of supported languages.")
        return

    base_path = "app/src/main/res/"

    for lang, translation in zip(languages, translation_list):
        folder_name = get_folder_name(lang)
        directory = f"{base_path}{folder_name}"

        ensure_directory(directory)

        file_path = f"{directory}/strings.xml"
        update_translation_in_file(file_path, key, translation)

if __name__ == "__main__":
    import sys

    if len(sys.argv) < 3:
        print("Please provide all the required parameters.")
        exit()

    add_translation(sys.argv[1], sys.argv[2])
```

사용방법은 아래와 같이 사용하면 돼 
예시:
```
python3 add_translation.py data_loading "Loading data. Please try again in a moment.|جاري تحميل البيانات. يرجى المحاولة مرة أخرى بعد قليل.|Daten werden geladen. Bitte versuchen Sie es in einem Moment erneut.|Cargando datos. Por favor, inténtelo de nuevo en un momento.|Chargement des données. Veuillez réessayer dans un moment.|Caricamento dati. Si prega di riprovare tra un momento.|データをロード中です。少し待ってから再度お試しください。|데이터 로딩 중입니다. 잠시 후 다시 시도해주세요.|正在加载数据,请稍后再试。|正在載入資料 
,請稍後再試。"
```

['en', 'ar', 'de', 'es', 'fr', 'it', 'ja', 'ko', 'zh-rTW', 'zh'] 순서에 맞게 번역 파일을 만들고싶은데 위에 사용 예시를 바탕으로 스크립트를 작성해줘.

내가 번역할 내용은 아래 적힌 내용이야.

안녕하세요

위 내용을 복붙하여 가장 아래 영역만 조금만 손봐주면된다.

 

 

ChatGPT 응답 내용

아래와 같이 잘 결과를 도출해주었고 이걸 그대로 실행하기만 하면 끝이다...!

python3 add_translation.py greeting "Hello|مرحبا|Hallo|Hola|Bonjour|Ciao|こんにちは|안녕하세요|你好|你好"

 

결론

엄청난 시간 단축 완성! 이 모든걸 다해도 ChatGPT 응답시간 + 스크립트 실행시간 정도 밖에 들지 않아 10초 내외로 자동 번역및 내용 주입이 가능해졌다. 조금더 나아가서 python 스크립트 내에서 ChatGPT API를 사용한다면 내가 원하는 키워드하나만 주입하면 알아서 번역과 자동주입도 가능할것으로 보인다. 

 

 

내용에 댓글이 3개 이상 달리면 단어만 던져서 스크립트 실행하면 알아서 다 되는 업그레이드 버전으로 개선하는 내용을 포스팅 해보겠습니다

반응형