@object-ui/i18n 0.5.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.
- package/.turbo/turbo-build.log +4 -0
- package/LICENSE +21 -0
- package/dist/i18n.d.ts +36 -0
- package/dist/i18n.js +62 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.js +50 -0
- package/dist/locales/ar.d.ts +112 -0
- package/dist/locales/ar.js +112 -0
- package/dist/locales/de.d.ts +111 -0
- package/dist/locales/de.js +111 -0
- package/dist/locales/en.d.ts +112 -0
- package/dist/locales/en.js +111 -0
- package/dist/locales/es.d.ts +111 -0
- package/dist/locales/es.js +111 -0
- package/dist/locales/fr.d.ts +111 -0
- package/dist/locales/fr.js +111 -0
- package/dist/locales/index.d.ts +1094 -0
- package/dist/locales/index.js +38 -0
- package/dist/locales/ja.d.ts +111 -0
- package/dist/locales/ja.js +111 -0
- package/dist/locales/ko.d.ts +111 -0
- package/dist/locales/ko.js +111 -0
- package/dist/locales/pt.d.ts +111 -0
- package/dist/locales/pt.js +111 -0
- package/dist/locales/ru.d.ts +111 -0
- package/dist/locales/ru.js +111 -0
- package/dist/locales/zh.d.ts +111 -0
- package/dist/locales/zh.js +111 -0
- package/dist/provider.d.ts +65 -0
- package/dist/provider.js +84 -0
- package/dist/utils/formatting.d.ts +45 -0
- package/dist/utils/formatting.js +86 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/package.json +48 -0
- package/src/__tests__/i18n.test.ts +228 -0
- package/src/i18n.ts +98 -0
- package/src/index.ts +63 -0
- package/src/locales/ar.ts +113 -0
- package/src/locales/de.ts +112 -0
- package/src/locales/en.ts +113 -0
- package/src/locales/es.ts +112 -0
- package/src/locales/fr.ts +112 -0
- package/src/locales/index.ts +42 -0
- package/src/locales/ja.ts +112 -0
- package/src/locales/ko.ts +112 -0
- package/src/locales/pt.ts +112 -0
- package/src/locales/ru.ts +112 -0
- package/src/locales/zh.ts +112 -0
- package/src/provider.tsx +125 -0
- package/src/utils/formatting.ts +136 -0
- package/src/utils/index.ts +10 -0
- package/tsconfig.json +12 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日本語 (ja) - Japanese language pack for Object UI
|
|
3
|
+
*/
|
|
4
|
+
const ja = {
|
|
5
|
+
common: {
|
|
6
|
+
loading: '読み込み中...',
|
|
7
|
+
save: '保存',
|
|
8
|
+
cancel: 'キャンセル',
|
|
9
|
+
delete: '削除',
|
|
10
|
+
edit: '編集',
|
|
11
|
+
create: '作成',
|
|
12
|
+
search: '検索',
|
|
13
|
+
filter: 'フィルター',
|
|
14
|
+
reset: 'リセット',
|
|
15
|
+
confirm: '確認',
|
|
16
|
+
close: '閉じる',
|
|
17
|
+
back: '戻る',
|
|
18
|
+
next: '次へ',
|
|
19
|
+
previous: '前へ',
|
|
20
|
+
submit: '送信',
|
|
21
|
+
refresh: '更新',
|
|
22
|
+
export: 'エクスポート',
|
|
23
|
+
import: 'インポート',
|
|
24
|
+
yes: 'はい',
|
|
25
|
+
no: 'いいえ',
|
|
26
|
+
ok: 'OK',
|
|
27
|
+
actions: '操作',
|
|
28
|
+
more: 'もっと見る',
|
|
29
|
+
selectAll: 'すべて選択',
|
|
30
|
+
clearAll: 'すべてクリア',
|
|
31
|
+
noData: 'データがありません',
|
|
32
|
+
noResults: '結果が見つかりません',
|
|
33
|
+
required: '必須',
|
|
34
|
+
optional: '任意',
|
|
35
|
+
},
|
|
36
|
+
validation: {
|
|
37
|
+
required: '{{field}}は必須です',
|
|
38
|
+
minLength: '{{field}}は{{min}}文字以上で入力してください',
|
|
39
|
+
maxLength: '{{field}}は{{max}}文字以下で入力してください',
|
|
40
|
+
min: '{{field}}は{{min}}以上にしてください',
|
|
41
|
+
max: '{{field}}は{{max}}以下にしてください',
|
|
42
|
+
email: '有効なメールアドレスを入力してください',
|
|
43
|
+
url: '有効なURLを入力してください',
|
|
44
|
+
pattern: '{{field}}の形式が正しくありません',
|
|
45
|
+
unique: '{{field}}は一意である必要があります',
|
|
46
|
+
type: '{{field}}は有効な{{type}}である必要があります',
|
|
47
|
+
},
|
|
48
|
+
form: {
|
|
49
|
+
addItem: '項目を追加',
|
|
50
|
+
removeItem: '項目を削除',
|
|
51
|
+
fieldRequired: 'この項目は必須です',
|
|
52
|
+
invalidFormat: '形式が正しくありません',
|
|
53
|
+
saveSuccess: '保存しました',
|
|
54
|
+
saveError: '保存に失敗しました',
|
|
55
|
+
unsavedChanges: '保存されていない変更があります。このページを離れますか?',
|
|
56
|
+
stepOf: 'ステップ {{current}} / {{total}}',
|
|
57
|
+
},
|
|
58
|
+
table: {
|
|
59
|
+
rowsPerPage: '1ページの行数',
|
|
60
|
+
showing: '{{total}}件中{{from}}〜{{to}}件を表示',
|
|
61
|
+
noRows: '表示するデータがありません',
|
|
62
|
+
sortAsc: '昇順',
|
|
63
|
+
sortDesc: '降順',
|
|
64
|
+
filterColumn: '{{column}}でフィルター',
|
|
65
|
+
columns: '列',
|
|
66
|
+
exportCSV: 'CSVエクスポート',
|
|
67
|
+
exportExcel: 'Excelエクスポート',
|
|
68
|
+
selectRow: '行を選択',
|
|
69
|
+
selectAllRows: 'すべての行を選択',
|
|
70
|
+
expandRow: '行を展開',
|
|
71
|
+
collapseRow: '行を折りたたむ',
|
|
72
|
+
},
|
|
73
|
+
calendar: {
|
|
74
|
+
today: '今日',
|
|
75
|
+
month: '月',
|
|
76
|
+
week: '週',
|
|
77
|
+
day: '日',
|
|
78
|
+
agenda: '予定表',
|
|
79
|
+
allDay: '終日',
|
|
80
|
+
noEvents: '予定はありません',
|
|
81
|
+
newEvent: '新しい予定',
|
|
82
|
+
},
|
|
83
|
+
kanban: {
|
|
84
|
+
addCard: 'カードを追加',
|
|
85
|
+
addColumn: 'カラムを追加',
|
|
86
|
+
moveCard: 'カードを移動',
|
|
87
|
+
deleteCard: 'カードを削除',
|
|
88
|
+
deleteColumn: 'カラムを削除',
|
|
89
|
+
},
|
|
90
|
+
chart: {
|
|
91
|
+
noData: 'チャートデータがありません',
|
|
92
|
+
loading: 'チャート読み込み中...',
|
|
93
|
+
},
|
|
94
|
+
dashboard: {
|
|
95
|
+
addWidget: 'ウィジェットを追加',
|
|
96
|
+
removeWidget: 'ウィジェットを削除',
|
|
97
|
+
editLayout: 'レイアウトを編集',
|
|
98
|
+
saveLayout: 'レイアウトを保存',
|
|
99
|
+
resetLayout: 'レイアウトをリセット',
|
|
100
|
+
},
|
|
101
|
+
errors: {
|
|
102
|
+
networkError: 'ネットワークエラーです。接続を確認してください。',
|
|
103
|
+
serverError: 'サーバーエラーです。後でもう一度お試しください。',
|
|
104
|
+
notFound: 'リソースが見つかりません。',
|
|
105
|
+
unauthorized: 'この操作を実行する権限がありません。',
|
|
106
|
+
forbidden: 'アクセスが拒否されました。',
|
|
107
|
+
timeout: 'リクエストがタイムアウトしました。もう一度お試しください。',
|
|
108
|
+
unknown: '予期しないエラーが発生しました。',
|
|
109
|
+
},
|
|
110
|
+
} as const;
|
|
111
|
+
|
|
112
|
+
export default ja;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 한국어 (ko) - Korean language pack for Object UI
|
|
3
|
+
*/
|
|
4
|
+
const ko = {
|
|
5
|
+
common: {
|
|
6
|
+
loading: '로딩 중...',
|
|
7
|
+
save: '저장',
|
|
8
|
+
cancel: '취소',
|
|
9
|
+
delete: '삭제',
|
|
10
|
+
edit: '편집',
|
|
11
|
+
create: '생성',
|
|
12
|
+
search: '검색',
|
|
13
|
+
filter: '필터',
|
|
14
|
+
reset: '초기화',
|
|
15
|
+
confirm: '확인',
|
|
16
|
+
close: '닫기',
|
|
17
|
+
back: '뒤로',
|
|
18
|
+
next: '다음',
|
|
19
|
+
previous: '이전',
|
|
20
|
+
submit: '제출',
|
|
21
|
+
refresh: '새로고침',
|
|
22
|
+
export: '내보내기',
|
|
23
|
+
import: '가져오기',
|
|
24
|
+
yes: '예',
|
|
25
|
+
no: '아니오',
|
|
26
|
+
ok: '확인',
|
|
27
|
+
actions: '작업',
|
|
28
|
+
more: '더보기',
|
|
29
|
+
selectAll: '모두 선택',
|
|
30
|
+
clearAll: '모두 지우기',
|
|
31
|
+
noData: '데이터 없음',
|
|
32
|
+
noResults: '결과를 찾을 수 없습니다',
|
|
33
|
+
required: '필수',
|
|
34
|
+
optional: '선택',
|
|
35
|
+
},
|
|
36
|
+
validation: {
|
|
37
|
+
required: '{{field}}은(는) 필수입니다',
|
|
38
|
+
minLength: '{{field}}은(는) 최소 {{min}}자 이상이어야 합니다',
|
|
39
|
+
maxLength: '{{field}}은(는) 최대 {{max}}자까지 가능합니다',
|
|
40
|
+
min: '{{field}}은(는) {{min}} 이상이어야 합니다',
|
|
41
|
+
max: '{{field}}은(는) {{max}} 이하여야 합니다',
|
|
42
|
+
email: '유효한 이메일 주소를 입력해주세요',
|
|
43
|
+
url: '유효한 URL을 입력해주세요',
|
|
44
|
+
pattern: '{{field}} 형식이 올바르지 않습니다',
|
|
45
|
+
unique: '{{field}}은(는) 고유해야 합니다',
|
|
46
|
+
type: '{{field}}은(는) 유효한 {{type}}이어야 합니다',
|
|
47
|
+
},
|
|
48
|
+
form: {
|
|
49
|
+
addItem: '항목 추가',
|
|
50
|
+
removeItem: '항목 제거',
|
|
51
|
+
fieldRequired: '이 필드는 필수입니다',
|
|
52
|
+
invalidFormat: '형식이 올바르지 않습니다',
|
|
53
|
+
saveSuccess: '저장되었습니다',
|
|
54
|
+
saveError: '저장에 실패했습니다',
|
|
55
|
+
unsavedChanges: '저장하지 않은 변경사항이 있습니다. 페이지를 떠나시겠습니까?',
|
|
56
|
+
stepOf: '{{total}}단계 중 {{current}}단계',
|
|
57
|
+
},
|
|
58
|
+
table: {
|
|
59
|
+
rowsPerPage: '페이지당 행 수',
|
|
60
|
+
showing: '{{total}}개 중 {{from}}~{{to}} 표시',
|
|
61
|
+
noRows: '표시할 데이터가 없습니다',
|
|
62
|
+
sortAsc: '오름차순 정렬',
|
|
63
|
+
sortDesc: '내림차순 정렬',
|
|
64
|
+
filterColumn: '{{column}} 필터',
|
|
65
|
+
columns: '열',
|
|
66
|
+
exportCSV: 'CSV 내보내기',
|
|
67
|
+
exportExcel: 'Excel 내보내기',
|
|
68
|
+
selectRow: '행 선택',
|
|
69
|
+
selectAllRows: '모든 행 선택',
|
|
70
|
+
expandRow: '행 펼치기',
|
|
71
|
+
collapseRow: '행 접기',
|
|
72
|
+
},
|
|
73
|
+
calendar: {
|
|
74
|
+
today: '오늘',
|
|
75
|
+
month: '월',
|
|
76
|
+
week: '주',
|
|
77
|
+
day: '일',
|
|
78
|
+
agenda: '일정',
|
|
79
|
+
allDay: '종일',
|
|
80
|
+
noEvents: '일정이 없습니다',
|
|
81
|
+
newEvent: '새 일정',
|
|
82
|
+
},
|
|
83
|
+
kanban: {
|
|
84
|
+
addCard: '카드 추가',
|
|
85
|
+
addColumn: '열 추가',
|
|
86
|
+
moveCard: '카드 이동',
|
|
87
|
+
deleteCard: '카드 삭제',
|
|
88
|
+
deleteColumn: '열 삭제',
|
|
89
|
+
},
|
|
90
|
+
chart: {
|
|
91
|
+
noData: '차트 데이터가 없습니다',
|
|
92
|
+
loading: '차트 로딩 중...',
|
|
93
|
+
},
|
|
94
|
+
dashboard: {
|
|
95
|
+
addWidget: '위젯 추가',
|
|
96
|
+
removeWidget: '위젯 제거',
|
|
97
|
+
editLayout: '레이아웃 편집',
|
|
98
|
+
saveLayout: '레이아웃 저장',
|
|
99
|
+
resetLayout: '레이아웃 초기화',
|
|
100
|
+
},
|
|
101
|
+
errors: {
|
|
102
|
+
networkError: '네트워크 오류입니다. 연결을 확인해주세요.',
|
|
103
|
+
serverError: '서버 오류입니다. 나중에 다시 시도해주세요.',
|
|
104
|
+
notFound: '리소스를 찾을 수 없습니다.',
|
|
105
|
+
unauthorized: '이 작업을 수행할 권한이 없습니다.',
|
|
106
|
+
forbidden: '접근이 거부되었습니다.',
|
|
107
|
+
timeout: '요청 시간이 초과되었습니다. 다시 시도해주세요.',
|
|
108
|
+
unknown: '예기치 않은 오류가 발생했습니다.',
|
|
109
|
+
},
|
|
110
|
+
} as const;
|
|
111
|
+
|
|
112
|
+
export default ko;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Português (pt) - Portuguese language pack for Object UI
|
|
3
|
+
*/
|
|
4
|
+
const pt = {
|
|
5
|
+
common: {
|
|
6
|
+
loading: 'Carregando...',
|
|
7
|
+
save: 'Salvar',
|
|
8
|
+
cancel: 'Cancelar',
|
|
9
|
+
delete: 'Excluir',
|
|
10
|
+
edit: 'Editar',
|
|
11
|
+
create: 'Criar',
|
|
12
|
+
search: 'Pesquisar',
|
|
13
|
+
filter: 'Filtrar',
|
|
14
|
+
reset: 'Redefinir',
|
|
15
|
+
confirm: 'Confirmar',
|
|
16
|
+
close: 'Fechar',
|
|
17
|
+
back: 'Voltar',
|
|
18
|
+
next: 'Próximo',
|
|
19
|
+
previous: 'Anterior',
|
|
20
|
+
submit: 'Enviar',
|
|
21
|
+
refresh: 'Atualizar',
|
|
22
|
+
export: 'Exportar',
|
|
23
|
+
import: 'Importar',
|
|
24
|
+
yes: 'Sim',
|
|
25
|
+
no: 'Não',
|
|
26
|
+
ok: 'OK',
|
|
27
|
+
actions: 'Ações',
|
|
28
|
+
more: 'Mais',
|
|
29
|
+
selectAll: 'Selecionar tudo',
|
|
30
|
+
clearAll: 'Limpar tudo',
|
|
31
|
+
noData: 'Sem dados',
|
|
32
|
+
noResults: 'Nenhum resultado encontrado',
|
|
33
|
+
required: 'Obrigatório',
|
|
34
|
+
optional: 'Opcional',
|
|
35
|
+
},
|
|
36
|
+
validation: {
|
|
37
|
+
required: '{{field}} é obrigatório',
|
|
38
|
+
minLength: '{{field}} deve ter pelo menos {{min}} caracteres',
|
|
39
|
+
maxLength: '{{field}} deve ter no máximo {{max}} caracteres',
|
|
40
|
+
min: '{{field}} deve ser pelo menos {{min}}',
|
|
41
|
+
max: '{{field}} deve ser no máximo {{max}}',
|
|
42
|
+
email: 'Por favor, insira um endereço de e-mail válido',
|
|
43
|
+
url: 'Por favor, insira uma URL válida',
|
|
44
|
+
pattern: 'O formato de {{field}} é inválido',
|
|
45
|
+
unique: '{{field}} deve ser único',
|
|
46
|
+
type: '{{field}} deve ser um {{type}} válido',
|
|
47
|
+
},
|
|
48
|
+
form: {
|
|
49
|
+
addItem: 'Adicionar item',
|
|
50
|
+
removeItem: 'Remover item',
|
|
51
|
+
fieldRequired: 'Este campo é obrigatório',
|
|
52
|
+
invalidFormat: 'Formato inválido',
|
|
53
|
+
saveSuccess: 'Salvo com sucesso',
|
|
54
|
+
saveError: 'Falha ao salvar',
|
|
55
|
+
unsavedChanges: 'Você tem alterações não salvas. Tem certeza de que deseja sair?',
|
|
56
|
+
stepOf: 'Etapa {{current}} de {{total}}',
|
|
57
|
+
},
|
|
58
|
+
table: {
|
|
59
|
+
rowsPerPage: 'Linhas por página',
|
|
60
|
+
showing: 'Mostrando {{from}} a {{to}} de {{total}}',
|
|
61
|
+
noRows: 'Nenhuma linha para exibir',
|
|
62
|
+
sortAsc: 'Ordenar crescente',
|
|
63
|
+
sortDesc: 'Ordenar decrescente',
|
|
64
|
+
filterColumn: 'Filtrar {{column}}',
|
|
65
|
+
columns: 'Colunas',
|
|
66
|
+
exportCSV: 'Exportar CSV',
|
|
67
|
+
exportExcel: 'Exportar Excel',
|
|
68
|
+
selectRow: 'Selecionar linha',
|
|
69
|
+
selectAllRows: 'Selecionar todas as linhas',
|
|
70
|
+
expandRow: 'Expandir linha',
|
|
71
|
+
collapseRow: 'Recolher linha',
|
|
72
|
+
},
|
|
73
|
+
calendar: {
|
|
74
|
+
today: 'Hoje',
|
|
75
|
+
month: 'Mês',
|
|
76
|
+
week: 'Semana',
|
|
77
|
+
day: 'Dia',
|
|
78
|
+
agenda: 'Agenda',
|
|
79
|
+
allDay: 'Dia inteiro',
|
|
80
|
+
noEvents: 'Sem eventos',
|
|
81
|
+
newEvent: 'Novo evento',
|
|
82
|
+
},
|
|
83
|
+
kanban: {
|
|
84
|
+
addCard: 'Adicionar cartão',
|
|
85
|
+
addColumn: 'Adicionar coluna',
|
|
86
|
+
moveCard: 'Mover cartão',
|
|
87
|
+
deleteCard: 'Excluir cartão',
|
|
88
|
+
deleteColumn: 'Excluir coluna',
|
|
89
|
+
},
|
|
90
|
+
chart: {
|
|
91
|
+
noData: 'Nenhum dado de gráfico disponível',
|
|
92
|
+
loading: 'Carregando gráfico...',
|
|
93
|
+
},
|
|
94
|
+
dashboard: {
|
|
95
|
+
addWidget: 'Adicionar widget',
|
|
96
|
+
removeWidget: 'Remover widget',
|
|
97
|
+
editLayout: 'Editar layout',
|
|
98
|
+
saveLayout: 'Salvar layout',
|
|
99
|
+
resetLayout: 'Redefinir layout',
|
|
100
|
+
},
|
|
101
|
+
errors: {
|
|
102
|
+
networkError: 'Erro de rede. Por favor, verifique sua conexão.',
|
|
103
|
+
serverError: 'Erro no servidor. Por favor, tente novamente mais tarde.',
|
|
104
|
+
notFound: 'Recurso não encontrado.',
|
|
105
|
+
unauthorized: 'Você não tem permissão para realizar esta ação.',
|
|
106
|
+
forbidden: 'Acesso negado.',
|
|
107
|
+
timeout: 'Tempo limite excedido. Por favor, tente novamente.',
|
|
108
|
+
unknown: 'Ocorreu um erro inesperado.',
|
|
109
|
+
},
|
|
110
|
+
} as const;
|
|
111
|
+
|
|
112
|
+
export default pt;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Русский (ru) - Russian language pack for Object UI
|
|
3
|
+
*/
|
|
4
|
+
const ru = {
|
|
5
|
+
common: {
|
|
6
|
+
loading: 'Загрузка...',
|
|
7
|
+
save: 'Сохранить',
|
|
8
|
+
cancel: 'Отмена',
|
|
9
|
+
delete: 'Удалить',
|
|
10
|
+
edit: 'Редактировать',
|
|
11
|
+
create: 'Создать',
|
|
12
|
+
search: 'Поиск',
|
|
13
|
+
filter: 'Фильтр',
|
|
14
|
+
reset: 'Сбросить',
|
|
15
|
+
confirm: 'Подтвердить',
|
|
16
|
+
close: 'Закрыть',
|
|
17
|
+
back: 'Назад',
|
|
18
|
+
next: 'Далее',
|
|
19
|
+
previous: 'Назад',
|
|
20
|
+
submit: 'Отправить',
|
|
21
|
+
refresh: 'Обновить',
|
|
22
|
+
export: 'Экспорт',
|
|
23
|
+
import: 'Импорт',
|
|
24
|
+
yes: 'Да',
|
|
25
|
+
no: 'Нет',
|
|
26
|
+
ok: 'ОК',
|
|
27
|
+
actions: 'Действия',
|
|
28
|
+
more: 'Ещё',
|
|
29
|
+
selectAll: 'Выбрать все',
|
|
30
|
+
clearAll: 'Очистить все',
|
|
31
|
+
noData: 'Нет данных',
|
|
32
|
+
noResults: 'Результаты не найдены',
|
|
33
|
+
required: 'Обязательно',
|
|
34
|
+
optional: 'Необязательно',
|
|
35
|
+
},
|
|
36
|
+
validation: {
|
|
37
|
+
required: 'Поле {{field}} обязательно для заполнения',
|
|
38
|
+
minLength: '{{field}} должно содержать не менее {{min}} символов',
|
|
39
|
+
maxLength: '{{field}} должно содержать не более {{max}} символов',
|
|
40
|
+
min: '{{field}} должно быть не менее {{min}}',
|
|
41
|
+
max: '{{field}} должно быть не более {{max}}',
|
|
42
|
+
email: 'Пожалуйста, введите корректный адрес электронной почты',
|
|
43
|
+
url: 'Пожалуйста, введите корректный URL',
|
|
44
|
+
pattern: 'Неверный формат поля {{field}}',
|
|
45
|
+
unique: '{{field}} должно быть уникальным',
|
|
46
|
+
type: '{{field}} должно быть допустимым {{type}}',
|
|
47
|
+
},
|
|
48
|
+
form: {
|
|
49
|
+
addItem: 'Добавить элемент',
|
|
50
|
+
removeItem: 'Удалить элемент',
|
|
51
|
+
fieldRequired: 'Это поле обязательно',
|
|
52
|
+
invalidFormat: 'Неверный формат',
|
|
53
|
+
saveSuccess: 'Успешно сохранено',
|
|
54
|
+
saveError: 'Ошибка сохранения',
|
|
55
|
+
unsavedChanges: 'У вас есть несохранённые изменения. Вы уверены, что хотите покинуть страницу?',
|
|
56
|
+
stepOf: 'Шаг {{current}} из {{total}}',
|
|
57
|
+
},
|
|
58
|
+
table: {
|
|
59
|
+
rowsPerPage: 'Строк на странице',
|
|
60
|
+
showing: 'Показано с {{from}} по {{to}} из {{total}}',
|
|
61
|
+
noRows: 'Нет строк для отображения',
|
|
62
|
+
sortAsc: 'Сортировка по возрастанию',
|
|
63
|
+
sortDesc: 'Сортировка по убыванию',
|
|
64
|
+
filterColumn: 'Фильтр по {{column}}',
|
|
65
|
+
columns: 'Столбцы',
|
|
66
|
+
exportCSV: 'Экспорт в CSV',
|
|
67
|
+
exportExcel: 'Экспорт в Excel',
|
|
68
|
+
selectRow: 'Выбрать строку',
|
|
69
|
+
selectAllRows: 'Выбрать все строки',
|
|
70
|
+
expandRow: 'Развернуть строку',
|
|
71
|
+
collapseRow: 'Свернуть строку',
|
|
72
|
+
},
|
|
73
|
+
calendar: {
|
|
74
|
+
today: 'Сегодня',
|
|
75
|
+
month: 'Месяц',
|
|
76
|
+
week: 'Неделя',
|
|
77
|
+
day: 'День',
|
|
78
|
+
agenda: 'Расписание',
|
|
79
|
+
allDay: 'Весь день',
|
|
80
|
+
noEvents: 'Нет событий',
|
|
81
|
+
newEvent: 'Новое событие',
|
|
82
|
+
},
|
|
83
|
+
kanban: {
|
|
84
|
+
addCard: 'Добавить карточку',
|
|
85
|
+
addColumn: 'Добавить колонку',
|
|
86
|
+
moveCard: 'Переместить карточку',
|
|
87
|
+
deleteCard: 'Удалить карточку',
|
|
88
|
+
deleteColumn: 'Удалить колонку',
|
|
89
|
+
},
|
|
90
|
+
chart: {
|
|
91
|
+
noData: 'Нет данных для графика',
|
|
92
|
+
loading: 'Загрузка графика...',
|
|
93
|
+
},
|
|
94
|
+
dashboard: {
|
|
95
|
+
addWidget: 'Добавить виджет',
|
|
96
|
+
removeWidget: 'Удалить виджет',
|
|
97
|
+
editLayout: 'Редактировать макет',
|
|
98
|
+
saveLayout: 'Сохранить макет',
|
|
99
|
+
resetLayout: 'Сбросить макет',
|
|
100
|
+
},
|
|
101
|
+
errors: {
|
|
102
|
+
networkError: 'Ошибка сети. Проверьте подключение к интернету.',
|
|
103
|
+
serverError: 'Ошибка сервера. Попробуйте позже.',
|
|
104
|
+
notFound: 'Ресурс не найден.',
|
|
105
|
+
unauthorized: 'У вас нет прав для выполнения этого действия.',
|
|
106
|
+
forbidden: 'Доступ запрещён.',
|
|
107
|
+
timeout: 'Время ожидания истекло. Попробуйте снова.',
|
|
108
|
+
unknown: 'Произошла непредвиденная ошибка.',
|
|
109
|
+
},
|
|
110
|
+
} as const;
|
|
111
|
+
|
|
112
|
+
export default ru;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 中文 (zh) - Chinese language pack for Object UI
|
|
3
|
+
*/
|
|
4
|
+
const zh = {
|
|
5
|
+
common: {
|
|
6
|
+
loading: '加载中...',
|
|
7
|
+
save: '保存',
|
|
8
|
+
cancel: '取消',
|
|
9
|
+
delete: '删除',
|
|
10
|
+
edit: '编辑',
|
|
11
|
+
create: '新建',
|
|
12
|
+
search: '搜索',
|
|
13
|
+
filter: '筛选',
|
|
14
|
+
reset: '重置',
|
|
15
|
+
confirm: '确认',
|
|
16
|
+
close: '关闭',
|
|
17
|
+
back: '返回',
|
|
18
|
+
next: '下一步',
|
|
19
|
+
previous: '上一步',
|
|
20
|
+
submit: '提交',
|
|
21
|
+
refresh: '刷新',
|
|
22
|
+
export: '导出',
|
|
23
|
+
import: '导入',
|
|
24
|
+
yes: '是',
|
|
25
|
+
no: '否',
|
|
26
|
+
ok: '确定',
|
|
27
|
+
actions: '操作',
|
|
28
|
+
more: '更多',
|
|
29
|
+
selectAll: '全选',
|
|
30
|
+
clearAll: '清除全部',
|
|
31
|
+
noData: '暂无数据',
|
|
32
|
+
noResults: '未找到结果',
|
|
33
|
+
required: '必填',
|
|
34
|
+
optional: '选填',
|
|
35
|
+
},
|
|
36
|
+
validation: {
|
|
37
|
+
required: '{{field}}不能为空',
|
|
38
|
+
minLength: '{{field}}至少需要{{min}}个字符',
|
|
39
|
+
maxLength: '{{field}}最多{{max}}个字符',
|
|
40
|
+
min: '{{field}}不能小于{{min}}',
|
|
41
|
+
max: '{{field}}不能大于{{max}}',
|
|
42
|
+
email: '请输入有效的邮箱地址',
|
|
43
|
+
url: '请输入有效的URL',
|
|
44
|
+
pattern: '{{field}}格式不正确',
|
|
45
|
+
unique: '{{field}}必须唯一',
|
|
46
|
+
type: '{{field}}必须是有效的{{type}}',
|
|
47
|
+
},
|
|
48
|
+
form: {
|
|
49
|
+
addItem: '添加项目',
|
|
50
|
+
removeItem: '移除项目',
|
|
51
|
+
fieldRequired: '此字段为必填项',
|
|
52
|
+
invalidFormat: '格式不正确',
|
|
53
|
+
saveSuccess: '保存成功',
|
|
54
|
+
saveError: '保存失败',
|
|
55
|
+
unsavedChanges: '您有未保存的更改,确定要离开吗?',
|
|
56
|
+
stepOf: '第{{current}}步,共{{total}}步',
|
|
57
|
+
},
|
|
58
|
+
table: {
|
|
59
|
+
rowsPerPage: '每页行数',
|
|
60
|
+
showing: '显示第{{from}}到{{to}}条,共{{total}}条',
|
|
61
|
+
noRows: '暂无数据',
|
|
62
|
+
sortAsc: '升序排列',
|
|
63
|
+
sortDesc: '降序排列',
|
|
64
|
+
filterColumn: '筛选{{column}}',
|
|
65
|
+
columns: '列',
|
|
66
|
+
exportCSV: '导出CSV',
|
|
67
|
+
exportExcel: '导出Excel',
|
|
68
|
+
selectRow: '选择行',
|
|
69
|
+
selectAllRows: '选择所有行',
|
|
70
|
+
expandRow: '展开行',
|
|
71
|
+
collapseRow: '折叠行',
|
|
72
|
+
},
|
|
73
|
+
calendar: {
|
|
74
|
+
today: '今天',
|
|
75
|
+
month: '月',
|
|
76
|
+
week: '周',
|
|
77
|
+
day: '日',
|
|
78
|
+
agenda: '日程',
|
|
79
|
+
allDay: '全天',
|
|
80
|
+
noEvents: '暂无事件',
|
|
81
|
+
newEvent: '新建事件',
|
|
82
|
+
},
|
|
83
|
+
kanban: {
|
|
84
|
+
addCard: '添加卡片',
|
|
85
|
+
addColumn: '添加列',
|
|
86
|
+
moveCard: '移动卡片',
|
|
87
|
+
deleteCard: '删除卡片',
|
|
88
|
+
deleteColumn: '删除列',
|
|
89
|
+
},
|
|
90
|
+
chart: {
|
|
91
|
+
noData: '暂无图表数据',
|
|
92
|
+
loading: '图表加载中...',
|
|
93
|
+
},
|
|
94
|
+
dashboard: {
|
|
95
|
+
addWidget: '添加组件',
|
|
96
|
+
removeWidget: '移除组件',
|
|
97
|
+
editLayout: '编辑布局',
|
|
98
|
+
saveLayout: '保存布局',
|
|
99
|
+
resetLayout: '重置布局',
|
|
100
|
+
},
|
|
101
|
+
errors: {
|
|
102
|
+
networkError: '网络错误,请检查网络连接。',
|
|
103
|
+
serverError: '服务器错误,请稍后重试。',
|
|
104
|
+
notFound: '资源未找到。',
|
|
105
|
+
unauthorized: '您没有权限执行此操作。',
|
|
106
|
+
forbidden: '访问被拒绝。',
|
|
107
|
+
timeout: '请求超时,请重试。',
|
|
108
|
+
unknown: '发生未知错误。',
|
|
109
|
+
},
|
|
110
|
+
} as const;
|
|
111
|
+
|
|
112
|
+
export default zh;
|
package/src/provider.tsx
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @object-ui/i18n - React integration
|
|
3
|
+
*
|
|
4
|
+
* Provides I18nProvider and useObjectTranslation hook for React components.
|
|
5
|
+
*/
|
|
6
|
+
import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';
|
|
7
|
+
import { I18nextProvider, useTranslation } from 'react-i18next';
|
|
8
|
+
import type { i18n as I18nInstance } from 'i18next';
|
|
9
|
+
import { createI18n, getDirection, type I18nConfig } from './i18n';
|
|
10
|
+
|
|
11
|
+
interface I18nContextValue {
|
|
12
|
+
/** Current language code */
|
|
13
|
+
language: string;
|
|
14
|
+
/** Change the active language */
|
|
15
|
+
changeLanguage: (lang: string) => Promise<void>;
|
|
16
|
+
/** Current text direction ('ltr' or 'rtl') */
|
|
17
|
+
direction: 'ltr' | 'rtl';
|
|
18
|
+
/** The underlying i18next instance */
|
|
19
|
+
i18n: I18nInstance;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const ObjectI18nContext = createContext<I18nContextValue | null>(null);
|
|
23
|
+
|
|
24
|
+
export interface I18nProviderProps {
|
|
25
|
+
/** i18n configuration options */
|
|
26
|
+
config?: I18nConfig;
|
|
27
|
+
/** Pre-created i18next instance (overrides config) */
|
|
28
|
+
instance?: I18nInstance;
|
|
29
|
+
/** Children to render */
|
|
30
|
+
children: React.ReactNode;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* I18nProvider - Wraps your app with i18n support
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```tsx
|
|
38
|
+
* <I18nProvider config={{ defaultLanguage: 'zh' }}>
|
|
39
|
+
* <App />
|
|
40
|
+
* </I18nProvider>
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export function I18nProvider({ config, instance: externalInstance, children }: I18nProviderProps) {
|
|
44
|
+
const i18nInstance = useMemo(
|
|
45
|
+
() => externalInstance || createI18n(config),
|
|
46
|
+
[externalInstance], // eslint-disable-line react-hooks/exhaustive-deps
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const [language, setLanguage] = useState(i18nInstance.language || 'en');
|
|
50
|
+
const direction = getDirection(language);
|
|
51
|
+
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
const handleLanguageChanged = (lng: string) => {
|
|
54
|
+
setLanguage(lng);
|
|
55
|
+
// Update document direction for RTL support
|
|
56
|
+
if (typeof document !== 'undefined') {
|
|
57
|
+
document.documentElement.dir = getDirection(lng);
|
|
58
|
+
document.documentElement.lang = lng;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
i18nInstance.on('languageChanged', handleLanguageChanged);
|
|
63
|
+
return () => {
|
|
64
|
+
i18nInstance.off('languageChanged', handleLanguageChanged);
|
|
65
|
+
};
|
|
66
|
+
}, [i18nInstance]);
|
|
67
|
+
|
|
68
|
+
const contextValue = useMemo<I18nContextValue>(
|
|
69
|
+
() => ({
|
|
70
|
+
language,
|
|
71
|
+
changeLanguage: async (lang: string) => {
|
|
72
|
+
await i18nInstance.changeLanguage(lang);
|
|
73
|
+
},
|
|
74
|
+
direction,
|
|
75
|
+
i18n: i18nInstance,
|
|
76
|
+
}),
|
|
77
|
+
[language, direction, i18nInstance],
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
return React.createElement(
|
|
81
|
+
ObjectI18nContext.Provider,
|
|
82
|
+
{ value: contextValue },
|
|
83
|
+
React.createElement(I18nextProvider, { i18n: i18nInstance }, children),
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Hook to access Object UI i18n context
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```tsx
|
|
92
|
+
* function MyComponent() {
|
|
93
|
+
* const { t, language, changeLanguage, direction } = useObjectTranslation();
|
|
94
|
+
* return <div dir={direction}>{t('common.save')}</div>;
|
|
95
|
+
* }
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export function useObjectTranslation(ns?: string) {
|
|
99
|
+
const context = useContext(ObjectI18nContext);
|
|
100
|
+
const { t, i18n } = useTranslation(ns);
|
|
101
|
+
|
|
102
|
+
return {
|
|
103
|
+
/** Translation function */
|
|
104
|
+
t,
|
|
105
|
+
/** Current language code */
|
|
106
|
+
language: context?.language || i18n.language || 'en',
|
|
107
|
+
/** Change the active language */
|
|
108
|
+
changeLanguage: context?.changeLanguage || (async (lang: string) => { await i18n.changeLanguage(lang); }),
|
|
109
|
+
/** Current text direction */
|
|
110
|
+
direction: context?.direction || 'ltr',
|
|
111
|
+
/** The underlying i18next instance */
|
|
112
|
+
i18n,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Hook to access the i18n context directly
|
|
118
|
+
*/
|
|
119
|
+
export function useI18nContext(): I18nContextValue {
|
|
120
|
+
const context = useContext(ObjectI18nContext);
|
|
121
|
+
if (!context) {
|
|
122
|
+
throw new Error('useI18nContext must be used within an I18nProvider');
|
|
123
|
+
}
|
|
124
|
+
return context;
|
|
125
|
+
}
|