글로벌 프로젝트를 진행 하다보면 다국어 관련한 내용을 추가할일이 자주 있습니다.
그러다보면 Android, iOS 파트 단에서 다국어 관련한 내용이 잘 정리가 안되어 있을때가 있습니다.
공통으로 관리 하기위해 Google Sheet 를 이용하고 있는데
이번 포스팅은 Xcode 상에서 Build 를 진행할때 Run Script 를 이용하여 시트에 있는 내용을 긁어와 프로젝트에 적용 하고자 합니다.
시트에서 내용을 긁어오는 내용은 Python 으로 진행 했습니다.
1. 설정 (python)
1-1. Terminal → brew install python3 or arch -arm brew install python3 (M1 일경우) 입력
1-2. 인텔에서는 기본 제공하지만 설치 필요시 다음과 같이 입력한다. (sudo easy-install pip)
1-3. python3 get-pip.py (M1 일경우) 입력
2. 설정 (Google Sheet)
2-1. 구글 시트를 이용해 예시로 만들어 놓은 시트는 다음과 같습니다
2-1. https://console.cloud.google.com/ 구글 시트에 접속합니다.
2-2. https://console.cloud.google.com/ 구글 클라우드 접속후 콘솔에 들어갑니다.
2-3. 좌측 메뉴에서 IAM 관리자 클릭후 프로젝트를 생성 합니다.
2-4. 프로젝트 이름 작성후 만들기 클릭합니다.
2-5. 프로젝트 중간에 있는 API 영역에서 API 개요로 이동을 클릭합니다.
2-6. 좌측 메뉴에서 라이브러리를 클릭 해줍니다.
2-7. API 라이브러리 상에 Google Sheet 를 검색하고 API 허용을 해줍니다.
2-8. 다시 대시보드로 돌아와 사용자 인증정보 만들기 -> 서비스 계정을 선택하여 아래와 같이 생성 해줍니다.
2-9. 사용자 인증정보 상에 서비스 계정 이메일을 클릭합니다.
2-10. 키탭에 들어와서 키 추가를 해줍니다. 해당 키는 JSON 형태로 생성 해줍니다.
-> 최초 생성후 다운로드는 1회 밖에 못합니다. 없어지면 다시 만들어야해요!
2-11. 서비스 계정에 있는 프로젝트 이메일을 복사해서 사용 하고자 하는 구글시트에 공유 해준다.
-> 공유 안해주면 403 (퍼미션 에러가 발생한다)
3. 프로젝트 다국어 셋팅 (Xcode)
3-1. Project -> Info -> Localizations -> + 버튼 클릭후 사용 하고자 하는 국가 선택
3-2. strings 파일을 생성 해줍니다.
3-3. 생성한 strings 파일 우측에 Localization 이 있습니다. 모두 선택 해줍니다.
4. 스크립트 작성 (python)
4-1. Terminal -> pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib gspread oauth2client
-> 구글 시트, 통신 관련 라이브러리를 를 터미널에 설치하는 과정이다. 따로따로 설치해도 괜찮지만 귀찮음으로 한꺼번에 설치하는 명령어를 실행한다.
4-2. Xcode -> New File -> Empty 를 이용하여 파이썬 파일을 생성합니다 (sheet_to_string.py)
4-3. 2-10 과정에 진행했던 json 파일을 Xcode 프로젝트에 옮겨줍니다 (credentials.json)
4-4. sheet_to_string.py 파일에 다음 소스코드를 적용 합니다.
# -*- coding: utf-8 -*
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import os
import sys
scope = [
'https://spreadsheets.google.com/feeds'
]
KEY_POSITION = 2
NUMBER_OF_LANGUAGE = 3
CREDENTIALS = os.path.dirname(os.path.realpath(__file__)) + "/credentials.json"
VALUES_PATH = os.path.dirname(os.path.realpath(__file__)) + "/"
SHEET_URL = "https://docs.google.com/spreadsheets/d/1bXl21hyKHLt-Dm1sjIfloyVFNQALMUqsTMourVdk8Io/edit#gid=0"
SHEET_TAB = "시트1"
SHEET_RANGE = "B:O"
def main():
"""
구글 시트 상에서 가져오는 로직 (oauth2)
시트 내용을 가져옴
"""
credentials = ServiceAccountCredentials.from_json_keyfile_name(CREDENTIALS, scope)
gc = gspread.authorize(credentials)
doc = gc.open_by_url(SHEET_URL)
worksheet = doc.worksheet(SHEET_TAB)
range_list = worksheet.range(SHEET_RANGE)
lang_list = list()
path_list = list()
xml_list = list()
parsing_dic = {}
if not os.path.exists(VALUES_PATH):
os.makedirs(VALUES_PATH)
for i in range(0, NUMBER_OF_LANGUAGE):
xml_list.append("")
key = ""
for cell in range_list:
if (cell.row == 1):
if (cell.col > KEY_POSITION):
"""
다국어 파일을 추가할 디렉토리를 생성함 (국가의 갯수에 알맞게)
"""
lang = cell.value
path = os.path.join(VALUES_PATH, "{0}.lproj".format(lang))
path_list.append(path)
lang_list.append(lang)
if not os.path.exists(path):
os.makedirs(path)
else:
if (cell.col == KEY_POSITION):
key = cell.value
else:
if (key == ""): continue
"""
시트에서 로우 for문을 돌때 행으로 도는게 아닌, 열로 돌고있음
인덱스 같은경우 F열부터 시작하여 한단어씩 딕셔너리에 저장합니다. if문이 있는 이유는 딕셔너리에 해당 키값이 없을경우 Key Error 를 발생 할수 있기에 조건을 추가 했습니다.
"""
index = cell.col - KEY_POSITION - 1
if index in parsing_dic:
parsing_dic[index] += "\"" + key + "\"" + " = " + "\"" + cell.value + "\";\n"
else:
parsing_dic[index] = "\"" + key + "\"" + " = " + "\"" + cell.value + "\";\n"
for i in range(len(xml_list)):
"""
append 진행했던 문자에 대해 Localizable.strings 파일을 생성하고 해당 내용에 추가합니다.
"""
path = os.path.join(path_list[i], "Localizable.strings")
f = open(path, 'w', encoding='utf-8')
f.write("{}".format(parsing_dic[i]))
print("파일 생성 완료 : " + lang_list[i])
f.close()
if __name__ == '__main__':
main()
5. 스크립트 작성 (Xcode)
- Xcode → Project → Build Phases → Add Build Phases + 버튼 클릭 → New Run Script Phases
- 아래 스크립트 작성 후 실행
cd /usr/bin
python3 ${SRCROOT}/(프로젝트명)/Resource/sheet_to_strings_ios.py
- 최초 실행시 라이브러리 import 모듈 관련 오류가 발생할수 있는데 그럴경우
- 아래 스크립트안에 해당 문구를 추가 해주세요
pip3 install gspread
pip3 install oauth2client
결과
참고
참고 : https://developers.google.com/sheets/api/quickstart/python
https://yurimkoo.github.io/python/2019/07/20/link-with-googlesheets-for-Python.html
https://www.kodeco.com/25816315-using-swift-scripts-with-xcode
https://velog.io/@junsugi/Google-Sheet-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-feat.-Google-API
'IOS' 카테고리의 다른 글
SwiftUI - 이미지 줌 기능을 달아보자 (0) | 2023.02.26 |
---|---|
iOS - 프로젝트에 SPM 을 달아보자 (0) | 2023.02.19 |
Swift - async await (0) | 2022.10.26 |
SwiftUI - List Hide Indicator (0) | 2022.10.23 |
SwiftUI - TextView Attribute (0) | 2022.06.01 |