Skip to content

Commit 6ca0edc

Browse files
[Article] 다국어 아티클 보완
[Article] 다국어 아티클 보완
2 parents 830ad0f + 7f8b604 commit 6ca0edc

File tree

3 files changed

+82
-7
lines changed

3 files changed

+82
-7
lines changed

_posts/how-to-support-i18n.md

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,10 @@ t("번역키1", {
213213
```
214214

215215
이것에 대한 정확한 기술이름을 못찾아서 이것을 `리플레이스 태그 방식`이라고 자칭했습니다.
216-
이렇게되면 조금 더 `Frotnend` 개발에 유연한 방식으로 구현할 수 있고 번역 객체에는 정말 필요한 번역 문구만 지정할 수 있게됩니다.
216+
이렇게되면 조금 더 `Frontend` 개발에 유연한 방식으로 구현할 수 있고 번역 객체에는 정말 필요한 번역 문구만 지정할 수 있게됩니다.
217217

218218
이전 직장에서도 이러한 방식을 사용해왔기 때문인지 몰라도 저는 이 방식을 주장해왔습니다.
219219

220-
그래서 이 의견을 설득시키는 과정에서 CTO 분이랑 정말 많은 의견 교류를 했었지만...
221-
222220
**결국 저는 패배했습니다.**
223221

224222
이것이 가져다주는 명확한 장점이 무엇인지 설득을 잘 못했거든요.
@@ -355,10 +353,87 @@ export default elementReplacer;
355353

356354
이제, 위와 같은 동작을 통하여 클랩에서도 다국어를 지원할 수 있는 준비가 되었습니다.
357355

358-
다른 클라 개발자분들도 쉽게 사용할 수 있도록 [API 문서](https://celestial-juice-f35.notion.site/useLocalized-API-Docs-163c17b94c2f80ec87abfa9735df409b?pvs=4)와 사용 예시가 담긴 데모 페이지를 제공했습니다.
359-
360356
![SLACK3](/assets/blog/how-to-support-i18n/image3.png)
361357

362-
기반 작업은 완료되었지만, 아직 클랩의 다국어 변환은 진행중이에요.
358+
=이 아래부터는 글 작성일로부터 100일이 지난 시점에 추가된 내용입니다.=
359+
360+
위의 기반작업으로 다국어 기반 작업을 다졌고, 실제 프로덕션에 반영이 된지 100일이 지났습니다.
361+
362+
결론부터 말씀드리면 위에서 설명드린 기반 작업은 미약했었습니다. (여러므로 비효율 적인 부분들이 많았었거든요.)
363+
364+
**1. 기존에 한글 문구로 있는 부분들을 전부 다국어 Key 값으로 변경해주어야한다.**
365+
366+
비지니스에서의 기능 개발이라는 것은 신속하고 문제가 없이 완료가 되어야합니다.
367+
368+
하지만 기존에 존재하던 다양한 한글 문구들이 있고 그걸 하나하나 다국어 키로 변환해주는 과정이 비효율적이였습니다.
369+
370+
3000개가 넘는 문구들을 한명이 변환하기에는 부족했었죠. 그래서 클랩 팀에서는 총 4명이서 "다국어 스쿼드"를 구성하여 엑셀 시트에 있는 Line Number를 기준으로 변환 작업을 진행해갔습니다. 그 과정이 결코 쉽지만은 않았습니다. 단순 반복작업이 반복되다 보니 피로감이 쉽게 쌓였었습니다.
371+
372+
그래서 그걸 타파하기 위해서 다양한 발악(?)을 해봤었습니다.
373+
374+
![SLACK4](/assets/blog/how-to-support-i18n/image4.png)
375+
376+
하지만 이것이 근본적으로 피로감을 해결해주진 못했었습니다. 도움은 되었지만요.
377+
378+
아직까지 풀어나가야할 숙제이긴 합니다만 저는 CLI 형태로 한글 문구들을 자동으로 Replace 시켜주는 기능을 개발해보려고 합니다.
379+
380+
이것도 개발이 완료되는 시점에 사용해보고 후기 글을 남기도록 할게요.
381+
382+
**2. 다국어 문구를 업데이트할 때 실수를 하게된다.**
383+
384+
문구를 다국어로 변환할때 동적 변수 값들도 함께 전달을 해주어야합니다. 이 과정에서 실수가 굉장히 많이 나왔었어요.
385+
386+
전달해주어야하는 동적변수를 누락하여 전달한다던지, 동적변수에 오타가 발생하여 UI가 깨지는 문제가 발생한다던지.
387+
388+
저희 다국어 스쿼드는 이 문제를 런타임 환경이 아니라 사전에 타입으로 인지할 수 있으면 좋을 것 같다는 생각을 했었어요.
389+
390+
그런데 그러려면 다국어 키를 생성할 때마다 해당 키에 맞는 동적변수를 하나하나 추가해주고 관리해주어야해서 매우 비효율적이였는데요.
391+
392+
다행히도 다국어 값들에 패턴이 존재하더라구요.
393+
394+
`다국어키 : "문구문구 {동적변수1} 문구문구 {동적변수2} 문구문구"`
395+
396+
여기서 `동적변수1`, `동적변수2`에 해당하는 타입만 추출해서 타입으로 제공해주면 되잖아요.
397+
398+
그래서 저는 이런 타입을 추출해주는 것을 자동으로 해주는 스크립트를 만들었어요.
399+
400+
해당 스크립트를 실행하면 아래와 같이 타입이 자동 생성되게 됩니다.
401+
402+
```ts
403+
export type MessageVariables = {
404+
"adminSettings.removedAsAdmin": { user: React.ReactNode | React.ReactElement[] };
405+
"adminSettings.addedBy": { user: React.ReactNode | React.ReactElement[] };
406+
"adminSettings.excludedFrom": { role: React.ReactNode | React.ReactElement[] };
407+
"adminSettings.confirmExcludeUser": {
408+
user: React.ReactNode | React.ReactElement[];
409+
role: React.ReactNode | React.ReactElement[];
410+
};
411+
...
412+
}
413+
```
414+
415+
**3. 다국어 시트를 업데이트하는 방식이 비효율적이다.**
416+
417+
저희 다국어 스쿼드는 구글 시트에 다국어 값들을 관리하고 있었는데 예전에는 구글 시트에 AppScript를 돌려서 JSON을 추출하는 방식을 사용했었어요.
418+
419+
그러면 매번 문구가 업데이트 될때마다 구글 시트에 가서 JSON 파일을 추출하고 에디터에 해당 파일을 업데이트 해주어야 했었어요.
420+
421+
이 과정이 불편했고 개선하고 싶었습니다.
422+
423+
그래서 CLI를 통해서 메시지 업데이트하는 과정을 자동화하도록 설정하였습니다.
424+
425+
![SLACK5](/assets/blog/how-to-support-i18n/image5.png)
426+
427+
**4. 다국어 작업 이후로 프로덕션의 속도가 느려졌다.**
428+
429+
아무래도 다국어 JSON파일의 크기가 크다보니까 프로덕션의 속도가 느려진게 체감이 되었습니다.
430+
431+
이 성능 개선은 여전히 클랩 내에서 많은 분들이 고민해주고 계시고 개선이 될 예정입니다.
432+
433+
## 마무리하며
434+
435+
추후에 다국어 관련해서 공유드릴 내용이 더 생기면 공유드릴수 있도록 하겠습니다.
436+
437+
참고로 저희 클랩에서 클라이언트 개발자 채용을 진행중입니다. 이 글을 읽고 같이 다국어 작업 개선을 하고 싶으신 개발자분들은 지원해주시면 감사하겠습니다.
363438

364-
위 방식을 사용하면서 불편한 점이나 변경된 내용이 있으면 해당 글에 내용을 추가하도록 하겠습니다.
439+
[클랩(CLAP) 프론트 엔드(React) 개발자 채용 사이트](https://dwhale.career.greetinghr.com/o/114732)
124 KB
Loading
395 KB
Loading

0 commit comments

Comments
 (0)