@intlayer/docs 5.7.7 β†’ 5.8.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/blog/ar/intlayer_with_next-i18next.md +3 -4
  2. package/blog/ar/intlayer_with_next-intl.md +3 -4
  3. package/blog/ar/intlayer_with_react-i18next.md +1 -1
  4. package/blog/ar/intlayer_with_react-intl.md +1 -1
  5. package/blog/de/intlayer_with_next-i18next.md +3 -4
  6. package/blog/de/intlayer_with_react-intl.md +1 -1
  7. package/blog/en/intlayer_with_next-i18next.md +3 -4
  8. package/blog/en/intlayer_with_next-intl.md +3 -4
  9. package/blog/en/intlayer_with_react-i18next.md +1 -1
  10. package/blog/en/intlayer_with_react-intl.md +1 -1
  11. package/blog/en-GB/intlayer_with_next-i18next.md +3 -4
  12. package/blog/en-GB/intlayer_with_next-intl.md +3 -4
  13. package/blog/en-GB/intlayer_with_react-i18next.md +1 -1
  14. package/blog/en-GB/intlayer_with_react-intl.md +1 -1
  15. package/blog/es/intlayer_with_next-i18next.md +3 -4
  16. package/blog/es/intlayer_with_next-intl.md +3 -4
  17. package/blog/es/intlayer_with_react-i18next.md +1 -1
  18. package/blog/es/intlayer_with_react-intl.md +1 -1
  19. package/blog/fr/intlayer_with_next-i18next.md +3 -4
  20. package/blog/fr/intlayer_with_next-intl.md +3 -4
  21. package/blog/fr/intlayer_with_react-i18next.md +1 -1
  22. package/blog/fr/intlayer_with_react-intl.md +1 -1
  23. package/blog/hi/intlayer_with_next-i18next.md +3 -4
  24. package/blog/hi/intlayer_with_next-intl.md +3 -4
  25. package/blog/hi/intlayer_with_react-i18next.md +1 -1
  26. package/blog/hi/intlayer_with_react-intl.md +1 -1
  27. package/blog/it/intlayer_with_next-i18next.md +3 -4
  28. package/blog/it/intlayer_with_next-intl.md +3 -4
  29. package/blog/it/intlayer_with_react-i18next.md +1 -1
  30. package/blog/it/intlayer_with_react-intl.md +1 -1
  31. package/blog/ja/intlayer_with_next-i18next.md +3 -4
  32. package/blog/ja/intlayer_with_next-intl.md +3 -4
  33. package/blog/ja/intlayer_with_react-intl.md +1 -1
  34. package/blog/ko/intlayer_with_next-i18next.md +3 -4
  35. package/blog/ko/intlayer_with_next-intl.md +3 -4
  36. package/blog/ko/intlayer_with_react-intl.md +1 -1
  37. package/blog/pt/intlayer_with_next-i18next.md +3 -4
  38. package/blog/pt/intlayer_with_next-intl.md +3 -4
  39. package/blog/pt/intlayer_with_react-intl.md +1 -1
  40. package/blog/ru/intlayer_with_next-i18next.md +3 -4
  41. package/blog/ru/intlayer_with_next-intl.md +3 -4
  42. package/blog/ru/intlayer_with_react-i18next.md +1 -1
  43. package/blog/ru/intlayer_with_react-intl.md +1 -1
  44. package/blog/zh/intlayer_with_next-i18next.md +3 -4
  45. package/blog/zh/intlayer_with_next-intl.md +3 -4
  46. package/blog/zh/intlayer_with_react-i18next.md +1 -1
  47. package/blog/zh/intlayer_with_react-intl.md +1 -1
  48. package/dist/cjs/generated/docs.entry.cjs +41 -0
  49. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  50. package/dist/esm/generated/docs.entry.mjs +41 -0
  51. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  52. package/dist/types/generated/docs.entry.d.ts +1 -0
  53. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  54. package/docs/ar/CI_CD.md +67 -41
  55. package/docs/ar/formatters.md +239 -0
  56. package/docs/ar/interest_of_intlayer.md +162 -49
  57. package/docs/ar/introduction.md +3 -3
  58. package/docs/ar/packages/intlayer/index.md +3 -3
  59. package/docs/ar/packages/next-intlayer/index.md +3 -3
  60. package/docs/de/CI_CD.md +63 -37
  61. package/docs/de/formatters.md +239 -0
  62. package/docs/de/interest_of_intlayer.md +161 -47
  63. package/docs/de/introduction.md +3 -3
  64. package/docs/de/packages/intlayer/index.md +3 -3
  65. package/docs/de/packages/next-intlayer/index.md +3 -3
  66. package/docs/de/packages/react-intlayer/index.md +3 -3
  67. package/docs/en/CI_CD.md +51 -27
  68. package/docs/en/formatters.md +250 -0
  69. package/docs/en/interest_of_intlayer.md +159 -46
  70. package/docs/en/introduction.md +3 -3
  71. package/docs/en/packages/intlayer/index.md +3 -3
  72. package/docs/en/packages/next-intlayer/index.md +3 -3
  73. package/docs/en/packages/react-intlayer/index.md +3 -3
  74. package/docs/en-GB/CI_CD.md +58 -32
  75. package/docs/en-GB/formatters.md +239 -0
  76. package/docs/en-GB/interest_of_intlayer.md +160 -53
  77. package/docs/en-GB/packages/intlayer/index.md +3 -3
  78. package/docs/en-GB/packages/next-intlayer/index.md +3 -3
  79. package/docs/en-GB/packages/react-intlayer/index.md +3 -3
  80. package/docs/es/CI_CD.md +68 -42
  81. package/docs/es/formatters.md +239 -0
  82. package/docs/es/interest_of_intlayer.md +159 -47
  83. package/docs/es/introduction.md +3 -3
  84. package/docs/es/packages/intlayer/index.md +3 -3
  85. package/docs/es/packages/next-intlayer/index.md +3 -3
  86. package/docs/fr/formatters.md +239 -0
  87. package/docs/fr/interest_of_intlayer.md +160 -46
  88. package/docs/fr/introduction.md +3 -3
  89. package/docs/fr/packages/intlayer/index.md +3 -3
  90. package/docs/fr/packages/next-intlayer/index.md +3 -3
  91. package/docs/fr/packages/react-intlayer/index.md +3 -3
  92. package/docs/hi/CI_CD.md +69 -44
  93. package/docs/hi/formatters.md +239 -0
  94. package/docs/hi/interest_of_intlayer.md +158 -42
  95. package/docs/hi/introduction.md +3 -3
  96. package/docs/hi/packages/intlayer/index.md +3 -3
  97. package/docs/hi/packages/next-intlayer/index.md +3 -3
  98. package/docs/hi/packages/react-intlayer/index.md +3 -3
  99. package/docs/it/CI_CD.md +67 -41
  100. package/docs/it/formatters.md +239 -0
  101. package/docs/it/interest_of_intlayer.md +160 -46
  102. package/docs/it/introduction.md +3 -3
  103. package/docs/it/packages/intlayer/index.md +3 -3
  104. package/docs/it/packages/next-intlayer/index.md +3 -3
  105. package/docs/it/packages/react-intlayer/index.md +3 -3
  106. package/docs/ja/CI_CD.md +67 -41
  107. package/docs/ja/formatters.md +261 -0
  108. package/docs/ja/interest_of_intlayer.md +157 -48
  109. package/docs/ja/introduction.md +3 -3
  110. package/docs/ja/packages/intlayer/index.md +3 -3
  111. package/docs/ja/packages/next-intlayer/index.md +3 -3
  112. package/docs/ja/packages/react-intlayer/index.md +3 -3
  113. package/docs/ko/CI_CD.md +63 -37
  114. package/docs/ko/formatters.md +258 -0
  115. package/docs/ko/interest_of_intlayer.md +160 -48
  116. package/docs/ko/introduction.md +3 -3
  117. package/docs/ko/packages/intlayer/index.md +3 -3
  118. package/docs/ko/packages/next-intlayer/index.md +3 -3
  119. package/docs/ko/packages/react-intlayer/index.md +3 -3
  120. package/docs/pt/CI_CD.md +67 -41
  121. package/docs/pt/formatters.md +239 -0
  122. package/docs/pt/interest_of_intlayer.md +162 -47
  123. package/docs/pt/introduction.md +3 -3
  124. package/docs/pt/packages/intlayer/index.md +3 -3
  125. package/docs/pt/packages/next-intlayer/index.md +3 -3
  126. package/docs/pt/packages/react-intlayer/index.md +3 -3
  127. package/docs/ru/CI_CD.md +70 -44
  128. package/docs/ru/formatters.md +239 -0
  129. package/docs/ru/interest_of_intlayer.md +168 -50
  130. package/docs/ru/introduction.md +3 -3
  131. package/docs/ru/packages/intlayer/index.md +3 -3
  132. package/docs/ru/packages/next-intlayer/index.md +3 -3
  133. package/docs/ru/packages/react-intlayer/index.md +3 -3
  134. package/docs/zh/CI_CD.md +62 -36
  135. package/docs/zh/formatters.md +239 -0
  136. package/docs/zh/interest_of_intlayer.md +158 -48
  137. package/docs/zh/introduction.md +3 -3
  138. package/docs/zh/packages/intlayer/index.md +3 -3
  139. package/docs/zh/packages/next-intlayer/index.md +3 -3
  140. package/docs/zh/packages/react-intlayer/index.md +3 -3
  141. package/package.json +12 -12
  142. package/src/generated/docs.entry.ts +41 -0
package/docs/ko/CI_CD.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-05-20
3
- updatedAt: 2025-06-29
3
+ updatedAt: 2025-08-13
4
4
  title: CI/CD 톡합
5
5
  description: μžλ™ν™”λœ μ½˜ν…μΈ  관리 및 배포λ₯Ό μœ„ν•΄ Intlayerλ₯Ό CI/CD νŒŒμ΄ν”„λΌμΈμ— ν†΅ν•©ν•˜λŠ” 방법을 μ•Œμ•„λ³΄μ„Έμš”.
6
6
  keywords:
@@ -23,7 +23,7 @@ IntlayerλŠ” μ½˜ν…μΈ  μ„ μ–Έ νŒŒμΌμ— λŒ€ν•œ λ²ˆμ—­μ„ μžλ™μœΌλ‘œ 생성할
23
23
 
24
24
  ## CMS μ‚¬μš©ν•˜κΈ°
25
25
 
26
- Intlayerλ₯Ό μ‚¬μš©ν•˜λ©΄ λ‘œμ»¬μ—μ„œλŠ” 단일 λ‘œμΌ€μΌλ§Œ μ„ μ–Έν•˜κ³  λͺ¨λ“  λ²ˆμ—­μ€ CMSλ₯Ό 톡해 μ›κ²©μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” μ›Œν¬ν”Œλ‘œμš°λ₯Ό 채택할 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½˜ν…μΈ μ™€ λ²ˆμ—­μ΄ μ½”λ“œλ² μ΄μŠ€μ™€ μ™„μ „νžˆ λΆ„λ¦¬λ˜μ–΄ μ½˜ν…μΈ  νŽΈμ§‘μžμ—κ²Œ 더 λ§Žμ€ μœ μ—°μ„±μ„ μ œκ³΅ν•˜λ©°, λ³€κ²½ 사항을 μ μš©ν•˜κΈ° μœ„ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ‹€μ‹œ λΉŒλ“œν•  ν•„μš” 없이 ν•« μ½˜ν…μΈ  λ¦¬λ‘œλ”©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
26
+ Intlayerλ₯Ό μ‚¬μš©ν•˜λ©΄ λ‘œμ»¬μ—μ„œλŠ” 단일 λ‘œμΌ€μΌλ§Œ μ„ μ–Έν•˜κ³  λͺ¨λ“  λ²ˆμ—­μ€ CMSλ₯Ό 톡해 μ›κ²©μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” μ›Œν¬ν”Œλ‘œμš°λ₯Ό 채택할 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½˜ν…μΈ μ™€ λ²ˆμ—­μ΄ μ½”λ“œλ² μ΄μŠ€μ™€ μ™„μ „νžˆ λΆ„λ¦¬λ˜μ–΄ μ½˜ν…μΈ  νŽΈμ§‘μžμ—κ²Œ 더 λ§Žμ€ μœ μ—°μ„±μ„ μ œκ³΅ν•˜λ©°, ν•« μ½˜ν…μΈ  λ¦¬λ‘œλ”©μ΄ κ°€λŠ₯ν•΄μ Έ(λ³€κ²½ 사항 μ μš©μ„ μœ„ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ‹€μ‹œ λΉŒλ“œν•  ν•„μš” μ—†μŒ) νŽΈλ¦¬ν•©λ‹ˆλ‹€.
27
27
 
28
28
  ### 예제 ꡬ성
29
29
 
@@ -37,7 +37,7 @@ const config: IntlayerConfig = {
37
37
  defaultLocale: Locales.ENGLISH,
38
38
  },
39
39
  editor: {
40
- dictionaryPriorityStrategy: "distant_first", // 원격 μ½˜ν…μΈ κ°€ μš°μ„ κΆŒμ„ 가짐
40
+ dictionaryPriorityStrategy: "distant_first", // 원격 μ½˜ν…μΈ κ°€ μš°μ„ μˆœμœ„λ₯Ό κ°€μ§‘λ‹ˆλ‹€
41
41
 
42
42
  applicationURL: process.env.APPLICATION_URL, // CMSμ—μ„œ μ‚¬μš©ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ URL
43
43
 
@@ -56,7 +56,7 @@ CMS에 λŒ€ν•΄ 더 μ•Œμ•„λ³΄λ €λ©΄ [곡식 λ¬Έμ„œ](https://github.com/aymericzip/
56
56
 
57
57
  ## Husky μ‚¬μš©ν•˜κΈ°
58
58
 
59
- [Husky](https://typicode.github.io/husky/)λ₯Ό μ‚¬μš©ν•˜μ—¬ 둜컬 Git μ›Œν¬ν”Œλ‘œμš°μ— λ²ˆμ—­ 생성 κΈ°λŠ₯을 톡합할 수 μžˆμŠ΅λ‹ˆλ‹€.
59
+ [Husky](https://typicode.github.io/husky/)λ₯Ό μ‚¬μš©ν•˜μ—¬ 둜컬 Git μ›Œν¬ν”Œλ‘œμš°μ— λ²ˆμ—­ 생성 과정을 톡합할 수 μžˆμŠ΅λ‹ˆλ‹€.
60
60
 
61
61
  ### 예제 ꡬ성
62
62
 
@@ -77,7 +77,7 @@ const config: IntlayerConfig = {
77
77
  provider: "openai",
78
78
  apiKey: process.env.OPENAI_API_KEY, // μžμ‹ μ˜ API ν‚€λ₯Ό μ‚¬μš©ν•˜μ„Έμš”
79
79
 
80
- applicationContext: "This is a test application", // μΌκ΄€λœ λ²ˆμ—­ 생성을 보μž₯ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€
80
+ applicationContext: "This is a test application", // μΌκ΄€λœ λ²ˆμ—­ 생성을 λ•μŠ΅λ‹ˆλ‹€
81
81
  },
82
82
  };
83
83
 
@@ -85,13 +85,13 @@ export default config;
85
85
  ```
86
86
 
87
87
  ```bash fileName=".husky/pre-push"
88
- npx intlayer build # 사전이 μ΅œμ‹  μƒνƒœμΈμ§€ ν™•μΈν•˜κΈ° μœ„ν•΄
89
- npx intlayer fill --unpushed --mode fill # λˆ„λ½λœ λ‚΄μš©λ§Œ μ±„μš°λ©°, κΈ°μ‘΄ λ‚΄μš©μ„ μ—…λ°μ΄νŠΈν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
88
+ npx intlayer build # 사전이 μ΅œμ‹  μƒνƒœμΈμ§€ ν™•μΈν•©λ‹ˆλ‹€
89
+ npx intlayer fill --unpushed --mode fill # λˆ„λ½λœ λ‚΄μš©λ§Œ μ±„μš°λ©°, κΈ°μ‘΄ λ‚΄μš©μ„ μ—…λ°μ΄νŠΈν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€
90
90
  ```
91
91
 
92
92
  > Intlayer CLI λͺ…λ Ήμ–΄ 및 μ‚¬μš©λ²•μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ [CLI λ¬Έμ„œ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/intlayer_cli.md)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.
93
93
 
94
- > μ €μž₯μ†Œμ— μ—¬λŸ¬ 앱이 있고 각각 λ³„λ„μ˜ intlayer μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, λ‹€μŒκ³Ό 같이 `--base-dir` 인수λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
94
+ > μ €μž₯μ†Œμ— μ—¬λŸ¬ 앱이 있고 각각 λ³„λ„μ˜ intlayer μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, `--base-dir` 인수λ₯Ό λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:
95
95
 
96
96
  ```bash fileName=".husky/pre-push"
97
97
  # μ•± 1
@@ -105,68 +105,94 @@ npx intlayer fill --base-dir ./app2 --unpushed --mode fill
105
105
 
106
106
  ## GitHub Actions μ‚¬μš©ν•˜κΈ°
107
107
 
108
- IntlayerλŠ” 사전 λ‚΄μš©μ„ μžλ™ μ±„μš°κΈ° 및 κ²€ν† ν•  수 μžˆλŠ” CLI λͺ…λ Ήμ–΄λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ΄λŠ” GitHub Actionsλ₯Ό μ‚¬μš©ν•˜μ—¬ CI/CD μ›Œν¬ν”Œλ‘œμš°μ— 톡합할 수 μžˆμŠ΅λ‹ˆλ‹€.
108
+ IntlayerλŠ” 사전 λ‚΄μš©μ„ μžλ™μœΌλ‘œ μ±„μš°κ³  κ²€ν† ν•  수 μžˆλŠ” CLI λͺ…λ Ήμ–΄λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ΄λŠ” GitHub Actionsλ₯Ό μ‚¬μš©ν•˜μ—¬ CI/CD μ›Œν¬ν”Œλ‘œμš°μ— 톡합할 수 μžˆμŠ΅λ‹ˆλ‹€.
109
109
 
110
110
  ```yaml fileName=".github/workflows/intlayer-translate.yml"
111
111
  name: Intlayer μžλ™ μ±„μš°κΈ°
112
+ # 이 μ›Œν¬ν”Œλ‘œμš°μ˜ 트리거 쑰건
112
113
  on:
113
- push:
114
- branches: [ main ]
115
- paths:
116
- - 'src/**'
117
114
  pull_request:
118
- branches: [ main ]
119
- paths:
120
- - 'src/**'
121
- workflow_dispatch: {}
115
+ branches:
116
+ - "main"
117
+
118
+ permissions:
119
+ contents: write
120
+ pull-requests: write
122
121
 
123
122
  concurrency:
124
- group: 'autofill-${{ github.ref }}'
123
+ group: "autofill-${{ github.ref }}"
125
124
  cancel-in-progress: true
126
125
 
127
126
  jobs:
128
127
  autofill:
129
128
  runs-on: ubuntu-latest
130
129
  env:
131
- INTLAYER_CLIENT_ID: ${{ secrets.INTLAYER_CLIENT_ID }}
132
- INTLAYER_CLIENT_SECRET: ${{ secrets.INTLAYER_CLIENT_SECRET }}
133
- OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
130
+ # OpenAI
131
+ AI_MODEL: openai
132
+ AI_PROVIDER: gpt-5-mini
133
+ AI_API_KEY: ${{ secrets.AI_API_KEY }}
134
134
 
135
135
  steps:
136
+ # 1단계: μ €μž₯μ†Œμ—μ„œ μ΅œμ‹  μ½”λ“œ κ°€μ Έμ˜€κΈ°
136
137
  - name: ⬇️ μ €μž₯μ†Œ 체크아웃
137
- uses: actions/checkout@v3
138
+ uses: actions/checkout@v4
138
139
  with:
139
- persist-credentials: true
140
+ persist-credentials: true # PR 생성을 μœ„ν•œ 자격 증λͺ… μœ μ§€
141
+ fetch-depth: 0 # 차이 뢄석을 μœ„ν•œ 전체 git νžˆμŠ€ν† λ¦¬ κ°€μ Έμ˜€κΈ°
140
142
 
143
+ # 2단계: Node.js ν™˜κ²½ μ„€μ •
141
144
  - name: 🟒 Node.js μ„€μ •
142
- uses: actions/setup-node@v3
145
+ uses: actions/setup-node@v4
143
146
  with:
144
- node-version: 20
147
+ node-version: 20 # μ•ˆμ •μ„±μ„ μœ„ν•΄ Node.js 20 LTS μ‚¬μš©
145
148
 
149
+ # 3단계: ν”„λ‘œμ νŠΈ μ˜μ‘΄μ„± μ„€μΉ˜
146
150
  - name: πŸ“¦ μ˜μ‘΄μ„± μ„€μΉ˜
147
- run: npm ci
151
+ run: npm install
152
+
153
+ # 4단계: λ²ˆμ—­ 관리λ₯Ό μœ„ν•΄ Intlayer CLI μ „μ—­ μ„€μΉ˜
154
+ - name: πŸ“¦ Intlayer μ„€μΉ˜
155
+ run: npm install -g intlayer-cli
148
156
 
157
+ # 5단계: λ²ˆμ—­ 파일 생성을 μœ„ν•΄ Intlayer ν”„λ‘œμ νŠΈ λΉŒλ“œ
149
158
  - name: βš™οΈ Intlayer ν”„λ‘œμ νŠΈ λΉŒλ“œ
150
159
  run: npx intlayer build
151
160
 
161
+ # 6단계: AIλ₯Ό μ‚¬μš©ν•˜μ—¬ λˆ„λ½λœ λ²ˆμ—­ μžλ™ μ±„μš°κΈ°
152
162
  - name: πŸ€– λˆ„λ½λœ λ²ˆμ—­ μžλ™ μ±„μš°κΈ°
153
- run: npx intlayer fill --git-diff --mode fill
154
-
155
- - name: πŸ“€ λ²ˆμ—­ PR 생성 λ˜λŠ” μ—…λ°μ΄νŠΈ
156
- uses: peter-evans/create-pull-request@v4
157
- with:
158
- commit-message: chore: auto-fill missing translations [skip ci]
159
- branch: auto-translations
160
- title: chore: update missing translations
161
- labels: translation, automated
163
+ run: npx intlayer fill --git-diff --mode fill --provider $AI_PROVIDER --model $AI_MODEL --api-key $AI_API_KEY
164
+
165
+ # 7단계: λ³€κ²½ 사항이 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  μ»€λ°‹ν•˜κΈ°
166
+ - name: οΏ½ λ³€κ²½ 사항 확인
167
+ id: check-changes
168
+ run: |
169
+ if [ -n "$(git status --porcelain)" ]; then
170
+ echo "has-changes=true" >> $GITHUB_OUTPUT
171
+ else
172
+ echo "has-changes=false" >> $GITHUB_OUTPUT
173
+ fi
174
+
175
+ # 8단계: λ³€κ²½ 사항이 있으면 μ»€λ°‹ν•˜κ³  ν‘Έμ‹œν•˜κΈ°
176
+ - name: πŸ“€ λ³€κ²½ 사항 컀밋 및 ν‘Έμ‹œ
177
+ if: steps.check-changes.outputs.has-changes == 'true'
178
+ run: |
179
+ git config --local user.email "action@github.com"
180
+ git config --local user.name "GitHub Action"
181
+ git add .
182
+ git commit -m "chore: λˆ„λ½λœ λ²ˆμ—­ μžλ™ μ±„μš°κΈ° [skip ci]"
183
+ git push origin HEAD:${{ github.head_ref }}
162
184
  ```
163
185
 
186
+ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ„€μ •ν•˜λ €λ©΄ GitHub β†’ μ„€μ • β†’ Secrets and variables β†’ Actions둜 μ΄λ™ν•˜μ—¬ 비밀을 μΆ”κ°€ν•˜μ„Έμš”.
187
+
164
188
  > Husky와 λ§ˆμ°¬κ°€μ§€λ‘œ, λͺ¨λ…Έλ ˆν¬μ˜ 경우 `--base-dir` 인수λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 앱을 순차적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
165
189
 
166
- > 기본적으둜 `--git-diff` μΈμˆ˜λŠ” κΈ°λ³Έ 브랜치(κΈ°λ³Έκ°’ `origin/main`)μ—μ„œ ν˜„μž¬ 브랜치(κΈ°λ³Έκ°’ `HEAD`)κΉŒμ§€μ˜ λ³€κ²½ 사항을 ν¬ν•¨ν•˜λŠ” μ‚¬μ „λ§Œ ν•„ν„°λ§ν•©λ‹ˆλ‹€.
190
+ > 기본적으둜 `--git-diff` μΈμˆ˜λŠ” κΈ°λ³Έ 브랜치(κΈ°λ³Έκ°’ `origin/main`)μ—μ„œ ν˜„μž¬ 브랜치(κΈ°λ³Έκ°’: `HEAD`)둜 λ³€κ²½λœ 사전을 ν•„ν„°λ§ν•©λ‹ˆλ‹€.
167
191
 
168
192
  > Intlayer CLI λͺ…λ Ήμ–΄ 및 μ‚¬μš©λ²•μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ [CLI λ¬Έμ„œ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/intlayer_cli.md)λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.
169
193
 
170
194
  ## λ¬Έμ„œ 이λ ₯
171
195
 
172
- - 5.5.10 - 2025-06-29: 이λ ₯ μ΄ˆκΈ°ν™”
196
+ | 버전 | λ‚ μ§œ | λ³€κ²½ 사항 |
197
+ | ------ | ---------- | --------- |
198
+ | 5.5.10 | 2025-06-29 | 초기 기둝 |
@@ -0,0 +1,258 @@
1
+ ---
2
+ createdAt: 2024-08-13
3
+ updatedAt: 2025-08-20
4
+ title: 포맀터
5
+ description: 숫자, λ°±λΆ„μœ¨, 톡화, λ‚ μ§œ, μƒλŒ€ μ‹œκ°„, λ‹¨μœ„ 및 μΆ•μ•½ ν‘œκΈ°λ²•μ— λŒ€ν•΄ Intl 기반의 λ‘œμΌ€μΌ 인식 ν¬λ§€νŒ… μœ ν‹Έλ¦¬ν‹°. μΊμ‹œλœ Intl 헬퍼 포함.
6
+ keywords:
7
+ - 포맀터
8
+ - Intl
9
+ - 숫자
10
+ - 톡화
11
+ - λ°±λΆ„μœ¨
12
+ - λ‚ μ§œ
13
+ - μƒλŒ€ μ‹œκ°„
14
+ - λ‹¨μœ„
15
+ - μΆ•μ•½
16
+ - κ΅­μ œν™”
17
+ slugs:
18
+ - doc
19
+ - formatters
20
+ ---
21
+
22
+ # Intlayer 포맀터
23
+
24
+ ## κ°œμš”
25
+
26
+ IntlayerλŠ” λ„€μ΄ν‹°λΈŒ `Intl` API μœ„μ— κ΅¬μΆ•λœ κ°€λ²Όμš΄ 헬퍼 μ„ΈνŠΈμ™€, 무거운 포맀터λ₯Ό 반볡 μƒμ„±ν•˜μ§€ μ•Šλ„λ‘ μΊμ‹œλœ `Intl` 래퍼λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 이 μœ ν‹Έλ¦¬ν‹°λ“€μ€ μ™„μ „νžˆ λ‘œμΌ€μΌ 인식이 κ°€λŠ₯ν•˜λ©°, 메인 `intlayer` νŒ¨ν‚€μ§€μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
27
+
28
+ ### μž„ν¬νŠΈ
29
+
30
+ ```ts
31
+ import {
32
+ Intl,
33
+ number,
34
+ percentage,
35
+ currency,
36
+ date,
37
+ relativeTime,
38
+ units,
39
+ compact,
40
+ } from "intlayer";
41
+ ```
42
+
43
+ Reactλ₯Ό μ‚¬μš©ν•˜λŠ” 경우, 훅도 μ œκ³΅λ©λ‹ˆλ‹€; `react-intlayer/format`을 μ°Έμ‘°ν•˜μ„Έμš”.
44
+
45
+ ## μΊμ‹œλœ Intl
46
+
47
+ 내보내진 `Intl`은 μ „μ—­ `Intl`을 감싼 얇은 μΊμ‹œ λž˜νΌμž…λ‹ˆλ‹€. `NumberFormat`, `DateTimeFormat`, `RelativeTimeFormat` μΈμŠ€ν„΄μŠ€λ₯Ό λ©”λͺ¨μ΄μ œμ΄μ…˜ν•˜μ—¬ λ™μΌν•œ 포맀터λ₯Ό 반볡 μƒμ„±ν•˜λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€.
48
+
49
+ 포맀터 생성은 비ꡐ적 λΉ„μš©μ΄ 크기 λ•Œλ¬Έμ—, 이 캐싱은 λ™μž‘μ„ λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μ„±λŠ₯을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. 이 λž˜νΌλŠ” λ„€μ΄ν‹°λΈŒ `Intl`κ³Ό λ™μΌν•œ APIλ₯Ό μ œκ³΅ν•˜λ―€λ‘œ μ‚¬μš©λ²•λ„ λ™μΌν•©λ‹ˆλ‹€.
50
+
51
+ - 캐싱은 ν”„λ‘œμ„ΈμŠ€ λ‹¨μœ„λ‘œ 이루어지며 ν˜ΈμΆœμžμ—κ²Œ 투λͺ…ν•©λ‹ˆλ‹€.
52
+
53
+ > ν™˜κ²½μ— `Intl.DisplayNames`κ°€ μ—†μœΌλ©΄, 개발자 μ „μš© κ²½κ³ κ°€ ν•œ 번 좜λ ₯λ©λ‹ˆλ‹€ (폴리필 μ‚¬μš©μ„ κ³ λ €ν•˜μ„Έμš”).
54
+
55
+ μ˜ˆμ‹œ:
56
+
57
+ ```ts
58
+ import { Intl } from "intlayer";
59
+
60
+ const numberFormat = new Intl.NumberFormat("en-GB", {
61
+ style: "currency",
62
+ currency: "GBP",
63
+ });
64
+ numberFormat.format(1234.5); // "Β£1,234.50"
65
+ ```
66
+
67
+ ## 포맀터
68
+
69
+ μ•„λž˜ λͺ¨λ“  헬퍼듀은 `intlayer`μ—μ„œ λ‚΄λ³΄λ‚΄μ§‘λ‹ˆλ‹€.
70
+
71
+ ### `number(value, options?)`
72
+
73
+ λ‘œμΌ€μΌμ— λ§žλŠ” 그룹화와 μ†Œμˆ˜μ  처리λ₯Ό μ‚¬μš©ν•˜μ—¬ 숫자 값을 ν¬λ§·ν•©λ‹ˆλ‹€.
74
+
75
+ - **value**: `number | string`
76
+ - **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
77
+
78
+ μ˜ˆμ‹œ:
79
+
80
+ ```ts
81
+ import { number } from "intlayer";
82
+
83
+ number(123456.789); // "123,456.789" (en-US κΈ°μ€€)
84
+ number("1000000", { locale: "fr" }); // "1β€―000β€―000"
85
+ number(1234.5, { minimumFractionDigits: 2 }); // "1,234.50"
86
+ ```
87
+
88
+ ### `percentage(value, options?)`
89
+
90
+ 숫자λ₯Ό λ°±λΆ„μœ¨ λ¬Έμžμ—΄λ‘œ ν¬λ§·ν•©λ‹ˆλ‹€.
91
+
92
+ λ™μž‘: 1보닀 큰 값은 전체 λ°±λΆ„μœ¨λ‘œ ν•΄μ„λ˜μ–΄ μ •κ·œν™”λ©λ‹ˆλ‹€(예: `25` β†’ `25%`, `0.25` β†’ `25%`).
93
+
94
+ - **value**: `number | string`
95
+ - **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
96
+
97
+ μ˜ˆμ‹œ:
98
+
99
+ ```ts
100
+ import { percentage } from "intlayer";
101
+
102
+ percentage(0.25); // "25%"
103
+ percentage(25); // "25%"
104
+ percentage(0.237, { minimumFractionDigits: 1 }); // "23.7%"
105
+ ```
106
+
107
+ ### `currency(value, options?)`
108
+
109
+ 값을 ν˜„μ§€ν™”λœ 톡화 ν˜•μ‹μœΌλ‘œ ν¬λ§·ν•©λ‹ˆλ‹€. 기본값은 μ†Œμˆ˜μ  두 자리의 `USD`μž…λ‹ˆλ‹€.
110
+
111
+ - **value**: `number | string`
112
+ - **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
113
+ - 곡톡 ν•„λ“œ: `currency` (예: `"EUR"`), `currencyDisplay` (`"symbol" | "code" | "name"`)
114
+
115
+ μ˜ˆμ‹œ:
116
+
117
+ ```ts
118
+ import { currency } from "intlayer";
119
+
120
+ currency(1234.5, { currency: "EUR" }); // "€1,234.50"
121
+ currency("5000", { locale: "fr", currency: "CAD", currencyDisplay: "code" }); // "5β€―000,00 CAD"
122
+ ```
123
+
124
+ ### `date(date, optionsOrPreset?)`
125
+
126
+ `Intl.DateTimeFormat`을 μ‚¬μš©ν•˜μ—¬ λ‚ μ§œ/μ‹œκ°„ 값을 ν¬λ§·ν•©λ‹ˆλ‹€.
127
+
128
+ - **date**: `Date | string | number`
129
+ - **optionsOrPreset**: `Intl.DateTimeFormatOptions & { locale?: LocalesValues }` λ˜λŠ” λ‹€μŒ 프리셋 쀑 ν•˜λ‚˜:
130
+ - 프리셋: `"short" | "long" | "dateOnly" | "timeOnly" | "full"`
131
+
132
+ μ˜ˆμ‹œ:
133
+
134
+ ```ts
135
+ import { date } from "intlayer";
136
+
137
+ date(new Date(), "short"); // 예: "08/02/25, 14:30"
138
+ date("2025-08-02T14:30:00Z", { locale: "fr", month: "long", day: "numeric" }); // "2 aoΓ»t"
139
+ ```
140
+
141
+ ### `relativeTime(from, to = new Date(), options?)`
142
+
143
+ `Intl.RelativeTimeFormat`을 μ‚¬μš©ν•˜μ—¬ 두 μ‹œμ  κ°„μ˜ μƒλŒ€ μ‹œκ°„μ„ ν¬λ§·ν•©λ‹ˆλ‹€.
144
+
145
+ - μžμ—°μŠ€λŸ¬μš΄ ν‘œν˜„μ„ μœ„ν•΄ 첫 번째 인수둜 "now"λ₯Ό μ „λ‹¬ν•˜κ³  두 번째 인수둜 λŒ€μƒ μ‹œκ°„μ„ μ „λ‹¬ν•˜μ„Έμš”.
146
+ - **from**: `Date | string | number`
147
+ - **to**: `Date | string | number` (기본값은 `new Date()`)
148
+ - **options**: `{ locale?: LocalesValues; unit?: Intl.RelativeTimeFormatUnit; numeric?: Intl.RelativeTimeFormatNumeric; style?: Intl.RelativeTimeFormatStyle }`
149
+ - κΈ°λ³Έ `unit`은 `"second"`μž…λ‹ˆλ‹€.
150
+
151
+ μ˜ˆμ‹œ:
152
+
153
+ ```ts
154
+ import { relativeTime } from "intlayer";
155
+
156
+ const now = new Date();
157
+ const in3Days = new Date(now.getTime() + 3 * 864e5);
158
+ relativeTime(now, in3Days, { unit: "day" }); // "3일 ν›„"
159
+
160
+ const twoHoursAgo = new Date(now.getTime() - 2 * 3600e3);
161
+ relativeTime(now, twoHoursAgo, { unit: "hour", numeric: "auto" }); // "2μ‹œκ°„ μ „"
162
+ ```
163
+
164
+ ### `units(value, options?)`
165
+
166
+ `Intl.NumberFormat`의 `style: 'unit'`을 μ‚¬μš©ν•˜μ—¬ 숫자 값을 ν˜„μ§€ν™”λœ λ‹¨μœ„ λ¬Έμžμ—΄λ‘œ ν˜•μ‹ν™”ν•©λ‹ˆλ‹€.
167
+
168
+ - **value**: `number | string`
169
+ - **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }`
170
+ - 곡톡 ν•„λ“œ: `unit` (예: `"kilometer"`, `"byte"`), `unitDisplay` (`"short" | "narrow" | "long"`)
171
+ - κΈ°λ³Έκ°’: `unit: 'day'`, `unitDisplay: 'short'`, `useGrouping: false`
172
+
173
+ μ˜ˆμ‹œ:
174
+
175
+ ```ts
176
+ import { units } from "intlayer";
177
+
178
+ units(5, { unit: "kilometer", unitDisplay: "long", locale: "en-GB" }); // "5 kilometers"
179
+ units(1024, { unit: "byte", unitDisplay: "narrow" }); // "1,024B" (λ‘œμΌ€μΌμ— 따라 닀름)
180
+ ```
181
+
182
+ ### `compact(value, options?)`
183
+
184
+ 숫자λ₯Ό μΆ•μ•½ ν‘œκΈ°λ²•μœΌλ‘œ ν˜•μ‹ν™”ν•©λ‹ˆλ‹€ (예: `1.2K`, `1M`).
185
+
186
+ - **value**: `number | string`
187
+ - **options**: `Intl.NumberFormatOptions & { locale?: LocalesValues }` (λ‚΄λΆ€μ μœΌλ‘œ `notation: 'compact'` μ‚¬μš©)
188
+
189
+ μ˜ˆμ‹œ:
190
+
191
+ ```ts
192
+ import { compact } from "intlayer";
193
+
194
+ compact(1200); // "1.2K"
195
+ compact("1000000", { locale: "fr", compactDisplay: "long" }); // "1 million"
196
+ ```
197
+
198
+ ## μ°Έκ³  사항
199
+
200
+ - λͺ¨λ“  ν—¬νΌλŠ” `string` μž…λ ₯을 ν—ˆμš©ν•˜λ©° λ‚΄λΆ€μ μœΌλ‘œ μˆ«μžλ‚˜ λ‚ μ§œλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.
201
+ - λ‘œμΌ€μΌμ΄ μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄ κ΅¬μ„±λœ `internationalization.defaultLocale`이 κΈ°λ³Έκ°’μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.
202
+ - 이 μœ ν‹Έλ¦¬ν‹°λ“€μ€ 얇은 래퍼이며, κ³ κΈ‰ ν¬λ§·νŒ…μ΄ ν•„μš”ν•  경우 ν‘œμ€€ `Intl` μ˜΅μ…˜μ„ 직접 μ „λ‹¬ν•˜μ„Έμš”.
203
+
204
+ ## μ§„μž…μ  및 μž¬λ‚΄λ³΄λ‚΄κΈ° (`@index.ts`)
205
+
206
+ 포맷터듀은 μ½”μ–΄ νŒ¨ν‚€μ§€μ— μœ„μΉ˜ν•˜λ©°, λŸ°νƒ€μž„ μ „λ°˜μ— 걸쳐 μž„ν¬νŠΈλ₯Ό νŽΈλ¦¬ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ μƒμœ„ νŒ¨ν‚€μ§€μ—μ„œ μž¬λ‚΄λ³΄λ‚΄κΈ° λ©λ‹ˆλ‹€:
207
+
208
+ μ˜ˆμ‹œ:
209
+
210
+ ```ts
211
+ import { compact } from "intlayer";
212
+
213
+ compact(1200); // "1.2K"
214
+ compact("1000000", { locale: "fr", compactDisplay: "long" }); // "1 million"
215
+ ```
216
+
217
+ ## μ°Έκ³  사항
218
+
219
+ - λͺ¨λ“  ν—¬νΌλŠ” `string` μž…λ ₯을 ν—ˆμš©ν•˜λ©° λ‚΄λΆ€μ μœΌλ‘œ μˆ«μžλ‚˜ λ‚ μ§œλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.
220
+ - λ‘œμΌ€μΌμ΄ μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄ κ΅¬μ„±λœ `internationalization.defaultLocale`κ°€ κΈ°λ³Έκ°’μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.
221
+ - 이 μœ ν‹Έλ¦¬ν‹°λ“€μ€ 얇은 래퍼이며, κ³ κΈ‰ ν¬λ§·νŒ…μ΄ ν•„μš”ν•  경우 ν‘œμ€€ `Intl` μ˜΅μ…˜μ„ 직접 μ „λ‹¬ν•˜μ„Έμš”.
222
+
223
+ ## μ§„μž…μ  및 μž¬λ‚΄λ³΄λ‚΄κΈ° (`@index.ts`)
224
+
225
+ 포맷터듀은 μ½”μ–΄ νŒ¨ν‚€μ§€μ— μœ„μΉ˜ν•˜λ©°, λŸ°νƒ€μž„ μ „λ°˜μ— 걸쳐 μž„ν¬νŠΈκ°€ νŽΈλ¦¬ν•˜λ„λ‘ μƒμœ„ νŒ¨ν‚€μ§€μ—μ„œ μž¬λ‚΄λ³΄λ‚΄κΈ° λ©λ‹ˆλ‹€:
226
+
227
+ μ˜ˆμ‹œ:
228
+
229
+ ```ts
230
+ // μ•± μ½”λ“œ (ꢌμž₯)
231
+ import { number, currency, date, Intl } from "intlayer";
232
+ ```
233
+
234
+ ### React
235
+
236
+ ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈ:
237
+
238
+ ```ts
239
+ import { useNumber, useCurrency, useDate } from "react-intlayer/format";
240
+ // λ˜λŠ” Next.js μ•±μ—μ„œλŠ”
241
+ import { useNumber, useCurrency, useDate } from "next-intlayer/client/format";
242
+ ```
243
+
244
+ μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ (λ˜λŠ” React μ„œλ²„ λŸ°νƒ€μž„):
245
+
246
+ ```ts
247
+ import { useNumber, useCurrency, useDate } from "intlayer/server/format";
248
+ // λ˜λŠ” Next.js μ•±μ—μ„œλŠ”
249
+ import { useNumber, useCurrency, useDate } from "next-intlayer/server/format";
250
+ ```
251
+
252
+ > ν•΄λ‹Ή 훅듀은 `IntlayerProvider` λ˜λŠ” `IntlayerServerProvider`μ—μ„œ λ‘œμΌ€μΌμ„ μ°Έμ‘°ν•©λ‹ˆλ‹€.
253
+
254
+ ## λ¬Έμ„œ 이λ ₯
255
+
256
+ | 버전 | λ‚ μ§œ | λ³€κ²½ 사항 |
257
+ | ----- | ---------- | ---------------- |
258
+ | 5.8.0 | 2025-08-18 | 포맷터 λ¬Έμ„œ μΆ”κ°€ |