SwiftUI Localization(현지화)

마이노·2024년 2월 21일
8

15주 글쓰기 🐣

목록 보기
1/10
post-thumbnail

Localization

앱을 현지화(Localization)하는 방법을 알아봅시다.

Localization이란 무엇일까요?

앱을 출시할 때 하나의 나라에서만 출시할 것이라면 사실 현지화가 필요하지 않습니다. 하지만 여러 언어와 해당 지역의 언어로 번역하고 적용해서 많은 사람들이 사용할 수 있게끔 앱스토어에 출시를 해야한다면 하나의 언어로만으로는 해결이 되지 않을 것 입니다. 이를 해결하기 위한 방법이 바로 Localization(현지화) 입니다.

간단한 현지화 방법

  1. String File 생성

  2. 파일생성
    이름은 그대로 Localizable로 생성해주어야 합니다.

  3. Localize 진행

    xcode를 확장하고 Localize 버튼을 눌러줍니다.

  4. 언어 추가

    +를 클릭 후 추가하고 싶은 언어를 추가해주면 됩니다.

    저는 한국어와 영어 총 2개의 Localization에서 추가했습니다.

    그렇기에 Localizable에는 2개의 파일이 만들어진 상태입니다. 각각의 파일에 알맞은 언어를 추가해줌으로써 현지화 작업은 끝입니다.

  5. 결과 확인

    이를 preview에서 간단히 확인할 수 있습니다.

    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {  
            ContentView()
            ContentView()
                .environment(\.locale, .init(identifier: "ko"))
        }
    }

    이렇게 간단히 localization을 할 수 있습니다.

    하지만 실제 앱에서는 이와 같이 정적인 값을 보여주는 경우보다 훨씬 다양한 경우가 존재합니다.


앱 이름 설정은 어떻게..?

  1. Localizable 파일을 생성할 때와 동일하게 InfoPlist 파일을 만들어야 합니다.
  2. 파일을 만든 후 Xcode 상단 우측에 있는 버튼을 눌러 확장을 시키고 Localize을 클릭
// InfoPlist (Korean)
"CFBundleDisplayName" = "로컬라이제이션 공부";
"CFBundleName" = "로컬라이제이션 공부";

// InfoPlist (English)
"CFBundleDisplayName" = "Localization Study";
"CFBundleName" = "Localization Study";

다음과 같이 각각의 파일에 입력해주면 끝입니다.

그렇다면 어떻게 테스트해볼 수 있을까요? 두 가지의 간단한 테스트 방법이 존재합니다.


Localization은 어떻게 테스트 해볼 수 있나요??

  1. 시뮬레이터 설정에 들어가서 언어를 변경하는 방법

    자신이 추가한 Localization의 언어추가를 통해 우선순위를 지정해줄 수 있습니다.

    꾹 눌러서 옮긴 후 우선순위의 언어를 적용할 수 있습니다.

현재는 한국어가 우선순위로 되어있기 때문에 앱 이름이 한글로 나오는 모습을 볼 수 있습니다.

반대로 영어가 우선순위에 있다면 앱 이름은 당연하게도 영어로 나오게 됩니다. 실제 앱을 들어가서 확인하면 이전에 간단히 설정했던 Localization이 적용된 언어로 보이게 됩니다.

  1. Xcode Build 설정

[Product] → [Scheme] → [Edit Scheme]

[App Language] 선택

이 방법은 빌드 시 언어를 설정할 수 있는 방법입니다.

앞서 설명드린 방법은 시뮬레이터 상에 이전에 설치되어 있던 앱을 실행하는 방법이었어요. 하지만 빌드 설정을 따르면 앱을 실행함과 동시에 앱 언어를 설정할 수 있다는 장점이 있습니다.


접근권한 설정 방법

먼저 위치정보를 가져오고 싶다고 가정합니다.

// InfoPlist (Korean)
"NSLocationAlwaysUsageDescription" = "위치정보";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "위치정보";
"NSLocationWhenInUseUsageDescription" = "위치정보";

// InfoPlist (English)
"NSLocationAlwaysUsageDescription" = "Location Please~~";
"NSLocationAlwaysAndWhenInUseUsageDescription" = "Location Please~~";
"NSLocationWhenInUseUsageDescription" = "Location Please~~.";

다른 정보도 가져오고 싶은데 이름을 모르는 경우가 있습니다. 보통 NS를 앞에 붙여주고 권한명을 붙여주면 됩니다. 두번째 방법도 존재합니다. 우리는 info.plist에 ‘위치정보’ 라는 값을 넣어주었습니다.

// InfoPlist (Korean)
"위치정보" = "위치정보";

// InfoPlist (English)
"위치정보" = "Location Please~~";

두 가지의 방법이 존재하기 때문에 사용자가 원하는 스타일에 따라 사용하시면 됩니다.


문자열 보간법으로 넣은 값을 Localization 하기

// Localizable (English)
"안녕 %lld" = "hello %lld";
"안녕 %@" = "hello %@";

// Localizable (Korean)
"안녕 %lld" = "안녕 %lld";
"안녕 %@" = "안녕 %@";

// 사용부
...
let number: Int = 10
let string: String = "mino"

Text("안녕 \(number)")
Text("안녕 \(string)")

%lld는 Int형이 들어왔을 때 처리할 수 있게 해주고,

%@는 String형을 처리할 수 있게 해줍니다.


한눈에 보기 쉽게 하는 방법

[1] 외부로 방출하기 클릭

[2] 방출하게 될 저장소를 만들고 방출하기

성공적으로 방출을 하게되면 지정해둔 이름의 저장소가 만들어집니다.

현재 저희의 Localization은 총 2개입니다. 한국어와 영어 두가지가 있어요.

2가지의 파일이 생성됨!

Localizable에서 직접 입력한 것들을 보기 쉽게 표 형식으로 만들어주게 됩니다. 이를 애플에서는 번역가들에게 작업을 위한 분리를 할 수 있게 만들어 준다고 하네요.

저희는 개인이나 소규모인 프로젝트에 익숙할테니 보다 관리하기 편하게 제공해주는 기능이다! 로 알고계시면 될 것 같습니다. 폴더도 저희가 만든 폴더랑 똑같기 때문에 방출한 값들을 수정하여 프로젝트에 덮어씌우는 형식으로 관리를 할 수 있습니다.

해당 방법은 Xcode 15미만일 때 해결가능한 현지화 방법입니다. 다음 시간에는 Xcode 15이상일 때 문자열 카탈로그를 사용한 지역화 방법에 대해 알아보겠습니다.!

profile
아요쓰 정벅하기🐥

7개의 댓글

comment-user-thumbnail
2024년 2월 23일

이렇게 하는 거였군요..
저는 언어별 텍스트 enum 같은 걸 만들어서 하는 줄 알았네요

막상 여러 언어를 지원하려고 하면 한국어로는 딱 사이즈가 맞는 디자인인데 영어로는 공간이 모자라다던지 하는 머리아픈 일이 발생하죠 ㅋㅋㅋ
심지어 아랍어는 오른쪽에서 왼쪽으로 읽는다고 하죠

이런 케이스는 어떻게 대처하는 게 좋을지 (디자이너랑 이야기해야되겠지만) 생각해보는 것도 좋을 것 같아요

1개의 답글
comment-user-thumbnail
2024년 2월 23일

굉장히 알기 쉽게 차근차근 적어주셨네요
나중에 앱 만들고 Localizing 해야 한다면 차근차근 적어주신대로 따라해보면서 익혀보겠슴다

좋은 글 공유해주셔서 감사합니다 ㅎㅎ

1개의 답글
comment-user-thumbnail
2024년 2월 24일

저는 영어 공부를 위해 아이폰 언어를 영어로 설정해서 쓰고 있는 데, 가끔 새로운 앱을 다운받으면 영어로 나오기도 하고 한글로 나오기도 하더라고요!

글을 보면 위치 기반으로 언어를 선택하는 방식도 있고 사용자가 설정해둔 언어로도 선택하는 것 같은데
현업에서는 어떤 방식을 많이 사용하나요 ??

1개의 답글