@things-factory/i18n-base 7.0.0-alpha.9 → 7.0.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 (81) hide show
  1. package/client/bootstrap.ts +16 -0
  2. package/client/{index.js → index.ts} +0 -2
  3. package/client/page/terminology-page.ts +406 -0
  4. package/client/route.ts +7 -0
  5. package/config/config.development.js +29 -0
  6. package/config/config.production.js +29 -0
  7. package/dist-client/bootstrap.d.ts +6 -0
  8. package/dist-client/bootstrap.js +10 -0
  9. package/dist-client/bootstrap.js.map +1 -0
  10. package/dist-client/index.d.ts +5 -0
  11. package/dist-client/index.js +6 -0
  12. package/dist-client/index.js.map +1 -0
  13. package/dist-client/page/terminology-page.d.ts +79 -0
  14. package/dist-client/page/terminology-page.js +395 -0
  15. package/dist-client/page/terminology-page.js.map +1 -0
  16. package/dist-client/route.d.ts +1 -0
  17. package/dist-client/route.js +8 -0
  18. package/dist-client/route.js.map +1 -0
  19. package/dist-client/tsconfig.tsbuildinfo +1 -0
  20. package/dist-server/apis/index.d.ts +1 -0
  21. package/dist-server/apis/t.d.ts +6 -0
  22. package/dist-server/apis/t.js +1 -2
  23. package/dist-server/apis/t.js.map +1 -1
  24. package/dist-server/controllers/clear-cache-for-translation.d.ts +1 -0
  25. package/dist-server/controllers/clear-cache-for-translation.js +17 -0
  26. package/dist-server/controllers/clear-cache-for-translation.js.map +1 -0
  27. package/dist-server/index.d.ts +5 -0
  28. package/dist-server/index.js +1 -0
  29. package/dist-server/index.js.map +1 -1
  30. package/dist-server/middlewares/index.d.ts +1 -0
  31. package/dist-server/middlewares/index.js +1 -2
  32. package/dist-server/middlewares/index.js.map +1 -1
  33. package/dist-server/middlewares/koa-i18next/detect.d.ts +1 -0
  34. package/dist-server/middlewares/koa-i18next/detect.js +1 -1
  35. package/dist-server/middlewares/koa-i18next/detect.js.map +1 -1
  36. package/dist-server/middlewares/koa-i18next/index.d.ts +6 -0
  37. package/dist-server/middlewares/koa-i18next/index.js +1 -1
  38. package/dist-server/middlewares/koa-i18next/index.js.map +1 -1
  39. package/dist-server/middlewares/translations.d.ts +1 -0
  40. package/dist-server/middlewares/translations.js +1 -2
  41. package/dist-server/middlewares/translations.js.map +1 -1
  42. package/dist-server/routes.d.ts +1 -0
  43. package/dist-server/routes.js +66 -1
  44. package/dist-server/routes.js.map +1 -1
  45. package/dist-server/service/index.d.ts +7 -0
  46. package/dist-server/service/index.js +8 -3
  47. package/dist-server/service/index.js.map +1 -1
  48. package/dist-server/service/terminology/index.d.ts +6 -0
  49. package/dist-server/service/terminology/index.js +2 -1
  50. package/dist-server/service/terminology/index.js.map +1 -1
  51. package/dist-server/service/terminology/terminology-mutation.d.ts +11 -0
  52. package/dist-server/service/terminology/terminology-mutation.js +41 -4
  53. package/dist-server/service/terminology/terminology-mutation.js.map +1 -1
  54. package/dist-server/service/terminology/terminology-query.d.ts +11 -0
  55. package/dist-server/service/terminology/terminology-query.js +24 -3
  56. package/dist-server/service/terminology/terminology-query.js.map +1 -1
  57. package/dist-server/service/terminology/terminology-type.d.ts +21 -0
  58. package/dist-server/service/terminology/terminology-type.js +9 -9
  59. package/dist-server/service/terminology/terminology-type.js.map +1 -1
  60. package/dist-server/service/terminology/terminology.d.ts +18 -0
  61. package/dist-server/service/terminology/terminology.js +23 -6
  62. package/dist-server/service/terminology/terminology.js.map +1 -1
  63. package/dist-server/tsconfig.tsbuildinfo +1 -1
  64. package/package.json +13 -9
  65. package/server/controllers/clear-cache-for-translation.ts +18 -0
  66. package/server/index.ts +1 -0
  67. package/server/routes.ts +85 -1
  68. package/server/service/index.ts +15 -6
  69. package/server/service/terminology/index.ts +1 -0
  70. package/server/service/terminology/terminology-mutation.ts +46 -2
  71. package/server/service/terminology/terminology-query.ts +12 -1
  72. package/server/service/terminology/terminology-type.ts +6 -6
  73. package/server/service/terminology/terminology.ts +31 -9
  74. package/things-factory.config.js +10 -2
  75. package/translations/en.json +8 -0
  76. package/translations/ja.json +8 -0
  77. package/translations/ko.json +8 -0
  78. package/translations/ms.json +8 -0
  79. package/translations/zh.json +8 -0
  80. package/client/bootstrap.js +0 -10
  81. package/client/components/i18n-msg.js +0 -9
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@things-factory/i18n-base",
3
- "version": "7.0.0-alpha.9",
3
+ "version": "7.0.0",
4
4
  "main": "dist-server/index.js",
5
- "browser": "client/index.js",
5
+ "browser": "dist-client/index.js",
6
6
  "things-factory": true,
7
7
  "author": "heartyoh <heartyoh@hatiolab.com>",
8
8
  "description": "Server side for handling translation.",
@@ -17,15 +17,19 @@
17
17
  "directory": "packages/i18n-base"
18
18
  },
19
19
  "scripts": {
20
- "build": "tsc --p tsconfig.json",
21
- "build:server": "npm run clean:server && tsc",
22
- "clean:server": "rm -rf dist-server",
23
- "clean": "npm run clean:server",
20
+ "build": "npm run build:server && npm run build:client",
21
+ "copy:files": "copyfiles -e \"./client/**/*.{ts,js,json}\" -u 1 \"./client/**/*\" dist-client",
22
+ "build:client": "npm run copy:files && npx tsc --p ./client/tsconfig.json",
23
+ "build:server": "npx tsc --p ./server/tsconfig.json",
24
+ "clean:client": "npx rimraf dist-client",
25
+ "clean:server": "npx rimraf dist-server",
26
+ "clean": "npm run clean:server && npm run clean:client",
24
27
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
25
28
  },
26
29
  "dependencies": {
27
- "@operato/i18n": "^2.0.0-alpha.0",
28
- "@things-factory/shell": "^7.0.0-alpha.9"
30
+ "@operato/i18n": "^7.0.0",
31
+ "@things-factory/auth-base": "^7.0.0",
32
+ "@things-factory/shell": "^7.0.0"
29
33
  },
30
- "gitHead": "99fc5aead211b3c82e3ebbf76e8d5d1db01b1ddc"
34
+ "gitHead": "00f3917ca132679e3571f3f4fd16f4caf84f488e"
31
35
  }
@@ -0,0 +1,18 @@
1
+ import { config } from '@things-factory/env'
2
+
3
+ const disableCustomTerminologyFeature = config.get('i18n/disableCustomTerminologyFeature')
4
+
5
+ const path = require('path')
6
+ var fs = require('fs')
7
+
8
+ export function clearTranslationCacheForCertainDomain(subdomain: string) {
9
+ if (disableCustomTerminologyFeature) {
10
+ return
11
+ }
12
+
13
+ const cacheFileFolder = path.join('cache', 'translations', subdomain)
14
+
15
+ if (fs.existsSync(cacheFileFolder)) {
16
+ fs.rmSync(cacheFileFolder, { recursive: true })
17
+ }
18
+ }
package/server/index.ts CHANGED
@@ -3,3 +3,4 @@ import './routes'
3
3
  export * from './service'
4
4
  export * from './apis'
5
5
  export * from './middlewares'
6
+ export * from './controllers/clear-cache-for-translation.js'
package/server/routes.ts CHANGED
@@ -1,4 +1,27 @@
1
1
  import i18next from 'i18next'
2
+ import { ILike } from 'typeorm'
3
+
4
+ import { getRepository } from '@things-factory/shell'
5
+ import { config } from '@things-factory/env'
6
+
7
+ const disableCustomTerminologyFeature = config.get('i18n/disableCustomTerminologyFeature')
8
+
9
+ import { Terminology } from './service/terminology/terminology'
10
+
11
+ const path = require('path')
12
+ const cacheFS = require('fs')
13
+ var fs = require('fs')
14
+
15
+ process.on('client-rebuilt' as any, (app, compilerFileSystem) => {
16
+ /* change filesystem whenever webpacking assets done. only for development mode. */
17
+ fs = compilerFileSystem
18
+
19
+ const cacheFileFolder = path.join('cache', 'translations')
20
+
21
+ if (cacheFS.existsSync(cacheFileFolder)) {
22
+ cacheFS.rmSync(cacheFileFolder, { recursive: true })
23
+ }
24
+ })
2
25
 
3
26
  process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {
4
27
  globalPublicRouter.get('/translations/translate/:lng/:key', async (context, next) => {
@@ -9,10 +32,71 @@ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRout
9
32
  })
10
33
 
11
34
  globalPublicRouter.get('/translations/translate/:key', async (context, next) => {
12
- const { lng } = context.state
13
35
  const { key } = context.params
14
36
  const translated = context.t(key)
15
37
 
16
38
  context.body = translated
17
39
  })
18
40
  })
41
+
42
+ process.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {
43
+ domainPublicRouter.get('/domain/:subdomain/translations/:filename', async (context, next) => {
44
+ const { subdomain, filename } = context.params
45
+ const { domain } = context.state
46
+
47
+ const locale = (filename || 'en.json').split('.')[0]
48
+
49
+ // context.set('Cache-Control', 'public, max-age=31536000') // 캐시 기간 설정 : 1년
50
+ // context.set('Expires', new Date(Date.now() + 31536000000).toUTCString()) // 캐시 만료일 설정
51
+
52
+ if (disableCustomTerminologyFeature) {
53
+ var file = fs.readFileSync(path.resolve(path.join('dist-app', 'translations', filename)))
54
+
55
+ context.type = 'application/json'
56
+ context.body = file
57
+ return
58
+ }
59
+
60
+ const cacheFileFolder = path.join('cache', 'translations', subdomain)
61
+ const cacheFilePath = path.join(cacheFileFolder, filename)
62
+
63
+ if (cacheFS.existsSync(cacheFilePath)) {
64
+ var file = cacheFS.readFileSync(cacheFilePath)
65
+ } else {
66
+ var file = fs.readFileSync(path.resolve(path.join('dist-app', 'translations', filename)))
67
+
68
+ try {
69
+ const terminologies = await getRepository(Terminology).find({
70
+ where: { domain: { id: domain.id }, locale: ILike(locale + '%') }
71
+ })
72
+
73
+ const json = JSON.parse(file)
74
+
75
+ terminologies.forEach(term => {
76
+ const { name, category, display } = term
77
+ json[`${category}.${name}`] = display
78
+ })
79
+
80
+ try {
81
+ if (!cacheFS.existsSync(cacheFileFolder)) {
82
+ cacheFS.mkdirSync(cacheFileFolder, { recursive: true })
83
+ }
84
+
85
+ cacheFS.writeFileSync(cacheFilePath, JSON.stringify(json))
86
+ } catch (err) {
87
+ console.error(err)
88
+ }
89
+
90
+ context.type = 'application/json'
91
+ context.body = json
92
+
93
+ return
94
+ } catch (err) {
95
+ console.error(err)
96
+ }
97
+ }
98
+
99
+ context.type = 'application/json'
100
+ context.body = file
101
+ })
102
+ })
@@ -1,18 +1,27 @@
1
1
  /* EXPORT ENTITY TYPES */
2
2
  export * from './terminology/terminology'
3
+ export * from './terminology/terminology-type'
3
4
 
4
5
  /* IMPORT ENTITIES AND RESOLVERS */
5
- import { entities as TerminologyEntities, resolvers as TerminologyResolvers } from './terminology'
6
+ import {
7
+ entities as TerminologyEntities,
8
+ resolvers as TerminologyResolvers,
9
+ subscribers as TerminologySubscribers
10
+ } from './terminology'
6
11
 
7
- export const entities = [
12
+ export const entities = [
8
13
  /* ENTITIES */
9
- ...TerminologyEntities,
10
- ]
14
+ ...TerminologyEntities
15
+ ]
11
16
 
17
+ export const subscribers = [
18
+ /* SUBSCRIBERS */
19
+ ...TerminologySubscribers
20
+ ]
12
21
 
13
22
  export const schema = {
14
23
  resolverClasses: [
15
24
  /* RESOLVER CLASSES */
16
- ...TerminologyResolvers,
17
- ]
25
+ ...TerminologyResolvers
26
+ ]
18
27
  }
@@ -4,3 +4,4 @@ import { TerminologyMutation } from './terminology-mutation'
4
4
 
5
5
  export const entities = [Terminology]
6
6
  export const resolvers = [TerminologyQuery, TerminologyMutation]
7
+ export const subscribers = []
@@ -4,22 +4,39 @@ import { In } from 'typeorm'
4
4
  import { Terminology } from './terminology'
5
5
  import { NewTerminology, TerminologyPatch } from './terminology-type'
6
6
 
7
+ import { clearTranslationCacheForCertainDomain } from '../../controllers/clear-cache-for-translation'
8
+
9
+ function clearCache(subdomain: string) {
10
+ /** multiple update/delete시 모든 엔티티에 대해서 subscription 이 걸리므로, EventSubscriber를 사용하지 않음. */
11
+ try {
12
+ clearTranslationCacheForCertainDomain(subdomain)
13
+ } catch (err) {
14
+ console.error('Failed to delete the translations cache directory:', err)
15
+ }
16
+ }
17
+
7
18
  @Resolver(Terminology)
8
19
  export class TerminologyMutation {
9
20
  @Directive('@transaction')
21
+ @Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
10
22
  @Mutation(returns => Terminology, { description: 'To create new Terminology' })
11
23
  async createTerminology(@Arg('terminology') terminology: NewTerminology, @Ctx() context: any): Promise<Terminology> {
12
24
  const { domain, user, tx } = context.state
13
25
 
14
- return await tx.getRepository(Terminology).save({
26
+ const result = await tx.getRepository(Terminology).save({
15
27
  ...terminology,
16
28
  domain,
17
29
  creator: user,
18
30
  updater: user
19
31
  })
32
+
33
+ clearCache(domain.subdomain)
34
+
35
+ return result
20
36
  }
21
37
 
22
38
  @Directive('@transaction')
39
+ @Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
23
40
  @Mutation(returns => Terminology, { description: 'To modify Terminology information' })
24
41
  async updateTerminology(
25
42
  @Arg('id') id: string,
@@ -33,14 +50,19 @@ export class TerminologyMutation {
33
50
  where: { domain: { id: domain.id }, id }
34
51
  })
35
52
 
36
- return await repository.save({
53
+ const result = await repository.save({
37
54
  ...terminology,
38
55
  ...patch,
39
56
  updater: user
40
57
  })
58
+
59
+ clearCache(domain.subdomain)
60
+
61
+ return result
41
62
  }
42
63
 
43
64
  @Directive('@transaction')
65
+ @Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
44
66
  @Mutation(returns => [Terminology], { description: "To modify multiple Terminologies' information" })
45
67
  async updateMultipleTerminologies(
46
68
  @Arg('patches', type => [TerminologyPatch]) patches: TerminologyPatch[],
@@ -83,19 +105,36 @@ export class TerminologyMutation {
83
105
  }
84
106
  }
85
107
 
108
+ clearCache(domain.subdomain)
109
+
86
110
  return results
87
111
  }
88
112
 
89
113
  @Directive('@transaction')
114
+ @Mutation(returns => Boolean, { description: 'To clear translations cache' })
115
+ async clearTranslationsCache(@Ctx() context: any): Promise<boolean> {
116
+ const { domain, tx } = context.state
117
+
118
+ clearCache(domain.subdomain)
119
+
120
+ return true
121
+ }
122
+
123
+ @Directive('@transaction')
124
+ @Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
90
125
  @Mutation(returns => Boolean, { description: 'To delete Terminology' })
91
126
  async deleteTerminology(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {
92
127
  const { domain, tx } = context.state
93
128
 
94
129
  await tx.getRepository(Terminology).delete({ domain: { id: domain.id }, id })
130
+
131
+ clearCache(domain.subdomain)
132
+
95
133
  return true
96
134
  }
97
135
 
98
136
  @Directive('@transaction')
137
+ @Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
99
138
  @Mutation(returns => Boolean, { description: 'To delete multiple Terminologies' })
100
139
  async deleteTerminologies(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {
101
140
  const { domain, tx } = context.state
@@ -105,10 +144,13 @@ export class TerminologyMutation {
105
144
  id: In(ids)
106
145
  })
107
146
 
147
+ clearCache(domain.subdomain)
148
+
108
149
  return true
109
150
  }
110
151
 
111
152
  @Directive('@transaction')
153
+ @Directive('@privilege(category: "terminology", privilege: "mutation", domainOwnerGranted: true)')
112
154
  @Mutation(returns => Boolean, { description: 'To import multiple Terminologies' })
113
155
  async importTerminologies(
114
156
  @Arg('terminologies', type => [TerminologyPatch]) terminologies: TerminologyPatch[],
@@ -122,6 +164,8 @@ export class TerminologyMutation {
122
164
  })
123
165
  )
124
166
 
167
+ clearCache(domain.subdomain)
168
+
125
169
  return true
126
170
  }
127
171
  }
@@ -1,6 +1,7 @@
1
1
  import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
2
 
3
3
  import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
4
+ import { User } from '@things-factory/auth-base'
4
5
 
5
6
  import { Terminology } from './terminology'
6
7
  import { TerminologyList } from './terminology-type'
@@ -17,7 +18,7 @@ export class TerminologyQuery {
17
18
  }
18
19
 
19
20
  @Query(returns => TerminologyList, { description: 'To fetch multiple Terminologies' })
20
- async terminologies(@Args() params: ListParam, @Ctx() context: any): Promise<TerminologyList> {
21
+ async terminologies(@Args(type => ListParam) params: ListParam, @Ctx() context: any): Promise<TerminologyList> {
21
22
  const { domain } = context.state
22
23
 
23
24
  const queryBuilder = getQueryBuilderFromListParams({
@@ -36,4 +37,14 @@ export class TerminologyQuery {
36
37
  async domain(@Root() terminology: Terminology): Promise<Domain> {
37
38
  return await getRepository(Domain).findOneBy({ id: terminology.domainId })
38
39
  }
40
+
41
+ @FieldResolver(type => User)
42
+ async updater(@Root() terminology: Terminology): Promise<User> {
43
+ return await getRepository(User).findOneBy({ id: terminology.updaterId })
44
+ }
45
+
46
+ @FieldResolver(type => User)
47
+ async creator(@Root() terminology: Terminology): Promise<User> {
48
+ return await getRepository(User).findOneBy({ id: terminology.creatorId })
49
+ }
39
50
  }
@@ -31,14 +31,14 @@ export class TerminologyPatch {
31
31
  @Field({ nullable: true })
32
32
  description?: string
33
33
 
34
- @Field()
35
- locale: string
34
+ @Field({ nullable: true })
35
+ locale?: string
36
36
 
37
- @Field()
38
- category: string
37
+ @Field({ nullable: true })
38
+ category?: string
39
39
 
40
- @Field()
41
- display: string
40
+ @Field({ nullable: true })
41
+ display?: string
42
42
 
43
43
  @Field({ nullable: true })
44
44
  cuFlag?: string
@@ -1,7 +1,17 @@
1
1
  import { Field, ID, ObjectType } from 'type-graphql'
2
- import { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId, UpdateDateColumn } from 'typeorm'
2
+ import {
3
+ Column,
4
+ CreateDateColumn,
5
+ Entity,
6
+ Index,
7
+ ManyToOne,
8
+ PrimaryGeneratedColumn,
9
+ RelationId,
10
+ UpdateDateColumn
11
+ } from 'typeorm'
3
12
 
4
13
  import { Domain } from '@things-factory/shell'
14
+ import { User } from '@things-factory/auth-base'
5
15
 
6
16
  @Entity()
7
17
  @ObjectType({ description: 'Entity for Terminology' })
@@ -15,7 +25,7 @@ export class Terminology {
15
25
  readonly id: string
16
26
 
17
27
  @ManyToOne(type => Domain)
18
- @Field({ nullable: true })
28
+ @Field(type => Domain)
19
29
  domain?: Domain
20
30
 
21
31
  @RelationId((terminology: Terminology) => terminology.domain)
@@ -23,25 +33,23 @@ export class Terminology {
23
33
 
24
34
  @Column()
25
35
  @Field()
26
- name: string
36
+ name?: string
27
37
 
28
- @Column({
29
- nullable: true
30
- })
38
+ @Column({ nullable: true })
31
39
  @Field({ nullable: true })
32
40
  description?: string
33
41
 
34
42
  @Field()
35
43
  @Column({ length: 20 })
36
- locale: string
44
+ locale?: string
37
45
 
38
46
  @Field()
39
47
  @Column({ length: 20 })
40
- category: string
48
+ category?: string
41
49
 
42
50
  @Field()
43
51
  @Column()
44
- display: string
52
+ display?: string
45
53
 
46
54
  @CreateDateColumn()
47
55
  @Field({ nullable: true })
@@ -50,4 +58,18 @@ export class Terminology {
50
58
  @UpdateDateColumn()
51
59
  @Field({ nullable: true })
52
60
  updatedAt?: Date
61
+
62
+ @ManyToOne(type => User, { nullable: true })
63
+ @Field(type => User, { nullable: true })
64
+ creator?: User
65
+
66
+ @RelationId((terminology: Terminology) => terminology.creator)
67
+ creatorId?: string
68
+
69
+ @ManyToOne(type => User, { nullable: true })
70
+ @Field(type => User, { nullable: true })
71
+ updater?: User
72
+
73
+ @RelationId((terminology: Terminology) => terminology.updater)
74
+ updaterId?: string
53
75
  }
@@ -1,5 +1,13 @@
1
- import bootstrap from './client/bootstrap'
1
+ import bootstrap from './dist-client/bootstrap'
2
+ import route from './dist-client/route'
2
3
 
3
4
  export default {
4
- bootstrap
5
+ bootstrap,
6
+ route,
7
+ routes: [
8
+ {
9
+ tagname: 'terminology-page',
10
+ page: 'terminology-page'
11
+ }
12
+ ]
5
13
  }
@@ -0,0 +1,8 @@
1
+ {
2
+ "button.clear-cache": "clear cache",
3
+ "field.category": "category",
4
+ "field.display": "display",
5
+ "field.locale": "locale",
6
+ "text.clearing-cache": "clearing cache",
7
+ "title.terminology": "terminology"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "button.clear-cache": "キャッシュをクリア",
3
+ "field.category": "カテゴリー",
4
+ "field.display": "表示",
5
+ "field.locale": "ロケール",
6
+ "text.clearing-cache": "キャッシュをクリア",
7
+ "title.terminology": "用語"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "button.clear-cache": "캐시 삭제",
3
+ "field.category": "카테고리",
4
+ "field.display": "표시",
5
+ "field.locale": "로케일",
6
+ "text.clearing-cache": "캐시클리어",
7
+ "title.terminology": "용어"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "button.clear-cache": "kosongkan cache",
3
+ "field.category": "kategori",
4
+ "field.display": "paparan",
5
+ "field.locale": "lokaliti",
6
+ "text.clearing-cache": "sedang mengosongkan cache",
7
+ "title.terminology": "istilah"
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "button.clear-cache": "清除缓存",
3
+ "field.category": "类别",
4
+ "field.display": "显示",
5
+ "field.locale": "语言环境",
6
+ "text.clearing-cache": "正在清除缓存",
7
+ "title.terminology": "术语"
8
+ }
@@ -1,10 +0,0 @@
1
- import { PageView } from '@things-factory/shell'
2
-
3
- export default function bootstrap() {
4
- /*
5
- * PageView의 lifecycle에 languageUpdate를 추가한다.
6
- */
7
- PageView.prototype.languageUpdated = function(i18next) {
8
- this.pageReset()
9
- }
10
- }
@@ -1,9 +0,0 @@
1
- /**
2
- * @license Copyright © HatioLab Inc. All rights reserved.
3
- */
4
-
5
- import { OxI18n } from '@operato/i18n/ox-i18n.js'
6
-
7
- class I18nMsg extends OxI18n {}
8
-
9
- customElements.define('i18n-msg', I18nMsg)