ํ”„๋กœ์ ํŠธ/Today I Define

[ Swift ] Localization ์ ์šฉ ๋ฐ ๋ฐฉ๋ฒ•(feat.Today I Define)

๊ฒฝํ‘ธ 2022. 9. 26. 18:30
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”~ 

 

์˜ค๋Š˜์€ ๊ฐœ์ธ ์•ฑ์„ ํ†ตํ•ด์„œ ์ ์šฉํ–ˆ๋˜

Localize ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค : )

 

์ ์šฉ ๋ฐฉ๋ฒ•

1. Project - Info - Localizations์—์„œ + ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  ์ ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์–ธ์–ด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

2. ์–ด๋””์— ์ ์šฉํ•˜๊ณ  ์‹ถ์€์ง€ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

3. Strings File ์ถ”๊ฐ€ํ•˜๊ธฐ (ํŒŒ์ผ ์ด๋ฆ„์€ Localizable๋กœ ๋งŒ๋“ค๊ธฐ)

4. ์šฐ์ธก ์ฐฝ(Inspector)์—์„œ ์ง€์›ํ•˜๊ณ ์ž ํ•˜๋Š” ์–ธ์–ด๋ฅผ ์„ ํƒํ•˜๊ธฐ

 

์—ฌ๊ธฐ์„œ ์Šคํ† ๋ฆฌ๋ณด๋“œ์˜ ๊ฒฝ์šฐ์—๋Š” ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

 

์Šคํ† ๋ฆฌ๋ณด๋“œ๋„ ์ฒดํฌํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด Localize ํŒŒ์ผ์ด ์ƒ๊ฒผ์„ ํ…๋ฐ 

ํ•ด๋‹น localizable ํŒŒ์ผ์— ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์ด ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

/* Class = "UILabel"; text = "์„ค์ •"; ObjectID = "2Q5-Fx-Kwa"; */
"2Q5-Fx-Kwa.text" = "์„ค์ •";

 

์—ฌ๊ธฐ์„œ ์›ํ•˜๋Š” ๋ฌธ๊ตฌ๋กœ ๋ฐ”๊พธ๊ณ  ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ขŒ์ธก์˜ ๊ฒฝ์šฐ ObjectID๋กœ ๋ณต์‚ฌ ์ดํ›„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ•ด๋‹น ์Šคํ† ๋ฆฌ๋ณด๋“œ์˜ ์˜ค๋ธŒ์ ํŠธ๋กœ ์ด๋™๋˜๋ฏ€๋กœ ํ™•์ธํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

5. Localize ํŒŒ์ผ ์ž‘์„ฑ ์˜ˆ์‹œ

๊ธฐ์กด์—๋Š” "month" = "month"; ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ–ˆ์œผ๋‚˜

Script๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Localize ์ฒ˜๋ฆฌ๊ฐ€ ๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด ์ฃผ์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

month = "month";
day = "day";

 

6. String์˜ Extension์— Localized ์ž‘์„ฑํ•˜๊ธฐ

๊ฒฐ๊ณผ์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ

 

// I18N.month๋ฅผ ์ด์šฉํ•ด ์›”์—๋Œ€ํ•œ ๋กœ์ปฌ๋ผ์ด์ฆˆ ์ฒ˜๋ฆฌ
class I18N {
   static let month = "month".localized
}

 

์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” localized๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด String์—์„œ Extension์„ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

 

 

7. ๊ฐ€์žฅ ์ค‘์š”ํ•œ I18N ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” Script ์ž‘์„ฑํ•˜๊ธฐ

[์ฐธ๊ณ ์‚ฌํ•ญ]
I18N์€ Internationalization์˜ ์•ฝ์ž๋กœ ๊ตญ์ œํ™”๋ž€ ๋œป์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๋ช…์€ ์ž์œ ๋กญ๊ฒŒ ์ž‘์„ฑํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Project - Target - Build Phases๋กœ ๋“ค์–ด๊ฐ€์„œ ์ƒˆ๋กœ์šด Script๋ฅผ ์ƒ์„ฑ(์ขŒ์ธก ์ƒ๋‹จ์˜ + ๋ฒ„ํŠผ)ํ•˜๊ณ  ๋‚˜์„œ

์•„๋ž˜์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

touch tempI18N.swift
echo "struct I18N {" >> tempI18N.swift
file="${SRCROOT}/์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ ํด๋”/ko.lproj/Localizable.strings"
// ๋งŒ์•ฝ Memo๋ผ๋Š” ํด๋”์•ˆ์— Resource๋ผ๋Š” ํด๋”๊ฐ€ ์žˆ๊ณ  ๊ทธ์•ˆ์— Localize ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
// file="${SRCROOT}/Memo/Resource/ko.lproj/Localizable.strings" 
while IFS= read -r line
do
variableName=$(echo ${line%%=*})
if [ "$variableName" != "" ]
then
echo "    static let $variableName = \"$variableName\".localized" >> tempI18N.swift
fi
done <"$file"

echo "}" >> tempI18N.swift

cat "tempI18N.swift" > ${SRCROOT}/ํ”„๋กœ์ ํŠธ ํด๋”/I18N.swift  
// temp18N.swift ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์„œ ์›ํ•˜๋Š” ๊ณณ์— ๋ณต์‚ฌํ•ด์ฃผ๋Š” ๊ตฌ๋ฌธ์ด๋ฏ€๋กœ
// ์ €์žฅ๋˜๊ธธ ์›ํ•˜์‹œ๋Š” ์œ„์น˜๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”~
rm tempI18N.swift

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์œ„์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์„ค๋ช…ํ•ด ๋ณด๋ฉด

tempI18N.swift๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ 

๊ธฐ์กด์— ๋งŒ๋“ค์–ด ๋’€๋˜ Localize ํŒŒ์ผ ์ค‘ ko.lproj์—์„œ 

ํ•œ ์ค„, ํ•œ ์ค„ ์ฝ์–ด๊ฐ€๋ฉฐ ์ €ํฌ๊ฐ€ ์›ํ•˜๋Š” ํฌ๋งท์œผ๋กœ ์ž‘์„ฑํ•ด์„œ

์›ํ•˜๋Š” ๊ฒฝ๋กœ์— ๋ถ™์—ฌ์ฃผ๋Š” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  Build๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด I18N์ด๋ผ๋Š” ์†Œ์ŠคํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

8. ์‚ฌ์šฉํ•˜๊ธฐ

์ด์ œ Localize ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด

์ž๋™์œผ๋กœ I18N ํด๋ž˜์Šค์—์„œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒ์„ฑ๋˜๊ฒŒ ๋˜๊ณ  

์ €ํฌ๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

label1.text = I18N.month
// ํ•œ๊ตญ์–ด๋ผ๋ฉด ์›”
// ์˜์–ด๋ผ๋ฉด month
label2.text = I18N.day
// ํ•œ๊ตญ์–ด๋ผ๋ฉด ์ผ
// ์˜์–ด๋ผ๋ฉด day

 

 


 

 

 

๋‹ค๋“ค ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋งŒ  ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป

๋ฐ˜์‘ํ˜•