├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── src ├── declarations.d.ts └── index.ts ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | # IDE 2 | .vscode 3 | .idea 4 | 5 | # Logs and other files 6 | npm-debug.log* 7 | .DS_Store 8 | 9 | # Compiled files 10 | dist 11 | 12 | # Dependency directory 13 | node_modules 14 | 15 | # Source maps for JS builds 16 | *.js.map 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Description 2 | Load po files for use with `ngx-translate` 3 | 4 | ## Installation: 5 | 6 | ``` 7 | npm i @ngx-translate/core --save 8 | npm i @biesbjerg/ngx-translate-po-http-loader --save 9 | ``` 10 | 11 | ## Usage: 12 | ```ts 13 | import { HttpClient, HttpClientModule } from '@angular/common/http'; 14 | 15 | import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; 16 | import { TranslatePoHttpLoader } from '@biesbjerg/ngx-translate-po-http-loader'; 17 | 18 | export function createTranslateLoader(http: HttpClient) { 19 | return new TranslatePoHttpLoader(http, 'assets/i18n', '.po'); 20 | } 21 | 22 | @NgModule({ 23 | imports: [ 24 | BrowserModule, 25 | HttpClientModule, 26 | TranslateModule.forRoot({ 27 | loader: { 28 | provide: TranslateLoader, 29 | useFactory: createTranslateLoader, 30 | deps: [HttpClient] 31 | } 32 | }) 33 | ], 34 | bootstrap: [AppComponent] 35 | }) 36 | export class AppModule { } 37 | ``` 38 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@biesbjerg/ngx-translate-po-http-loader", 3 | "version": "3.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@angular/common": { 8 | "version": "6.0.2", 9 | "resolved": "https://registry.npmjs.org/@angular/common/-/common-6.0.2.tgz", 10 | "integrity": "sha512-Yc3NnLGs1ltnDhUCOoMCQMRSkJv/sCv+jKx3uSdrvd8Y55APl2boZhZUK4WphPfWIkpvC7odpiLXAmnVgP6vcw==", 11 | "dev": true, 12 | "requires": { 13 | "tslib": "^1.9.0" 14 | }, 15 | "dependencies": { 16 | "tslib": { 17 | "version": "1.9.1", 18 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", 19 | "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==", 20 | "dev": true 21 | } 22 | } 23 | }, 24 | "@angular/core": { 25 | "version": "6.0.2", 26 | "resolved": "https://registry.npmjs.org/@angular/core/-/core-6.0.2.tgz", 27 | "integrity": "sha512-+ahJofKZFyaq0kLhKUOCa3Fo4WQ4mkMmYRqwFjKgjPupzPgMh0FkBsojuP1WiBd5KTIkv7U8B4sTziUxRDrKgg==", 28 | "dev": true, 29 | "requires": { 30 | "tslib": "^1.9.0" 31 | }, 32 | "dependencies": { 33 | "tslib": { 34 | "version": "1.9.1", 35 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", 36 | "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==", 37 | "dev": true 38 | } 39 | } 40 | }, 41 | "@angular/platform-browser": { 42 | "version": "6.0.2", 43 | "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-6.0.2.tgz", 44 | "integrity": "sha512-iMBHckhknJ8Wfw9ZVloiw0WPZDtzQFLE2e7D42of7SgXuHloStXUchb0qLr6ZTZwTY0oBPSvDKgJJVmEjZUZvw==", 45 | "dev": true, 46 | "requires": { 47 | "tslib": "^1.9.0" 48 | }, 49 | "dependencies": { 50 | "tslib": { 51 | "version": "1.9.1", 52 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", 53 | "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==", 54 | "dev": true 55 | } 56 | } 57 | }, 58 | "@ngx-translate/core": { 59 | "version": "10.0.0", 60 | "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-10.0.0.tgz", 61 | "integrity": "sha1-546aw4xz0MF2Nt6bXnaAs8uJMrw=", 62 | "dev": true, 63 | "requires": { 64 | "tslib": "^1.9.0" 65 | }, 66 | "dependencies": { 67 | "tslib": { 68 | "version": "1.9.1", 69 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", 70 | "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==", 71 | "dev": true 72 | } 73 | } 74 | }, 75 | "builtin-modules": { 76 | "version": "1.1.1", 77 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 78 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 79 | "dev": true 80 | }, 81 | "color-convert": { 82 | "version": "1.9.1", 83 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", 84 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", 85 | "dev": true, 86 | "requires": { 87 | "color-name": "^1.1.1" 88 | } 89 | }, 90 | "color-name": { 91 | "version": "1.1.3", 92 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 93 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 94 | "dev": true 95 | }, 96 | "commander": { 97 | "version": "2.12.1", 98 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.1.tgz", 99 | "integrity": "sha512-PCNLExLlI5HiPdaJs4pMXwOTHkSCpNQ1QJH9ykZLKtKEyKu3p9HgmH5l97vM8c0IUz6d54l+xEu2GG9yuYrFzA==", 100 | "dev": true 101 | }, 102 | "gettext-parser": { 103 | "version": "1.3.0", 104 | "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.3.0.tgz", 105 | "integrity": "sha512-iloxjcw+uTPnQ8DrGICWtqkHNgk3mAiDI77pLmXQCnhM+BxFQXstzTA4zj3EpIYMysRQnnNzHyHzBUEazz80Sw==", 106 | "requires": { 107 | "encoding": "^0.1.12", 108 | "safe-buffer": "^5.1.1" 109 | }, 110 | "dependencies": { 111 | "encoding": { 112 | "version": "0.1.12", 113 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 114 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 115 | "requires": { 116 | "iconv-lite": "~0.4.13" 117 | } 118 | }, 119 | "iconv-lite": { 120 | "version": "0.4.19", 121 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 122 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 123 | }, 124 | "safe-buffer": { 125 | "version": "5.1.1", 126 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 127 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 128 | } 129 | } 130 | }, 131 | "has-flag": { 132 | "version": "2.0.0", 133 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 134 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 135 | "dev": true 136 | }, 137 | "rxjs": { 138 | "version": "6.1.0", 139 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.1.0.tgz", 140 | "integrity": "sha512-lMZdl6xbHJCSb5lmnb6nOhsoBVCyoDC5LDJQK9WWyq+tsI7KnlDIZ0r0AZAlBpRPLbwQA9kzSBAZwNIZEZ+hcw==", 141 | "dev": true, 142 | "requires": { 143 | "tslib": "^1.9.0" 144 | }, 145 | "dependencies": { 146 | "tslib": { 147 | "version": "1.9.1", 148 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", 149 | "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==", 150 | "dev": true 151 | } 152 | } 153 | }, 154 | "tslib": { 155 | "version": "1.8.0", 156 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz", 157 | "integrity": "sha512-ymKWWZJST0/CkgduC2qkzjMOWr4bouhuURNXCn/inEX0L57BnRG6FhX76o7FOnsjHazCjfU2LKeSrlS2sIKQJg==", 158 | "dev": true 159 | }, 160 | "tslint": { 161 | "version": "5.8.0", 162 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.8.0.tgz", 163 | "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", 164 | "dev": true, 165 | "requires": { 166 | "babel-code-frame": "^6.22.0", 167 | "builtin-modules": "^1.1.1", 168 | "chalk": "^2.1.0", 169 | "commander": "^2.9.0", 170 | "diff": "^3.2.0", 171 | "glob": "^7.1.1", 172 | "minimatch": "^3.0.4", 173 | "resolve": "^1.3.2", 174 | "semver": "^5.3.0", 175 | "tslib": "^1.7.1", 176 | "tsutils": "^2.12.1" 177 | }, 178 | "dependencies": { 179 | "ansi-regex": { 180 | "version": "2.1.1", 181 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 182 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 183 | "dev": true 184 | }, 185 | "ansi-styles": { 186 | "version": "2.2.1", 187 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 188 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 189 | "dev": true 190 | }, 191 | "babel-code-frame": { 192 | "version": "6.26.0", 193 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 194 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 195 | "dev": true, 196 | "requires": { 197 | "chalk": "^1.1.3", 198 | "esutils": "^2.0.2", 199 | "js-tokens": "^3.0.2" 200 | }, 201 | "dependencies": { 202 | "chalk": { 203 | "version": "1.1.3", 204 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 205 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 206 | "dev": true, 207 | "requires": { 208 | "ansi-styles": "^2.2.1", 209 | "escape-string-regexp": "^1.0.2", 210 | "has-ansi": "^2.0.0", 211 | "strip-ansi": "^3.0.0", 212 | "supports-color": "^2.0.0" 213 | } 214 | } 215 | } 216 | }, 217 | "balanced-match": { 218 | "version": "1.0.0", 219 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 220 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 221 | "dev": true 222 | }, 223 | "brace-expansion": { 224 | "version": "1.1.8", 225 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 226 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 227 | "dev": true, 228 | "requires": { 229 | "balanced-match": "^1.0.0", 230 | "concat-map": "0.0.1" 231 | } 232 | }, 233 | "chalk": { 234 | "version": "2.3.0", 235 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", 236 | "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", 237 | "dev": true, 238 | "requires": { 239 | "ansi-styles": "^3.1.0", 240 | "escape-string-regexp": "^1.0.5", 241 | "supports-color": "^4.0.0" 242 | }, 243 | "dependencies": { 244 | "ansi-styles": { 245 | "version": "3.2.0", 246 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", 247 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", 248 | "dev": true, 249 | "requires": { 250 | "color-convert": "^1.9.0" 251 | } 252 | }, 253 | "supports-color": { 254 | "version": "4.5.0", 255 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 256 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 257 | "dev": true, 258 | "requires": { 259 | "has-flag": "^2.0.0" 260 | } 261 | } 262 | } 263 | }, 264 | "concat-map": { 265 | "version": "0.0.1", 266 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 267 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 268 | "dev": true 269 | }, 270 | "diff": { 271 | "version": "3.4.0", 272 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", 273 | "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", 274 | "dev": true 275 | }, 276 | "escape-string-regexp": { 277 | "version": "1.0.5", 278 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 279 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 280 | "dev": true 281 | }, 282 | "esutils": { 283 | "version": "2.0.2", 284 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 285 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 286 | "dev": true 287 | }, 288 | "fs.realpath": { 289 | "version": "1.0.0", 290 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 291 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 292 | "dev": true 293 | }, 294 | "glob": { 295 | "version": "7.1.2", 296 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 297 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 298 | "dev": true, 299 | "requires": { 300 | "fs.realpath": "^1.0.0", 301 | "inflight": "^1.0.4", 302 | "inherits": "2", 303 | "minimatch": "^3.0.4", 304 | "once": "^1.3.0", 305 | "path-is-absolute": "^1.0.0" 306 | } 307 | }, 308 | "has-ansi": { 309 | "version": "2.0.0", 310 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 311 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 312 | "dev": true, 313 | "requires": { 314 | "ansi-regex": "^2.0.0" 315 | } 316 | }, 317 | "inflight": { 318 | "version": "1.0.6", 319 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 320 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 321 | "dev": true, 322 | "requires": { 323 | "once": "^1.3.0", 324 | "wrappy": "1" 325 | } 326 | }, 327 | "inherits": { 328 | "version": "2.0.3", 329 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 330 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 331 | "dev": true 332 | }, 333 | "js-tokens": { 334 | "version": "3.0.2", 335 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 336 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 337 | "dev": true 338 | }, 339 | "minimatch": { 340 | "version": "3.0.4", 341 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 342 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 343 | "dev": true, 344 | "requires": { 345 | "brace-expansion": "^1.1.7" 346 | } 347 | }, 348 | "once": { 349 | "version": "1.4.0", 350 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 351 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 352 | "dev": true, 353 | "requires": { 354 | "wrappy": "1" 355 | } 356 | }, 357 | "path-is-absolute": { 358 | "version": "1.0.1", 359 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 360 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 361 | "dev": true 362 | }, 363 | "path-parse": { 364 | "version": "1.0.5", 365 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 366 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 367 | "dev": true 368 | }, 369 | "resolve": { 370 | "version": "1.5.0", 371 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 372 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 373 | "dev": true, 374 | "requires": { 375 | "path-parse": "^1.0.5" 376 | } 377 | }, 378 | "semver": { 379 | "version": "5.4.1", 380 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 381 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 382 | "dev": true 383 | }, 384 | "strip-ansi": { 385 | "version": "3.0.1", 386 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 387 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 388 | "dev": true, 389 | "requires": { 390 | "ansi-regex": "^2.0.0" 391 | } 392 | }, 393 | "supports-color": { 394 | "version": "2.0.0", 395 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 396 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 397 | "dev": true 398 | }, 399 | "tsutils": { 400 | "version": "2.12.2", 401 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.12.2.tgz", 402 | "integrity": "sha1-rVikhl0X7D3bZjG2ylO+FKVlb/M=", 403 | "dev": true, 404 | "requires": { 405 | "tslib": "^1.7.1" 406 | } 407 | }, 408 | "wrappy": { 409 | "version": "1.0.2", 410 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 411 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 412 | "dev": true 413 | } 414 | } 415 | }, 416 | "tslint-eslint-rules": { 417 | "version": "4.1.1", 418 | "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-4.1.1.tgz", 419 | "integrity": "sha1-fDDniC8mvCdr/5HSOEl1xp2viLo=", 420 | "dev": true, 421 | "requires": { 422 | "doctrine": "^0.7.2", 423 | "tslib": "^1.0.0", 424 | "tsutils": "^1.4.0" 425 | }, 426 | "dependencies": { 427 | "doctrine": { 428 | "version": "0.7.2", 429 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", 430 | "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", 431 | "dev": true, 432 | "requires": { 433 | "esutils": "^1.1.6", 434 | "isarray": "0.0.1" 435 | } 436 | }, 437 | "esutils": { 438 | "version": "1.1.6", 439 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", 440 | "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", 441 | "dev": true 442 | }, 443 | "isarray": { 444 | "version": "0.0.1", 445 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 446 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 447 | "dev": true 448 | }, 449 | "tsutils": { 450 | "version": "1.9.1", 451 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", 452 | "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", 453 | "dev": true 454 | } 455 | } 456 | }, 457 | "typescript": { 458 | "version": "2.7.2", 459 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", 460 | "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", 461 | "dev": true 462 | }, 463 | "zone.js": { 464 | "version": "0.8.26", 465 | "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", 466 | "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==", 467 | "dev": true 468 | } 469 | } 470 | } 471 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@biesbjerg/ngx-translate-po-http-loader", 3 | "version": "3.1.0", 4 | "description": "Load po files for use with ngx-translate", 5 | "main": "dist/index.js", 6 | "typings": "dist/index.d.ts", 7 | "scripts": { 8 | "build": "npm run clean && tsc", 9 | "watch": "npm run clean && tsc --watch", 10 | "clean": "rm -rf ./dist", 11 | "lint": "tslint --force '*.ts'" 12 | }, 13 | "files": [ 14 | "dist/" 15 | ], 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/biesbjerg/ngx-translate-po-http-loader.git" 19 | }, 20 | "keywords": [], 21 | "author": "Kim Biesbjerg ", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/biesbjerg/ngx-translate-po-http-loader/issues" 25 | }, 26 | "homepage": "https://github.com/biesbjerg/ngx-translate-po-http-loader", 27 | "engines": { 28 | "node": ">=4.1.1" 29 | }, 30 | "config": {}, 31 | "peerDependencies": { 32 | "@angular/core": "^6.0.0", 33 | "@angular/common": "^6.0.0", 34 | "@ngx-translate/core": "^10.0.0" 35 | }, 36 | "dependencies": { 37 | "gettext-parser": "1.3.1" 38 | }, 39 | "devDependencies": { 40 | "@angular/core": "^6.0.0", 41 | "@angular/common": "^6.0.0", 42 | "@angular/platform-browser": "^6.0.0", 43 | "rxjs": "^6.0.0", 44 | "zone.js": "0.8.26", 45 | "typescript": "2.7.2", 46 | "@ngx-translate/core": "10.0.0", 47 | "tslint": "5.8.0", 48 | "tslint-eslint-rules": "4.1.1" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/declarations.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'gettext-parser'; 2 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { HttpClient } from '@angular/common/http'; 2 | import { TranslateLoader } from '@ngx-translate/core'; 3 | import * as gettext from 'gettext-parser'; 4 | import { Observable } from 'rxjs'; 5 | import { map } from 'rxjs/operators'; 6 | 7 | export class TranslatePoHttpLoader implements TranslateLoader { 8 | 9 | /** 10 | * Translation domain 11 | */ 12 | public domain = ''; 13 | 14 | constructor( 15 | protected _http: HttpClient, 16 | protected _prefix: string = 'i18n', 17 | protected _suffix: string = '.po' 18 | ) { 19 | } 20 | 21 | /** 22 | * Gets the translations from file 23 | * @param lang 24 | * @returns {any} 25 | */ 26 | public getTranslation(lang: string): Observable { 27 | return this._http 28 | .get(`${this._prefix}/${lang}${this._suffix}`, { responseType: 'text' }) 29 | .pipe(map((contents: string) => this.parse(contents))); 30 | } 31 | 32 | /** 33 | * Parse po file 34 | * @param contents 35 | * @returns {any} 36 | */ 37 | public parse(contents: string): any { 38 | let translations: { [key: string]: string } = {}; 39 | 40 | const po = gettext.po.parse(contents, 'utf-8'); 41 | if (!po.translations.hasOwnProperty(this.domain)) { 42 | return translations; 43 | } 44 | 45 | Object.keys(po.translations[this.domain]) 46 | .forEach(key => { 47 | const translation: string = po.translations[this.domain][key].msgstr.pop(); 48 | if (key.length > 0 && translation.length > 0) { 49 | translations[key] = translation; 50 | } 51 | }); 52 | 53 | return translations; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "noUnusedLocals": true, 5 | "noImplicitAny": true, 6 | "removeComments": true, 7 | "module": "commonjs", 8 | "moduleResolution": "node", 9 | "sourceMap": true, 10 | "outDir": "dist/", 11 | "declaration": true, 12 | "target": "es5", 13 | "lib": [ 14 | "dom", 15 | "es2015" 16 | ] 17 | }, 18 | "include": [ 19 | "src/**/*.ts" 20 | ], 21 | "exclude": [ 22 | "node_modules" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/tslint-eslint-rules/dist/rules" 4 | ], 5 | "rules": { 6 | "indent": [true, "tabs"], 7 | "semicolon": [true, "always", "ignore-interfaces"], 8 | "quotemark": [true, "single", "avoid-escape"], 9 | "only-arrow-functions": true, 10 | "no-duplicate-variable": true, 11 | "member-access": true, 12 | "member-ordering": [ 13 | true, 14 | { 15 | "order": [ 16 | "public-static-field", 17 | "public-static-method", 18 | "protected-static-field", 19 | "protected-static-method", 20 | "private-static-field", 21 | "private-static-method", 22 | "public-instance-field", 23 | "protected-instance-field", 24 | "private-instance-field", 25 | "constructor", 26 | "public-instance-method", 27 | "protected-instance-method", 28 | "private-instance-method" 29 | ] 30 | } 31 | ], 32 | "curly": true, 33 | "eofline": true, 34 | "no-trailing-whitespace": true, 35 | "trailing-comma": [ 36 | true, 37 | { 38 | "multiline": "never", 39 | "singleline": "never" 40 | } 41 | ], 42 | "whitespace": [ 43 | true, 44 | "check-branch", 45 | "check-decl", 46 | "check-operator", 47 | "check-module", 48 | "check-separator", 49 | "check-type", 50 | "check-typecast" 51 | ] 52 | } 53 | } 54 | --------------------------------------------------------------------------------