-
Swift Localization 처리하기(로컬라이징, 현지화)iOS/Swift 2022. 1. 14. 22:47
안녕하세요!! 이번엔 Swift에서 다국어 처리하는 방법을 정리했습니다.
이번 글도 노션에서 옮겨와 말이 짧습니다!! 양해해주세용😽
Localization
안녕하세요!! 이번엔 Swift에서 Localization에 대해서 정리했습니다. 이번 글도 노션에서 옮겨와 말이 짧습니다!! 양해해주세용😽 Localization이란? 언어, 문화권이 다른 환경에서 앱을 사용할 수 있도
makemakeway.tistory.com
Localization에 대해서 간략하게 정리해둔 글입니다.
Localization 설정하기
Localization을 설정하기 위해 프로젝트를 만들고 스토리보드에 Label을 추가해줬다.
Localization을 따로 설정하지 않으면, 이 Label들은 국가에 상관없이 정해진 글자만 출력한다.
Localization은 어플을 실행하는 국가에 따라서 저 Label들을 그 나라의 언어로 처리하는 것이다.
만약 어플을 사용하는 유저들이 우리나라로 한정되어있으면 딱히 설정할 필요가 없지만, 외국에 서비스를 계획중이라면 꼭 필요한 기능이다.
PROJECT → Info → Localizaion에서 처리하고 싶은 언어에 대해서 추가를 해줄 수 있다. 기본값은 역시나 English로 되어있다.
+를 눌러서 추가할 수 있고, -를 눌러서 추가한 것을 삭제할 수도 있다.
추가를 해주면, 하나만 있던 Main 스토리보드가 위에서 추가한 언어만큼 늘어난 것을 볼 수 있다.
Base는 기본언어인 English다!
Main(Korean)이나 Main(Japanese)를 눌러 들어가보면 다음과 같은 화면을 볼 수 있다. 뭔지 모르겠지만, 스토리보드에 올려두었던 Label의 Text값들이 보인다.
저 값들은 Label의 고유 ID로, Storyboard의 identity inspector 영역에서 확인할 수 있다.
이 고유 ID를 이용해서 Localizaion을 설정할 수 있다.
기본값인 Base(영어)에 대한 처리는 원래 하던 것 처럼 스토리보드에서 처리해주면 된다.
Main(Japanese)파일에 다음과 같이 Label의 텍스트를 설정해주고,
Korean 파일에는 Label의 텍스트에 한국어를 입력해주면 된다.
그리고 시뮬레이터의 설정 → 일반 → 언어 및 지역 → iPhone 언어에서 어떤 언어로 실행할 지 골라주면 결과를 확인할 수 있다. 일본어를 확인하기 위해 시뮬레이터의 언어를 일본어로 설정했다.
그리고 앱을 실행하면,
일본어로 설정한 대로 잘 나타나는 것을 확인할 수 있다!(2번째 줄은 오타....🥲)
Localization Upgrade🔥
위에서 설정한 방법은 스토리보드를 이용하여 설정한 방법이었는데, Localization을 위한 또 한가지 방법이 있다.
코드를 이용하여 Localization을 처리하는 방법이다.
먼저, Strings 파일을 추가해준다.
이때, 파일의 이름은 무조건 Localizable 이어야 한다. 무조건이다.. 무조건.....!
Localizable.strings에 들어가서 인스펙터 영역을 보면, Localization 항목이 있다.
Localization 항목에서 Localize... 버튼을 누르면,
이렇게 항목들이 생긴다. 원래는 English만 나오지만, 앞에서 PROJECT→Info→Localization에서 했던대로 언어를 추가할 수 있다. 이번에는 Korean만 추가를 해주었다.
알맞게 설정을 해주면, 이렇게 파일이 생성되어 있는 것을 볼 수 있다.
이 파일에서 Localization 처리를 해주면 된다!
Localizable.strings는 다국어 처리를 "key" = "value"; 형태로 할 수 있다.(맨 뒤에 꼭!!! 세미콜론 붙여야한다.)
Localizable.strings(English) Localizable.strings(Korean) 이런식으로, "tab_home"은 "홈"으로 Localization을 해주세요!! 라고 나타낼 수 있다.
그리고 스토리보드에서 tabBar를 만들고, ViewController에 연결시켜주었다.
@IBOutlet weak var tabBar: UITabBarItem! // 탭바 연결
그리고 각 탭바에 NSLocalizedString 메소드를 적용시켜주면 된다.
override func viewDidLoad() { super.viewDidLoad() self.navigationController?.navigationItem.title = "홈" self.tabBarController?.tabBar.items![0].title = NSLocalizedString("tab_home", comment: "") self.tabBarController?.tabBar.items![1].title = NSLocalizedString("tab_search", comment: "") self.tabBarController?.tabBar.items![2].title = NSLocalizedString("tab_calendar", comment: "") self.tabBarController?.tabBar.items![3].title = NSLocalizedString("tab_setting", comment: "") }
key는 위에서 작성했던 값과 같은 문자열을 넣어주면 되고 comment는 주석이라고 생각하면 된다.
대략적으로 key가 어떻게 사용되는지 적어두는 것 같지만, ""를 넣고 생략하기도 한다.
탭바 아이템이 여러개일 경우, items에 배열형태로 저장되어 있다. 여기서 하나하나 타이틀을 설정해주면 된다.
Localization Upgrade2🔥
매번 저렇게 NSLocalizedString을 사용하는 것이 조금 귀찮아서 찾아보니, Extension을 활용하는 방법을 찾을 수 있었다.
먼저, String에 Extension을 추가해준다.
extension String { func localized(bundle: Bundle = .main, table: String = "Localizable") -> String { return NSLocalizedString(self, tableName: table, bundle: bundle, value: self, comment: "") } }
번들은 우리가 사용하는 기본 번들을 넣어줬고, 테이블은 Strings의 이름을 써주면 된다.
반환값으로는 자기 자신의 문자열 값이 들어간 NSLoclizedString을 반환하게 된다.
"Add a story" = "스토리 추가"; "Add a story to a new place" = "새로운 장소에 추가하기"; "Add a story to the existing place" = "기존 장소에 추가하기"; "The existing place does not exist. Please create a new place." = "기존 장소가 없습니다. 새로운 장소를 추가해주세요.";
Localizable.strings에 이렇게 저장이 되어있다면,
뷰 컨트롤러에서
let sheet = UIAlertController(title: "Add a story".localized(), message: nil, preferredStyle: .actionSheet) let newlyTravel = UIAlertAction(title: "Add a story to a new place".localized(), style: .default) let existingTravel = UIAlertAction(title: "Add a story to the existing place".localized(), style: .default) self?.presentOkAlert(message: "The existing place does not exist. Please create a new place.".localized())
이런식으로 문자열에서 바로 localized 메서드를 호출해서 Localization 처리를 할 수 있게된다!!
'iOS > Swift' 카테고리의 다른 글
TableViewCell 내부의 UIView에서 Gesture로 이벤트 처리하기 (0) 2022.01.22 Swift SocketIO를 활용한 실시간 채팅 앱 구현 (0) 2022.01.15 Swift 위치정보를 받아서 행정구역 단위로 나타내기(역 지오코딩, reverse geocoding) (0) 2022.01.13 Delegate 패턴을 이용하여 TableViewCell 내부의 버튼 이벤트 처리하기 (0) 2022.01.13 UISearchBar에서 사용자가 입력을 멈췄을 때 자동으로 검색하기(실시간 검색) (0) 2022.01.11