안녕하세요 Swimlight 개발자 MaraMincho 입니다. 오늘은 Swimlight가 어떤 방법으로 Localization을 지원하는지 알아보도록 하겠습니다.
0. Tuist와 .xcstrings
wwdc에서 보면 xcstring으로 마법같이 Localization을 지원한다. 그래서 그걸 따라해보고 적용할려 하니 아직 지원이 안된다는 이슈가 있었다. 그래서 진짜 그런가 하고 Core 모듈에 필요한 것들을 넣어봤는데
후술할 이야기 이지만, 기존 strings를 통해 모든 모듈에 의존성을 추가했다. 혹시 몰라 xcstring으로도 가능할까 해봐서 모든 모듈에 의존성을 추가했지만 에러가 발생했다.
아마 Tuist 에서 xcstrings를 관리하면 좋겠지만, 그런 날은 오지 않을 것 같다.
1. 기존 Localizable.strings 을 이용하여 만들기
기존 Localizable.strings을 이용하여 Localization을 지원한다면, 다음과 같은 포멧을 통해 지원해야 합니다. 똑같은 Key로 다른 Value를 넣어주는 방식으로 지원해야 합니다.
그리고 활용으로서 String(localizaed:) 매서드를 활용하면 됩니다.
String(localized: "TheKeyThatLocalized")
저는 여기서 Key를 직접 입력하는 것에 대해서 매우 불만이 있습니다. 오타가 발생할 경우 이를 위한 디버깅이 매우 힘들어지고, 오타 때문에 작업이 느려질 것 같았습니다. 예를 들어서 key가 다음과 같다면 `Apple_key_title_subtitle_element_offset` 이를 개발자가 일일이 직접 치는것이 과연 맞는가 싶었습니다. 그리고 디버깅도 힘듭니다.
String(localized: "Apple_key_title_subtitle_element_offset") // ✅
String(localized: "Apple_key_title_subttile_elemnet_offset") // ❌
그래서 고안한 방법은 Project가 빌드할 때 마다 내가 excel에 저장해둔 Localized File을 가져와서 편하게 코딩하는건 어떨까에 대해서 고민했습니다. 결론적으로 csv 파일을 읽고 이를 enum으로 만들어서 custom String생성자를 활용하자 라는 결론에 다달았습니다. 그리고 오늘의 주제인 excel과 enum 을 python스크립트로 활용하는 방법에 대해서 보여드릴 예정입니다.
2. excel로 csv파일 만들기
처음에 excel로 csv파일을 만들기로 하였습니다. 엑셀로 다음과 같은 파일을 만들었다면 저장 형식을 excel포멧이 아닌 콤마로 구분되는 csv로 하는 것입니다. CSV로 저장한 파일을 code, 혹은 vim으로 열게 되면 우리가 아는 csv로 열리게 됩니다.
아래는 우리가 원하던 csv파일 입니다.
3. GPT를 통해 번역하고 CSV에 덮어 쓰기
GPT한테 일어에 관해서 번역해달라고 부탁합니다. 그러면 GPT가 일어에 관해 번역해 줄 것 입니다.
그리고 이 csv파일을 vim을 통해 저장해 줍니다. 그렇게 되면 csv에는 완전한 Localization을 지원하는 파일이 들어있게 됩니다.
4. python script 를 통한 localizable 파일 sink하기
이제 이 csv를 통해 localization파일을 만들어야 합니다. swift로 해도 되겠지만, 스크립트 언어로서 제가 제일 익숙한 언어인 python으로 진행했습니다. python을 통해 다음과 같이만들어 주었습니다.
import csv
# CSV 파일 경로
f = open('Projects/Share/SLLocalization/Resources/Localizable.csv', "r", encoding="UTF-8")
reader = csv.reader(f)
# 로컬라이제이션 데이터를 저장할 리스트 초기화 (영어, 한국어, 일본어)
localizations = [[], [], []]
# Enum 파일의 시작 부분 정의
enumKeys = [
"import Foundation\n\npublic enum LocalizationsKey: String {"
]
# CSV 파일 읽기
for row in reader :
key, en, ko, jr = row[0], row[1], row[2], row[3]
values = [en, ko, jr]
# 각 언어에 대한 로컬라이제이션 문자열 생성
for ind in range(3):
curString = "\"" + key + "\" = \"" + values[ind] + "\";"
localizations[ind].append(curString)
# Enum 키 추가
curEnumString = " case " + key
enumKeys.append(curEnumString)
f.close()
# 로컬라이제이션 파일 경로 정의
fileDirectory = [
"Projects/Share/SLLocalization/Resources/Localizations/en.lproj/Localizable.strings",
"Projects/Share/SLLocalization/Resources/Localizations/ko.lproj/Localizable.strings",
"Projects/Share/SLLocalization/Resources/Localizations/ja.lproj/Localizable.strings"
]
# 로컬라이제이션 파일 작성
for ind in range(3) :
text = "\n".join(localizations[ind])
currentFileDirectory = fileDirectory[ind]
f = open(currentFileDirectory, "w+")
f.write(text)
f.close()
# Enum 파일 작성
enumKeys.append("}")
f = open("Projects/Share/SLLocalization/Sources/LocalizationKeys.swift", "w+")
enumKeysContent = "\n".join(enumKeys)
f.write(enumKeysContent)
f.close
실행 흐름으로서 csv를 통해 파일을 읽고, key - value 형태로 각각의 localization파일을 생성해 줍니다. 이 방법을 통해 지역화 해야할 것들이 하나 생기면 key-value를 직접 입력하는 것이 아닌 excel csv을 통해 지역화 key value 입력하고 저장하는 방법으로 바꾸었습니다. Tuist를 통해 project를 만들기 전 python스크립트를 실행해 localization 파일을 최신화 하였습니다.
5. Tuist에 필요한 모듈 localziable Resources 추가해주기
localization을 필요로 하는 string을 활용하기 위해서 Resources를 추가해주면 됩니다. 아래와 같은 식으로 resources에 localizable파일을 추가시켜 주었습니다.
6. 실제 실행화면에 대해서
만약 csv 제일 아래에 다음과 같은 key -value localization파일을 추가시켰습니다.
Mara_Mincho | good | bad | soso |
그리고 스크립트를 활성화 합니다.
Script가 동작하여 새로운 key-value를 갖는 localization element를 추가하게 됩니다.
Tuist generate를 통해서 새로운 파일이 sink 될 수 있게 만들어 줍니다.
Extension을 선언하여 enum을 편하게 씁니다.
7. 후기
이 방법은 치명적인 단점이 있습니다.
만약 csv가 완전 비대하게 된다면 약 10만의 key가 존재한다면 key - value 추가할 때 마다 오래 기달려야 합니다. 시나리오상으로 10만개의 key가 있는 csv에 key를 하나 추가하고, 다시 그 key를 제거한다면 python스크립트는 20만번의 연산을 수행하게 됩니다. 그리고 tuist도 다시 generate해주어야하기때문에 생산성에 악영향을 미칠 수 있습니다.
하지만 명백한 장점이 있는데, 그것은 바로 AI에게 물어보기 쉽다는 점 입니다. csv만 넘겨주만 알아서 AI가 맞는 단어들을 골라주기 때문에 key랑 한국어 번역만 잘 입력하면 뚝딱 해결해 줍니다. 또한 만약 혼자 개발이 아닌 여럿이서 개발한다면 다국어 팀 모두가 csv만을 바라보며 작업하기에(굳이 xcode의 swift파일이아닌) 다양한 업무에 있는 사람이 편하게 작업할 것으로 사료합니다. 긴 글 읽어주시느라 고생했습니다.
'프로젝트' 카테고리의 다른 글
[SwiftUI] 개인앱에 2024년 리포트 보여주는 기능 추가 해보는건 어때요? (SwiftUI로 Youtube recap 구현하기) (1) | 2025.01.02 |
---|