안녕하세요 오늘은 GoogleSpreadSheet와 Python Script를 이용해서 현지화(문자열 관리) 자동화하는 과정에 대해 소개하겠습니다.

저는 현재 글로벌서비스를 준비하고 있으며 문자열 관리와 반복되는 strings파일 업데이트등 이유로 생산성을 높이기 위해 해당 자동화를 구축했습니다.

Process

1. 구글시트에 관리할 문자열에 대해 작성한다.

2. 구글시트에서 시트를 읽어 스크립트를 통해 strings파일로 변환한다.

3. 빌드 이전에 스크립트가 동작해도록 설정해 자동으로 원하는 위치에 strings파일을 넣어준다.

구글시트 작성하기

저의 구글시트는 이런식으로 작성했습니다.

Description은 strings파일에서 주석부분입니다.

Keys는 Key값 C열부터는 Value값이 됩니다.

C열부터 언어코드를 통해  원하는 언어의 폴더에 각각 알맞은 strings파일을 넣어줄겁니다.

환경 설정하기

구글Cloud에서 발급받은 JSON Keyfile을 통해 credential을 생성하고 해당 credential을 통해 구글 시트에 계정 인증 후 연동합니다.

JSON Key 발급

https://console.cloud.google.com/apis/library/sheets.googleapis.com?project=wallet-192210 

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

GCP에서 프로젝트 생성 후 해당 링크에서 Google Sheets API를 발급받습니다.

관리로 이동 후 사용자 인증 정보 - +사용자 인정 정보 만들기 - 서비스 계정을 선택 해 서비스 계정을 생성합니다.

계정 생성 후 해당 계정으로 들어가 키 - 키 추가 - 새 키 만들기를 통해 JSON keyfile을 생성하고 다운받아줍니다.

작성해둔 구글시트에 접속해 우상단 공유 버튼을 통해 서비스계정의 이메일을 추가해 시트액세스권한을 부여합니다.

Python 스크립트 작성하기

구글 시트 연결하기

from oauth2client.service_account import ServiceAccountCredentials
import gspread
import csv
import os
import re
import time

start = time.time()

scope = [
    "https://spreadsheets.google.com/feeds",
    "https://www.googleapis.com/auth/drive",
]

# JSON Key File Path
JSON_KEY_PATH = "JSON파일 경로"
# CSV File Path
CSV_FILE_PATH = "CSV파일 저장할 경로"
# language.lproj directory path
LPROJ_PATH = ".lproj디렉토리 경로"

credential = ServiceAccountCredentials.from_json_keyfile_name(JSON_KEY_PATH, scope)
gc = gspread.authorize(credential)

# Spread Sheet Key로 열기
spreadsheet_key = "서비스계정 key값"
doc = gc.open_by_key(spreadsheet_key)

# sheet 선택
sheet = doc.worksheet("Strings")

ServiceAccountCredentials을 통해 계정 인증정보를 생성하고 해당 정보를 통해 gspread라이브러리를 통해 구글시트에 연결합니다.

그 후 서비스계정의 key값을 통해 원하는 구글 시트에 접근 가능합니다. 이때 key값은 GoogleCloudPlatform에서 생성했던 서비스계정의 key값입니다. 다운받은 JSON파일과는 다른겁니다.

마지막으로 문자열이 작성된 시트의 이름을 입력해 해당 시트를 읽을 수 있습니다.

구글시트 CSV파일로 변환

# 모든 값을 list로 가져오기
sheetData = sheet.get_all_values()
if sheetData:
    print("*** GoogleSpreadSheet data extraction completed ***")

# CSV파일로 변환
with open(CSV_FILE_PATH, 'w', newline='') as f:
    # using csv.writer method from CSV package
    write = csv.writer(f)

    #write.writerow(fields)
    write.writerows(sheetData)
    print("*** Convert GoogleSpreadSheet to .csv completed ***")
    f.close()

 

구글 시트에서 모든 행열의 데이터를 읽어 sheetData에 저장합니다.

그 후 쓰기전용으로 csv파일을 생성해 모든 데이터를 csv파일에 작성후 저장합니다.

저는 이 부분을 혹시모를 상황에 대비해 백업 데이터를 남기기 위해 사용했습니다.

변환한 CSV 파일을 이용해 문자열 파일 생성하기

# CSV파일 읽기
csvFile = open(CSV_FILE_PATH, 'r')
reader = csv.reader(csvFile)

languageList = []
codes = []

# 언어 코드 가져오기
for i in reader:
    codes = i[2:]
    print(codes)
    break

for i in codes:
    languageList.append(re.findall('[a-z_]{2}', i)[0])

# 컬럼값으로 디렉토리 생성
for i in languageList:
    os.makedirs(LPROJ_PATH + i + '.lproj', exist_ok=True)
csvFile.close()

# Strings 파일 작성
for code in languageList:
    # CSV파일 열기 읽기전용
    csvFile = open(CSV_FILE_PATH, 'r')
    reader = csv.reader(csvFile)

    # Localizable.strings파일 열기 쓰기전용
    stringFile = open(LPROJ_PATH + code + '.lproj/Localizable.strings', 'w')

    # 코드가 몇번째 인덱스인지 확인
    index = languageList.index(code)

    # CSV파일에서 한줄씩 읽어와 Strings파일 작성
    for line in reader:
        if line[0] != "" :
            if line[0] == "Description" : continue
            stringFile.write("\n//" + line[0] + "\n")
        if line[1] != "" :
            if line[1] == "Keys" : continue
            stringFile.write("\"" + line[1] + "\" = \"" + line[2+index] + "\";\n" )
    # 파일 닫기
    csvFile.close()
    stringFile.close()

csv파일을 읽어 작성된 언어코드를 불러옵니다. 언어 코드는 정규식을 통해 영어만 읽어 언어코드로 변환하도록 작성했습니다. 이때 언어코드는 xcode에서 설정하는 언어코드와 동일하게 해주셔야합니다.

 

작성된 언어코드로 해당 디렉토리를 먼저 생성합니다. strings 파일이 담길 디렉토리는 ko.lpro, en.lproj 이런식으로 코드.lproj 입니다.

exist_ok = TRUE 옵션을 통해 이미 생성돼있다면 넘어가줍니다.

 

언어코드별로 strings파일을 생성하는 과정을 진행합니다. 먼저 해당 code.lproj 디렉토리에 Localizable.strings파일을 쓰기전용으로 생성합니다. 해당 파일에 첫번째 열은 주석으로 두번째 열은 key값으로 그리고 해당 코드의 열을 value값으로 생성합니다. 

이런식으로 문자열 파일 형식에 맞게끔 작성됩니다. 그 후 파일을 저장합니다.

스크립트 등록하기

작성된 스크립트를 실행하기 위해서 python script.py 로 실행하면 됩니다. 자신의 python버전에 맞게 실행하시면 됩니다. 

이 스크립트를 저희는 프로젝트가 빌드되기 이전에 실행되도록 설정합니다.

스크립트 등록법은 해당 포스팅에서 설명했으니 확인해보시면 됩니다.

https://cheonsong.tistory.com/18

 

[iOS] iOS프로젝트에 Script 설정하기 (with Tuist)

이번에는 프로젝트에 스크립트를 설정하는 방법에 대해 포스팅하겠습니다. 대표적으로 스크립트를 설정하는 라이브러리로 Firebase, SwiftLint가 있습니다. XcodeProj Build Phase 설정하기 원하는 프로젝

cheonsong.tistory.com

이런식으로 자동으로 문자열이 갱신됩니다.

마치며

자동화는 생산성을 향상시키는데 정말 큰 도움을 주는것 같습니다.

전체 소스코드는 https://github.com/cheonsong/iOS_Localize_gs2strings

 

GitHub - cheonsong/iOS_Localize_gs2strings: Localizing script written in Python for iOS

Localizing script written in Python for iOS. Contribute to cheonsong/iOS_Localize_gs2strings development by creating an account on GitHub.

github.com

확인 가능합니다. 궁금하신점은 메일이나 댓글로 달아주시면 감사하겠습니다.

복사했습니다!