티스토리 뷰

iOS

iOS ) NSLocalizedString with variables

Zedd0202 2019. 5. 11. 16:55
반응형


안녕하세요 :) Zedd입니다.
로컬라이징을 생각하고있는데 갑자기 궁금증이 들어서 글을 쓰게되었...

만약에 음..막 “방금 전”이런건 괜찮지만 “10분 전”이런거는 로컬라이징 어떻게 할까요??

“어쩌고님이 댓글을 남겼습니다”
이런거는 로컬라이징 어떻게 할까요??

로컬라이징의 원리(?)가 localizable.string에 가서  해당 스트링을 교체?해주는 그런거라고.....는 확신을 못하겠는데 

그런 느낌이잖아요? 
근데 “어쩌고”는 계속 바뀔 수 있는 거고 “님이 댓글을 남겼습니다”는 고정이고. 

이걸 따로 Label을 만들어서 하는건 개오바쎄바....

그럼 어떻게 하는지 공부해봅시댜

음 로컬라이징에 대해 모르시는 분들은

iOS ) 왕초보를 위한 로컬라이징 / Localizing Your App

iOS ) 왕초보를 위한 로컬라이징 / Info.plist


를 읽고오시면 될듯..ㄹㅎ

제가 저때는 메소드의 원형을 안보고..걍 했었네요.



그럼 원형을 봅시다.

key와 comment만 필수로 넣어줘야 하고 나머지는 기본값이 있네요


key는 감이 오시다 시피..


여기서 앞의 "안녕"이 key입니다.


제가 위 글에서



이렇게 함수로 만들었네요 key를 봤으니 tableName을 봅시다.

tableName은 key-value쌍이 들어있는 table의 이름입니다. 그니까 



얘네의 이름입니다. 그래서 제가 Localizable을 넣어준것 같은데.....

tableName은 지금보니 nil이 들어가도 상관없네요? 음..그럼 코드를 개선해보겠습니당



이렇게요. tableName은 기본값으로 nil이니까 빼준겁니다. 

그럼..지금 key봤고 tableName봤고..bundle도 기본값..이라서 빼줬습니다. 

bundle은 위 .strings을 포함하고 있는 번들을 의미합니다. 



명시안하면 기본적으로 main bundle을 사용하게 되어있습니다.


그럼 다음 value와 comment가 남았네요.

comment가 필수 값이니까 comment부터 봅시다.


comment는 쉽게 말하면 주석입ㄴ디ㅏ!!!!!

이 key가 어떤 상황에서 어떤 의미인지 의미를 추가하는데 사용된다고 생각하시면 됩니다. 

그냥 다른사람이 내 코드를 딱 봤을 때 이 key가 무엇을 나타내는지 더 쉽게 알 수 있게 되죠.



...이렇게 쓰는거 맞지.?>?>

그니까 뭐 동음이의어..같은거를 localizing할 때, comment로 이게 어떤 의미의 단어인지 알려주면 좋겠네요.


그럼 마지막으로 value.

위에서 key를 했죠! 그럼 value는 뭐겠음..




Hello가 value가 되게 됩니다.

하지만!!!!!!!!!!!!!!!!!!!!!!!

만약에 제가 음..위처럼 Localizable.strings에 "안녕" = "Hello"; 이라는 key-value를 추가하는걸 까먹었어요


그리고 제가 코드에서

"안녕".localized()를 호출한거죠.


자 시스템 입장에서..."안녕"을 localize해야하는데..table에 가보니까 "안녕"이라는 key가 없는거야..

그럼 어캄


그러며는~~ 이 value에 있는 값을 쓰게 됩니다. 

실험해볼까요?




그리고 



를 호출해볼게요.

근데 지금 Localizable.strings에는 "안녕"이라는 key가 없습니다.


정확히는 Localizable.strings(English)에 없습니다. 

지금 시뮬레이터의 언어가 English인데, 그럼 Localizable.strings(English)만!! 본다는 소리입니다.

Localizable.strings(Korean)에 "안녕" = "안녕";이 있어도 아무런 효과가 x


당연한가요..? 그냥 혹시나해서 말해봤음 ㅎ

그러고 실행하면


value에 넣어줬던 "Zedd"가 찍히게 되죠.


ㅇㅋ??

아 나 왜 value에 "**\(self)**"라고 했지?zzzzzzzz

진짜....**..옛날의 제드......노답스



기본값은 ""이지만,

나는 만약에 발견 못하면 그냥 그 string그대로 보여주고 싶다..하면



이렇게 self를 넣어줍시다.



나는 메소드 원형보면 내가 처음에 가진 궁금증들 해결할 수 있을 줄 알았는디...끝났네..

뭐지ㅎ

이 글을 쓴 이유..까먹었을까바 다시 한번 말하지만




만약에 음..막 “방금 전”이런건 괜찮지만 “10분 전”이런거는 로컬라이징 어떻게 할까요??

“어쩌고님이 댓글을 남겼습니다”
이런거는 로컬라이징 어떻게 할까요??




그럼 검색해서 알아봅시다.


아 ㅇㅋㅇㅋ

일단..음...일단!!!!!


%d, %@ 이런 포맷들 아시나요?

%d는 Int, %@는 string..


음..일단 예제로 하나 봅시다.

Swift의 String에는 정말 많은 이니셜라이저가 있는데,

그 중에서



이렇게 format이라고 생긴게 있습니다.

이걸 어케 쓰냐ㅐ면..



이렇게!@


%d - int

%f - float 

%ld - long 

%@ - string value and for many more.


이렇다고 합니다. 

만약에 포맷대로 value타입을 제대로 넣어주지 않으면..

에러가 나거나



이런 현상이 나타날 수 있으니..조심하세여ㅛ..


아무튼 로컬라이징에서도 저 포맷을 사용하면 됩니다.

그럼 먼저 어떤식으로 해야할지 일단 생각해봅시다.


일단 Localizable.strings에 key-value를 추가해야겠네요.



음..근데 이 Key이름을..다들 어떤식으로 하시나요?

저는 이게 보는 사람이 더 잘 이해 할 수 있어서 좋다고 생각하는데, 

다른 프로젝트를 보니까..snake표기법으로 변수 이름 짓듯이 지은 프로젝트도 있어서요!

위에꺼로 예를들면 Time_Description_In_Minutes..이런 느낌이려나???

흠..이건 뭐 팀바팀..이니 동료들과 협의를 하면 좋을 것 같아요!!


자 일단 추가를 했으니 사용을 해봅시다.

위에서 한번 써봤던 String(format: , argument)이니셜라이저를 사용해볼거에요.



그리고 이런식으로 하면 됩니다.

 key가 "%d 분전"이니 이걸 먼저 localize하면 "%d minutes ago"가 리턴되겠죠? 

왜냐면 Localizable.stings에 

이게 있으니까???

그러면 위 코드는


이게 될거고, 위에서 봤던것 처럼 %d에 argument로 넣어준 10이 들어가게 될 거고!!!

결과적으로

이렇게 나오게 되겠죠.

오오오


음 근데 지금 format을 안맞춰주면, 그러니까 Int를 넣어줘야 하는데 String 타입으로 argument를 넣어줄 수 있잖아요?...그럼 앱이 crash날 수 있는 상황까지..올 수 있으니까!


그래서 제 생각은 key에 %d든.. %@든 이 포맷이 보이는게 더 좋은듯..? 

그래야 내가 어떤 type으로 넘겨야 할지 알 수 있으니까요!



얘네를 좀 예쁘게 쓸 수 있도록 해봅시다.



사실 위 두 코드를 합칠 수도 있지만...그냥 이렇게 해줄게요! 합치면 너무 눈아픔


깔-끔



로컬라이징 열시미 해야지~~


참고 : https://blog.calicastle.com/localization-in-ios-tutorial-using-swift-2f316105b447





반응형

'iOS' 카테고리의 다른 글

iOS ) Core Animation  (0) 2019.05.14
iOS ) Fabric적용해보기  (2) 2019.05.12
iOS ) AnimationOptions - etc  (2) 2019.05.10
iOS ) AnimationOptions - transition  (0) 2019.05.09
iOS ) AnimationOptions - curve  (4) 2019.05.08