본문 바로가기

IOS

Xcode - Google Sheet 에서 다국어 내용 가져오기

글로벌 프로젝트를 진행 하다보면 다국어 관련한 내용을 추가할일이 자주 있습니다.

그러다보면 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/ 구글 시트에 접속합니다.

 

Google 클라우드 플랫폼

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

accounts.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

 

Python quickstart  |  Google Sheets  |  Google Developers

Send feedback Python quickstart Stay organized with collections Save and categorize content based on your preferences. Quickstarts explain how to set up and run an app that calls a Google Workspace API. Google Workspace quickstarts use the API client libra

developers.google.com

https://yurimkoo.github.io/python/2019/07/20/link-with-googlesheets-for-Python.html

 

유림's Blog

베짱이가 되고 싶은 개미의 기술 블로그

yurimkoo.github.io

https://www.kodeco.com/25816315-using-swift-scripts-with-xcode 

 

Using Swift Scripts with Xcode

Learn how to run Swift scripts as part of the Xcode build phase, giving you control to configure or validate your app while building your project.

www.kodeco.com

https://yuda.dev/267

 

[Python] Service Account로 구글 스프레드시트 업데이트하기

읽지 않아도 되는 서론; 구글 시트를 업데이트하려면 당연히 별도의 인증절차가 필요하다. 업데이트하려는 자가 그 시트에 대한 접근 권한이 있는지 알아야 하기 때문이다. 이건 시트 공유 설정

yuda.dev

https://velog.io/@junsugi/Google-Sheet-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-feat.-Google-API

 

Google Sheet 연동하기 (feat. Google API)

구글 스프레드시트 연동하다 빡쳐서 쓰는 글

velog.io

 

'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