Просмотр исходного кода

Merge pull request #6522 from weseek/fix/103652-admin-translation-us-jp-zh

Fix/103652 admin translation us jp zh
Yuki Takei 3 лет назад
Родитель
Сommit
14930338cf
23 измененных файлов с 77 добавлено и 69 удалено
  1. 6 4
      packages/app/public/static/locales/en_US/admin.json
  2. 1 3
      packages/app/public/static/locales/en_US/translation.json
  3. 21 5
      packages/app/public/static/locales/ja_JP/admin.json
  4. 0 9
      packages/app/public/static/locales/ja_JP/translation.json
  5. 3 3
      packages/app/public/static/locales/zh_CN/admin.json
  6. 1 1
      packages/app/public/static/locales/zh_CN/translation.json
  7. 1 1
      packages/app/src/components/Admin/Common/AdminNavigation.jsx
  8. 4 4
      packages/app/src/components/Admin/Customize/CustomizeLayoutSetting.tsx
  9. 6 6
      packages/app/src/components/Admin/Customize/CustomizeSidebarSetting.tsx
  10. 2 2
      packages/app/src/components/Admin/Customize/CustomizeThemeOptions.jsx
  11. 5 5
      packages/app/src/components/Admin/ExportArchiveDataPage.jsx
  12. 1 1
      packages/app/src/components/Admin/ImportData/ImportDataPageContents.jsx
  13. 6 6
      packages/app/src/components/Admin/LegacySlackIntegration/SlackConfiguration.jsx
  14. 2 2
      packages/app/src/components/Admin/Notification/TriggerEventCheckBox.jsx
  15. 1 1
      packages/app/src/components/Admin/Security/LocalSecuritySettingContents.jsx
  16. 1 1
      packages/app/src/components/Admin/Security/SamlSecuritySettingContents.jsx
  17. 2 2
      packages/app/src/components/Admin/Security/SecuritySetting.jsx
  18. 4 4
      packages/app/src/components/Admin/UserGroupDetail/UserGroupDetailPage.tsx
  19. 2 2
      packages/app/src/components/Admin/UserGroupDetail/UserGroupPageList.tsx
  20. 1 1
      packages/app/src/components/Admin/UserGroupDetail/UserGroupUserTable.tsx
  21. 1 1
      packages/app/src/components/Admin/Users/UserTable.jsx
  22. 2 2
      packages/app/src/pages/admin/[[...path]].page.tsx
  23. 4 3
      packages/app/src/server/service/export.js

+ 6 - 4
packages/app/public/static/locales/en_US/admin.json

@@ -268,9 +268,6 @@
     "delete_notification_pattern_desc2": "Once deleted, it cannot be recovered",
     "delete_notification_pattern_desc2": "Once deleted, it cannot be recovered",
     "toggle_notification": "Updated setting of {{path}}"
     "toggle_notification": "Updated setting of {{path}}"
   },
   },
-  "customize": "Customize",
-  "import_data": "Import Data",
-  "export_archive_data": "Export Archive Data",
   "mailer_setup_required":"<a href='/admin/app'>Email settings</a> are required to send.",
   "mailer_setup_required":"<a href='/admin/app'>Email settings</a> are required to send.",
   "admin_top": {
   "admin_top": {
     "management_wiki": "Management Wiki",
     "management_wiki": "Management Wiki",
@@ -421,7 +418,8 @@
       "import_recommended": "Import recommended {{target}}"
       "import_recommended": "Import recommended {{target}}"
     }
     }
   },
   },
-  "customize_setting": {
+  "customize_settings": {
+    "customize_settings": "Customize",
     "default_sidebar_mode": {
     "default_sidebar_mode": {
       "title": "Default sidebar mode",
       "title": "Default sidebar mode",
       "desc": "You can set the sidebar mode for new users and guests visiting the page.",
       "desc": "You can set the sidebar mode for new users and guests visiting the page.",
@@ -489,6 +487,7 @@
     "delete_logo": "Delete Logo"
     "delete_logo": "Delete Logo"
   },
   },
   "importer_management": {
   "importer_management": {
+    "import_data": "Import Data",
     "beta_warning": "This function is Beta.",
     "beta_warning": "This function is Beta.",
     "import_from": "Import from {{from}}",
     "import_from": "Import from {{from}}",
     "import_growi_archive": "Import GROWI archive",
     "import_growi_archive": "Import GROWI archive",
@@ -560,6 +559,7 @@
     "Directory_hierarchy_tag": "Directory hierarchy tag"
     "Directory_hierarchy_tag": "Directory hierarchy tag"
   },
   },
   "export_management": {
   "export_management": {
+    "export_archive_data": "Export Archive Data",
     "exporting_collection_list": "Exporting Collection List",
     "exporting_collection_list": "Exporting Collection List",
     "exported_data_list": "Exported Archive Data List",
     "exported_data_list": "Exported Archive Data List",
     "export_collections": "Export Collections",
     "export_collections": "Export Collections",
@@ -706,6 +706,7 @@
     "user_management": "User Management",
     "user_management": "User Management",
     "invite_users": "Temporarily issue a new user",
     "invite_users": "Temporarily issue a new user",
     "click_twice_same_checkbox": "You should check at least one checkbox.",
     "click_twice_same_checkbox": "You should check at least one checkbox.",
+    "status": "Status",
     "invite_modal": {
     "invite_modal": {
       "emails": "Emails (Possible to issue multiple people with new lines)",
       "emails": "Emails (Possible to issue multiple people with new lines)",
       "description1":"Temporarily issue new users by email addresses.",
       "description1":"Temporarily issue new users by email addresses.",
@@ -768,6 +769,7 @@
     "deny_create_group": "You can't create a new group with the current settings.",
     "deny_create_group": "You can't create a new group with the current settings.",
     "group_name": "Group name",
     "group_name": "Group name",
     "group_example": "e.g. : Group1",
     "group_example": "e.g. : Group1",
+    "child_user_group": "Child User Group",
     "parent_group": "Parent Group",
     "parent_group": "Parent Group",
     "select_parent_group": "Select Parent Group",
     "select_parent_group": "Select Parent Group",
     "release_parent_group": "Release parent group",
     "release_parent_group": "Release parent group",

+ 1 - 3
packages/app/public/static/locales/en_US/translation.json

@@ -40,7 +40,6 @@
   "Page Path": "Page path",
   "Page Path": "Page path",
   "Category": "Category",
   "Category": "Category",
   "User": "User",
   "User": "User",
-  "status": "Status",
   "account_id": "Account Id",
   "account_id": "Account Id",
   "Update": "Update",
   "Update": "Update",
   "Update Page": "Update Page",
   "Update Page": "Update Page",
@@ -79,7 +78,7 @@
   "username": "Username",
   "username": "Username",
   "Created": "Created",
   "Created": "Created",
   "Last updated": "Updated",
   "Last updated": "Updated",
-  "Last_Login": "Last login",
+  "last_login": "Last login",
   "Share": "Share",
   "Share": "Share",
   "Markdown Link": "Markdown Link",
   "Markdown Link": "Markdown Link",
   "Create/Edit Template": "Create/Edit template page",
   "Create/Edit Template": "Create/Edit template page",
@@ -120,7 +119,6 @@
   "Site URL settings": "Site URL settings",
   "Site URL settings": "Site URL settings",
   "external_account_management": "External Account Management",
   "external_account_management": "External Account Management",
   "UserGroup": "UserGroup",
   "UserGroup": "UserGroup",
-  "ChildUserGroup": "ChildUserGroup",
   "Basic Settings": "Basic Settings",
   "Basic Settings": "Basic Settings",
   "Basic authentication": "Basic authentication",
   "Basic authentication": "Basic authentication",
   "Register limitation": "Register limitation",
   "Register limitation": "Register limitation",

+ 21 - 5
packages/app/public/static/locales/ja_JP/admin.json

@@ -1,4 +1,13 @@
 {
 {
+  "Update": "更新",
+  "Delete": "削除",
+  "User": "ユーザー",
+  "Name": "名前",
+  "Page": "ページ",
+  "Created": "作成日",
+  "Edit": "編集",
+  "Description": "説明",
+  "last_login": "最終ログイン",
   "wiki_management_home_page": "Wiki管理トップ",
   "wiki_management_home_page": "Wiki管理トップ",
   "app_settings": "アプリ設定",
   "app_settings": "アプリ設定",
   "public": "公開",
   "public": "公開",
@@ -268,9 +277,6 @@
     "delete_notification_pattern_desc2": "Once deleted, it cannot be recovered",
     "delete_notification_pattern_desc2": "Once deleted, it cannot be recovered",
     "toggle_notification": "{{path}}の通知設定を変更しました"
     "toggle_notification": "{{path}}の通知設定を変更しました"
   },
   },
-  "customize": "カスタマイズ",
-  "import_data": "データインポート",
-  "export_archive_data": "データアーカイブ",
   "full_text_search_management": {
   "full_text_search_management": {
     "full_text_search_management": "全文検索管理",
     "full_text_search_management": "全文検索管理",
     "elasticsearch_management": "Elasticsearch 管理",
     "elasticsearch_management": "Elasticsearch 管理",
@@ -400,7 +406,7 @@
     "use_env_var_if_empty": "データベース側の値が空の場合、環境変数 <code>{{variable}}</code> の値を利用します",
     "use_env_var_if_empty": "データベース側の値が空の場合、環境変数 <code>{{variable}}</code> の値を利用します",
     "note_for_the_only_env_option": "現在GCS設定は環境変数の値によって制限されています<br>この設定を変更する場合は環境変数 <code>{{env}}</code> の値をfalseに変更もしくは削除してください"
     "note_for_the_only_env_option": "現在GCS設定は環境変数の値によって制限されています<br>この設定を変更する場合は環境変数 <code>{{env}}</code> の値をfalseに変更もしくは削除してください"
   },
   },
-  "markdown_setting": {
+  "markdown_settings": {
     "markdown_settings": "マークダウン設定",
     "markdown_settings": "マークダウン設定",
     "lineBreak_header": "Line Break設定",
     "lineBreak_header": "Line Break設定",
     "lineBreak_desc": "Line Breakの設定を変更できます。",
     "lineBreak_desc": "Line Breakの設定を変更できます。",
@@ -444,7 +450,8 @@
       "import_recommended": "{{target}} のおすすめをインポート"
       "import_recommended": "{{target}} のおすすめをインポート"
     }
     }
   },
   },
-  "customize_setting": {
+  "customize_settings": {
+    "customize_settings": "カスタマイズ",
     "default_sidebar_mode": {
     "default_sidebar_mode": {
       "title": "デフォルトのサイドバーモード",
       "title": "デフォルトのサイドバーモード",
       "desc": "新規ユーザー、ページを訪れたゲストのサイドバーモードを設定できます。",
       "desc": "新規ユーザー、ページを訪れたゲストのサイドバーモードを設定できます。",
@@ -512,6 +519,7 @@
     "delete_logo": "ロゴを削除"
     "delete_logo": "ロゴを削除"
   },
   },
   "export_management": {
   "export_management": {
+    "export_archive_data": "データアーカイブ",
     "exporting_collection_list": "エクスポート中のコレクション",
     "exporting_collection_list": "エクスポート中のコレクション",
     "exported_data_list": "エクスポートされたアーカイブリスト",
     "exported_data_list": "エクスポートされたアーカイブリスト",
     "export_collections": "コレクションのエクスポート",
     "export_collections": "コレクションのエクスポート",
@@ -530,6 +538,12 @@
     "delete": "削除"
     "delete": "削除"
   },
   },
   "importer_management": {
   "importer_management": {
+    "import_data": "データインポート",
+    "article": "記事",
+    "category": "カテゴリー",
+    "tag": "タグ",
+    "page": "ページ",
+    "page_path": "ページパス",
     "beta_warning": "この機能はベータ版です",
     "beta_warning": "この機能はベータ版です",
     "import_from": "{{from}} からインポート",
     "import_from": "{{from}} からインポート",
     "import_growi_archive": "GROWI アーカイブをインポート",
     "import_growi_archive": "GROWI アーカイブをインポート",
@@ -727,6 +741,7 @@
     "user_management": "ユーザー管理",
     "user_management": "ユーザー管理",
     "invite_users": "新規ユーザーの仮発行",
     "invite_users": "新規ユーザーの仮発行",
     "click_twice_same_checkbox": "少なくとも一つはチェックしてください。",
     "click_twice_same_checkbox": "少なくとも一つはチェックしてください。",
+    "status": "ステータス",
     "invite_modal": {
     "invite_modal": {
       "emails": "メールアドレス (複数行入力で複数人発行可能)",
       "emails": "メールアドレス (複数行入力で複数人発行可能)",
       "description1": "メールアドレスを使用して新規ユーザーを仮発行します。",
       "description1": "メールアドレスを使用して新規ユーザーを仮発行します。",
@@ -789,6 +804,7 @@
     "deny_create_group": "新規グループの作成はできません。",
     "deny_create_group": "新規グループの作成はできません。",
     "group_name": "グループ名",
     "group_name": "グループ名",
     "group_example": "例: Group1",
     "group_example": "例: Group1",
+    "child_user_group": "子グループ",
     "parent_group": "親グループ",
     "parent_group": "親グループ",
     "select_parent_group": "親グループを選択",
     "select_parent_group": "親グループを選択",
     "release_parent_group": "親グループの解除",
     "release_parent_group": "親グループの解除",

+ 0 - 9
packages/app/public/static/locales/ja_JP/translation.json

@@ -35,12 +35,6 @@
   "eg": "例:",
   "eg": "例:",
   "add": "追加",
   "add": "追加",
   "Undo": "元に戻す",
   "Undo": "元に戻す",
-  "Article": "記事",
-  "Page": "ページ",
-  "Page Path": "ページパス",
-  "Category": "カテゴリー",
-  "User": "ユーザー",
-  "status": "ステータス",
   "account_id": "アカウントID",
   "account_id": "アカウントID",
   "Initialize": "初期化",
   "Initialize": "初期化",
   "Update": "更新",
   "Update": "更新",
@@ -79,7 +73,6 @@
   "username": "ユーザー名",
   "username": "ユーザー名",
   "Created": "作成日",
   "Created": "作成日",
   "Last updated": "最終更新",
   "Last updated": "最終更新",
-  "Last_Login": "最終ログイン",
   "Share": "共有",
   "Share": "共有",
   "Markdown Link": "Markdown形式のリンク",
   "Markdown Link": "Markdown形式のリンク",
   "Create/Edit Template": "テンプレートページの作成/編集",
   "Create/Edit Template": "テンプレートページの作成/編集",
@@ -120,9 +113,7 @@
   "Site URL settings": "サイトURL設定",
   "Site URL settings": "サイトURL設定",
   "external_account_management": "外部アカウント管理",
   "external_account_management": "外部アカウント管理",
   "UserGroup": "グループ",
   "UserGroup": "グループ",
-  "ChildUserGroup": "子グループ",
   "Basic Settings": "基本設定",
   "Basic Settings": "基本設定",
-  "Register limitation": "登録の制限",
   "The contents entered here will be shown in the header etc": "ここに入力した内容は、ヘッダー等に表示されます。",
   "The contents entered here will be shown in the header etc": "ここに入力した内容は、ヘッダー等に表示されます。",
   "Public": "公開",
   "Public": "公開",
   "Anyone with the link": "リンクを知っている人のみ",
   "Anyone with the link": "リンクを知っている人のみ",

+ 3 - 3
packages/app/public/static/locales/zh_CN/admin.json

@@ -404,9 +404,8 @@
       "import_recommended": "导入建议 {{target}}"
       "import_recommended": "导入建议 {{target}}"
     }
     }
   },
   },
-  "export_archive_data": "导出主题数据",
-  "customize_setting": {
-    "customize_setting": "页面定制",
+  "customize_settings": {
+    "customize_settings": "页面定制",
     "default_sidebar_mode": {
     "default_sidebar_mode": {
       "title": "默认的侧边栏模式",
       "title": "默认的侧边栏模式",
       "desc": "你可以为新用户和访问该网页的客人设置侧边栏模式。",
       "desc": "你可以为新用户和访问该网页的客人设置侧边栏模式。",
@@ -562,6 +561,7 @@
     "Directory_hierarchy_tag": "Directory hierarchy tag"
     "Directory_hierarchy_tag": "Directory hierarchy tag"
   },
   },
   "export_management": {
   "export_management": {
+    "export_archive_data": "导出主题数据",
     "exporting_collection_list": "正在导出集合列表",
     "exporting_collection_list": "正在导出集合列表",
     "exported_data_list": "导出的存档数据列表",
     "exported_data_list": "导出的存档数据列表",
     "export_collections": "导出集合",
     "export_collections": "导出集合",

+ 1 - 1
packages/app/public/static/locales/zh_CN/translation.json

@@ -73,7 +73,7 @@
   "username": "用户名",
   "username": "用户名",
 	"Created": "创建",
 	"Created": "创建",
 	"Last updated": "上次更新",
 	"Last updated": "上次更新",
-  "Last_Login": "上次登录",
+  "last_login": "上次登录",
 	"Share": "分享",
 	"Share": "分享",
   "Share Link": "分享链接",
   "Share Link": "分享链接",
 	"Markdown Link": "Markdown链接",
 	"Markdown Link": "Markdown链接",

+ 1 - 1
packages/app/src/components/Admin/Common/AdminNavigation.jsx

@@ -28,7 +28,7 @@ const AdminNavigation = (props) => {
       case 'app':                      return <><i className="icon-fw icon-settings"></i>        { t('app_settings') }</>;
       case 'app':                      return <><i className="icon-fw icon-settings"></i>        { t('app_settings') }</>;
       case 'security':                 return <><i className="icon-fw icon-shield"></i>          { t('security_settings.security_settings') }</>;
       case 'security':                 return <><i className="icon-fw icon-shield"></i>          { t('security_settings.security_settings') }</>;
       case 'markdown':                 return <><i className="icon-fw icon-note"></i>            { t('markdown_settings.markdown_settings') }</>;
       case 'markdown':                 return <><i className="icon-fw icon-note"></i>            { t('markdown_settings.markdown_settings') }</>;
-      case 'customize':                return <><i className="icon-fw icon-wrench"></i>          { t('customize') }</>;
+      case 'customize':                return <><i className="icon-fw icon-wrench"></i>          { t('customize_settings.customize_settings') }</>;
       case 'importer':                 return <><i className="icon-fw icon-cloud-upload"></i>    { t('importer_management.import_data') }</>;
       case 'importer':                 return <><i className="icon-fw icon-cloud-upload"></i>    { t('importer_management.import_data') }</>;
       case 'export':                   return <><i className="icon-fw icon-cloud-download"></i>  { t('export_archive_data') }</>;
       case 'export':                   return <><i className="icon-fw icon-cloud-download"></i>  { t('export_archive_data') }</>;
       case 'notification':             return <><i className="icon-fw icon-bell"></i>            { t('external_notification.external_notification')}</>;
       case 'notification':             return <><i className="icon-fw icon-bell"></i>            { t('external_notification.external_notification')}</>;

+ 4 - 4
packages/app/src/components/Admin/Customize/CustomizeLayoutSetting.tsx

@@ -32,7 +32,7 @@ const CustomizeLayoutSetting = (): JSX.Element => {
   const onClickSubmit = async() => {
   const onClickSubmit = async() => {
     try {
     try {
       await apiv3Put('/customize-setting/layout', { isContainerFluid });
       await apiv3Put('/customize-setting/layout', { isContainerFluid });
-      toastSuccess(t('toaster.update_successed', { target: t('customize_setting.layout') }));
+      toastSuccess(t('toaster.update_successed', { target: t('customize_settings.layout') }));
       retrieveData();
       retrieveData();
     }
     }
     catch (err) {
     catch (err) {
@@ -44,7 +44,7 @@ const CustomizeLayoutSetting = (): JSX.Element => {
     <React.Fragment>
     <React.Fragment>
       <div className="row">
       <div className="row">
         <div className="col-12">
         <div className="col-12">
-          <h2 className="admin-setting-header">{t('customize_setting.layout')}</h2>
+          <h2 className="admin-setting-header">{t('customize_settings.layout')}</h2>
 
 
           <div className="d-flex justify-content-around mt-5">
           <div className="d-flex justify-content-around mt-5">
             <div id="layoutOptions" className="card-deck">
             <div id="layoutOptions" className="card-deck">
@@ -55,7 +55,7 @@ const CustomizeLayoutSetting = (): JSX.Element => {
               >
               >
                 <img src={`/images/customize-settings/default-${resolvedTheme}.svg`} />
                 <img src={`/images/customize-settings/default-${resolvedTheme}.svg`} />
                 <div className="card-body text-center">
                 <div className="card-body text-center">
-                  {t('customize_setting.layout_options.default')}
+                  {t('customize_settings.layout_options.default')}
                 </div>
                 </div>
               </div>
               </div>
               <div
               <div
@@ -65,7 +65,7 @@ const CustomizeLayoutSetting = (): JSX.Element => {
               >
               >
                 <img src={`/images/customize-settings/fluid-${resolvedTheme}.svg`} />
                 <img src={`/images/customize-settings/fluid-${resolvedTheme}.svg`} />
                 <div className="card-body  text-center">
                 <div className="card-body  text-center">
-                  {t('customize_setting.layout_options.expanded')}
+                  {t('customize_settings.layout_options.expanded')}
                 </div>
                 </div>
               </div>
               </div>
             </div>
             </div>

+ 6 - 6
packages/app/src/components/Admin/Customize/CustomizeSidebarSetting.tsx

@@ -20,7 +20,7 @@ const CustomizeSidebarsetting = (): JSX.Element => {
   const onClickSubmit = useCallback(async() => {
   const onClickSubmit = useCallback(async() => {
     try {
     try {
       await update();
       await update();
-      toastSuccess(t('toaster.update_successed', { target: t('customize_setting.default_sidebar_mode.title') }));
+      toastSuccess(t('toaster.update_successed', { target: t('customize_settings.default_sidebar_mode.title') }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -32,11 +32,11 @@ const CustomizeSidebarsetting = (): JSX.Element => {
       <div className="row">
       <div className="row">
         <div className="col-12">
         <div className="col-12">
 
 
-          <h2 className="admin-setting-header">{t('customize_setting.default_sidebar_mode.title')}</h2>
+          <h2 className="admin-setting-header">{t('customize_settings.default_sidebar_mode.title')}</h2>
 
 
           <Card className="card well my-3">
           <Card className="card well my-3">
             <CardBody className="px-0 py-2">
             <CardBody className="px-0 py-2">
-              {t('customize_setting.default_sidebar_mode.desc')}
+              {t('customize_settings.default_sidebar_mode.desc')}
             </CardBody>
             </CardBody>
           </Card>
           </Card>
 
 
@@ -67,7 +67,7 @@ const CustomizeSidebarsetting = (): JSX.Element => {
 
 
           <Card className="card well my-5">
           <Card className="card well my-5">
             <CardBody className="px-0 py-2">
             <CardBody className="px-0 py-2">
-              {t('customize_setting.default_sidebar_mode.dock_mode_default_desc')}
+              {t('customize_settings.default_sidebar_mode.dock_mode_default_desc')}
             </CardBody>
             </CardBody>
           </Card>
           </Card>
 
 
@@ -83,7 +83,7 @@ const CustomizeSidebarsetting = (): JSX.Element => {
                 onChange={() => setIsSidebarClosedAtDockMode(false)}
                 onChange={() => setIsSidebarClosedAtDockMode(false)}
               />
               />
               <label className="custom-control-label" htmlFor="is-open">
               <label className="custom-control-label" htmlFor="is-open">
-                {t('customize_setting.default_sidebar_mode.dock_mode_default_open')}
+                {t('customize_settings.default_sidebar_mode.dock_mode_default_open')}
               </label>
               </label>
             </div>
             </div>
             <div className="custom-control custom-radio my-3">
             <div className="custom-control custom-radio my-3">
@@ -97,7 +97,7 @@ const CustomizeSidebarsetting = (): JSX.Element => {
                 onChange={() => setIsSidebarClosedAtDockMode(true)}
                 onChange={() => setIsSidebarClosedAtDockMode(true)}
               />
               />
               <label className="custom-control-label" htmlFor="is-closed">
               <label className="custom-control-label" htmlFor="is-closed">
-                {t('customize_setting.default_sidebar_mode.dock_mode_default_close')}
+                {t('customize_settings.default_sidebar_mode.dock_mode_default_close')}
               </label>
               </label>
             </div>
             </div>
           </div>
           </div>

+ 2 - 2
packages/app/src/components/Admin/Customize/CustomizeThemeOptions.jsx

@@ -59,7 +59,7 @@ const CustomizeThemeOptions = (props) => {
     <div id="themeOptions" className={`${currentLayout === 'kibela' && 'disabled'}`}>
     <div id="themeOptions" className={`${currentLayout === 'kibela' && 'disabled'}`}>
       {/* Light and Dark Themes */}
       {/* Light and Dark Themes */}
       <div>
       <div>
-        <h3>{t('customize_setting.theme_desc.light_and_dark')}</h3>
+        <h3>{t('customize_settings.theme_desc.light_and_dark')}</h3>
         <div className="d-flex flex-wrap">
         <div className="d-flex flex-wrap">
           {lightNDarkTheme.map((theme) => {
           {lightNDarkTheme.map((theme) => {
             return (
             return (
@@ -75,7 +75,7 @@ const CustomizeThemeOptions = (props) => {
       </div>
       </div>
       {/* Unique Theme */}
       {/* Unique Theme */}
       <div className="mt-3">
       <div className="mt-3">
-        <h3>{t('customize_setting.theme_desc.unique')}</h3>
+        <h3>{t('customize_settings.theme_desc.unique')}</h3>
         <div className="d-flex flex-wrap">
         <div className="d-flex flex-wrap">
           {uniqueTheme.map((theme) => {
           {uniqueTheme.map((theme) => {
             return (
             return (

+ 5 - 5
packages/app/src/components/Admin/ExportArchiveDataPage.jsx

@@ -212,22 +212,22 @@ class ExportArchiveDataPage extends React.Component {
 
 
     return (
     return (
       <div data-testid="admin-export-archive-data">
       <div data-testid="admin-export-archive-data">
-        <h2>{t('export_archive_data')}</h2>
+        <h2>{t('export_management.export_archive_data')}</h2>
 
 
         <button type="button" className="btn btn-outline-secondary" disabled={isExporting} onClick={this.openExportModal}>
         <button type="button" className="btn btn-outline-secondary" disabled={isExporting} onClick={this.openExportModal}>
-          {t('admin:export_management.create_new_archive_data')}
+          {t('export_management.create_new_archive_data')}
         </button>
         </button>
 
 
         { showExportingData && (
         { showExportingData && (
           <div className="mt-5">
           <div className="mt-5">
-            <h3>{t('admin:export_management.exporting_collection_list')}</h3>
+            <h3>{t('export_management.exporting_collection_list')}</h3>
             { this.renderProgressBarsForCollections() }
             { this.renderProgressBarsForCollections() }
             { this.renderProgressBarForZipping() }
             { this.renderProgressBarForZipping() }
           </div>
           </div>
         ) }
         ) }
 
 
         <div className="mt-5">
         <div className="mt-5">
-          <h3>{t('admin:export_management.exported_data_list')}</h3>
+          <h3>{t('export_management.exported_data_list')}</h3>
           <ArchiveFilesTable
           <ArchiveFilesTable
             zipFileStats={this.state.zipFileStats}
             zipFileStats={this.state.zipFileStats}
             onZipFileStatRemove={this.onZipFileStatRemove}
             onZipFileStatRemove={this.onZipFileStatRemove}
@@ -252,7 +252,7 @@ ExportArchiveDataPage.propTypes = {
 };
 };
 
 
 const ExportArchiveDataPageWrapperFC = (props) => {
 const ExportArchiveDataPageWrapperFC = (props) => {
-  const { t } = useTranslation();
+  const { t } = useTranslation('admin');
   const { data: socket } = useAdminSocket();
   const { data: socket } = useAdminSocket();
 
 
   return <ExportArchiveDataPage t={t} socket={socket} {...props} />;
   return <ExportArchiveDataPage t={t} socket={socket} {...props} />;

+ 1 - 1
packages/app/src/components/Admin/ImportData/ImportDataPageContents.jsx

@@ -144,7 +144,7 @@ class ImportDataPageContents extends React.Component {
                 <tr>
                 <tr>
                   <th>{t('importer_management.article')}</th>
                   <th>{t('importer_management.article')}</th>
                   <th><i className="icon-arrow-right-circle text-success"></i></th>
                   <th><i className="icon-arrow-right-circle text-success"></i></th>
-                  <th>{t('page')}</th>
+                  <th>{t('importer_management.page')}</th>
                 </tr>
                 </tr>
                 <tr>
                 <tr>
                   <th>{t('importer_management.tag')}</th>
                   <th>{t('importer_management.tag')}</th>

+ 6 - 6
packages/app/src/components/Admin/LegacySlackIntegration/SlackConfiguration.jsx

@@ -62,7 +62,7 @@ class SlackConfiguration extends React.Component {
         </div>
         </div>
         {adminSlackIntegrationLegacyContainer.state.selectSlackOption === 'Incoming Webhooks' ? (
         {adminSlackIntegrationLegacyContainer.state.selectSlackOption === 'Incoming Webhooks' ? (
           <React.Fragment>
           <React.Fragment>
-            <h2 className="border-bottom mb-5">{t('admin:notification_settings.slack_incoming_configuration')}</h2>
+            <h2 className="border-bottom mb-5">{t('notification_settings.slack_incoming_configuration')}</h2>
 
 
             <div className="row mb-3">
             <div className="row mb-3">
               <label className="col-md-3 text-left text-md-right">Webhook URL</label>
               <label className="col-md-3 text-left text-md-right">Webhook URL</label>
@@ -87,11 +87,11 @@ class SlackConfiguration extends React.Component {
                     onChange={() => { adminSlackIntegrationLegacyContainer.switchIsIncomingWebhookPrioritized() }}
                     onChange={() => { adminSlackIntegrationLegacyContainer.switchIsIncomingWebhookPrioritized() }}
                   />
                   />
                   <label className="custom-control-label" htmlFor="cbPrioritizeIWH">
                   <label className="custom-control-label" htmlFor="cbPrioritizeIWH">
-                    {t('admin:notification_settings.prioritize_webhook')}
+                    {t('notification_settings.prioritize_webhook')}
                   </label>
                   </label>
                 </div>
                 </div>
                 <p className="form-text text-muted">
                 <p className="form-text text-muted">
-                  {t('admin:notification_settings.prioritize_webhook_desc')}
+                  {t('notification_settings.prioritize_webhook_desc')}
                 </p>
                 </p>
               </div>
               </div>
             </div>
             </div>
@@ -112,7 +112,7 @@ class SlackConfiguration extends React.Component {
                   data-toggle="tab"
                   data-toggle="tab"
                   onClick={() => adminSlackIntegrationLegacyContainer.switchSlackOption('Incoming Webhooks')}
                   onClick={() => adminSlackIntegrationLegacyContainer.switchSlackOption('Incoming Webhooks')}
                 >
                 >
-                  {t('admin:notification_settings.use_instead')}
+                  {t('notification_settings.use_instead')}
                 </a>
                 </a>
               </div>
               </div>
 
 
@@ -141,7 +141,7 @@ class SlackConfiguration extends React.Component {
 
 
         <h3>
         <h3>
           <i className="icon-question" aria-hidden="true"></i>{' '}
           <i className="icon-question" aria-hidden="true"></i>{' '}
-          <a href="#collapseHelpForIwh" data-toggle="collapse">{t('admin:notification_settings.how_to.header')}</a>
+          <a href="#collapseHelpForIwh" data-toggle="collapse">{t('notification_settings.how_to.header')}</a>
         </h3>
         </h3>
 
 
         <ol id="collapseHelpForIwh" className="collapse">
         <ol id="collapseHelpForIwh" className="collapse">
@@ -177,7 +177,7 @@ SlackConfiguration.propTypes = {
 };
 };
 
 
 const SlackConfigurationWrapperFc = (props) => {
 const SlackConfigurationWrapperFc = (props) => {
-  const { t } = useTranslation();
+  const { t } = useTranslation('admin');
 
 
   return <SlackConfiguration t={t} {...props} />;
   return <SlackConfiguration t={t} {...props} />;
 };
 };

+ 2 - 2
packages/app/src/components/Admin/Notification/TriggerEventCheckBox.jsx

@@ -1,7 +1,7 @@
 import React from 'react';
 import React from 'react';
 
 
-import PropTypes from 'prop-types';
 import { useTranslation } from 'next-i18next';
 import { useTranslation } from 'next-i18next';
+import PropTypes from 'prop-types';
 
 
 const TriggerEventCheckBox = (props) => {
 const TriggerEventCheckBox = (props) => {
   const { t } = props;
   const { t } = props;
@@ -36,7 +36,7 @@ TriggerEventCheckBox.propTypes = {
 
 
 // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
 // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
 const TriggerEventCheckBoxWrapperFC = (props) => {
 const TriggerEventCheckBoxWrapperFC = (props) => {
-  const { t } = useTranslation();
+  const { t } = useTranslation('admin');
 
 
   return <TriggerEventCheckBox t={t} {...props} />;
   return <TriggerEventCheckBox t={t} {...props} />;
 };
 };

+ 1 - 1
packages/app/src/components/Admin/Security/LocalSecuritySettingContents.jsx

@@ -152,7 +152,7 @@ class LocalSecuritySettingContents extends React.Component {
             </div>
             </div>
             <div className="row">
             <div className="row">
               <div className="col-12 col-md-3 text-left text-md-right">
               <div className="col-12 col-md-3 text-left text-md-right">
-                <strong dangerouslySetInnerHTML={{ __html: t('The whitelist of registration permission E-mail address') }} />
+                <strong dangerouslySetInnerHTML={{ __html: t('security_settings.The whitelist of registration permission E-mail address') }} />
               </div>
               </div>
               <div className="col-12 col-md-6">
               <div className="col-12 col-md-6">
                 <textarea
                 <textarea

+ 1 - 1
packages/app/src/components/Admin/Security/SamlSecuritySettingContents.jsx

@@ -115,7 +115,7 @@ class SamlSecurityManagementContents extends React.Component {
                 <ul>
                 <ul>
                   {adminSamlSecurityContainer.state.missingMandatoryConfigKeys.map((configKey) => {
                   {adminSamlSecurityContainer.state.missingMandatoryConfigKeys.map((configKey) => {
                     const key = configKey.replace('security:passport-saml:', '');
                     const key = configKey.replace('security:passport-saml:', '');
-                    return <li key={configKey}>{t(`security_setting.form_item_name.${key}`)}</li>;
+                    return <li key={configKey}>{t(`security_settings.form_item_name.${key}`)}</li>;
                   })}
                   })}
                 </ul>
                 </ul>
               </div>
               </div>

+ 2 - 2
packages/app/src/components/Admin/Security/SecuritySetting.jsx

@@ -238,7 +238,7 @@ class SecuritySetting extends React.Component {
           </button>
           </button>
         </div>
         </div>
         <p className="form-text text-muted small">
         <p className="form-text text-muted small">
-          {t(`security_setting.${getDeletionTypeForT(deletionType)}_explain`)}
+          {t(`security_settings.${getDeletionTypeForT(deletionType)}_explain`)}
         </p>
         </p>
       </div>
       </div>
     );
     );
@@ -453,7 +453,7 @@ class SecuritySetting extends React.Component {
           ].map(arr => this.renderPageDeletePermission(arr[0], arr[1], arr[2], arr[3]))
           ].map(arr => this.renderPageDeletePermission(arr[0], arr[1], arr[2], arr[3]))
         }
         }
 
 
-        <h4>{t('security_settings.session')}</h4>
+        <h4>{t('security_settings.session')}aa</h4>
         <div className="form-group row">
         <div className="form-group row">
           <label className="text-left text-md-right col-md-3 col-form-label">{t('security_settings.max_age')}</label>
           <label className="text-left text-md-right col-md-3 col-form-label">{t('security_settings.max_age')}</label>
           <div className="col-md-6">
           <div className="col-md-6">

+ 4 - 4
packages/app/src/components/Admin/UserGroupDetail/UserGroupDetailPage.tsx

@@ -41,7 +41,7 @@ type Props = {
 }
 }
 
 
 const UserGroupDetailPage = (props: Props): JSX.Element => {
 const UserGroupDetailPage = (props: Props): JSX.Element => {
-  const { t } = useTranslation();
+  const { t } = useTranslation('admin');
   const router = useRouter();
   const router = useRouter();
   const xss = useMemo(() => new Xss(), []);
   const xss = useMemo(() => new Xss(), []);
   const { userGroupId: currentUserGroupId } = props;
   const { userGroupId: currentUserGroupId } = props;
@@ -323,7 +323,7 @@ const UserGroupDetailPage = (props: Props): JSX.Element => {
     <div>
     <div>
       <nav aria-label="breadcrumb">
       <nav aria-label="breadcrumb">
         <ol className="breadcrumb">
         <ol className="breadcrumb">
-          <li className="breadcrumb-item"><a href="/admin/user-groups">{t('admin:user_group_management.group_list')}</a></li>
+          <li className="breadcrumb-item"><a href="/admin/user-groups">{t('user_group_management.group_list')}</a></li>
           {
           {
             ancestorUserGroups != null && ancestorUserGroups.length > 0 && (
             ancestorUserGroups != null && ancestorUserGroups.length > 0 && (
               ancestorUserGroups.map((ancestorUserGroup: IUserGroupHasId) => (
               ancestorUserGroups.map((ancestorUserGroup: IUserGroupHasId) => (
@@ -349,7 +349,7 @@ const UserGroupDetailPage = (props: Props): JSX.Element => {
           onSubmit={onClickSubmitForm}
           onSubmit={onClickSubmitForm}
         />
         />
       </div>
       </div>
-      <h2 className="admin-setting-header mt-4">{t('admin:user_group_management.user_list')}</h2>
+      <h2 className="admin-setting-header mt-4">{t('user_group_management.user_list')}</h2>
       <UserGroupUserTable
       <UserGroupUserTable
         userGroup={currentUserGroup}
         userGroup={currentUserGroup}
         userGroupRelations={childUserGroupRelations}
         userGroupRelations={childUserGroupRelations}
@@ -370,7 +370,7 @@ const UserGroupDetailPage = (props: Props): JSX.Element => {
         onToggleIsAlsoNameSearched={toggleAlsoNameSearched}
         onToggleIsAlsoNameSearched={toggleAlsoNameSearched}
       />
       />
 
 
-      <h2 className="admin-setting-header mt-4">{t('admin:user_group_management.child_group_list')}</h2>
+      <h2 className="admin-setting-header mt-4">{t('user_group_management.child_group_list')}</h2>
       <UserGroupDropdown
       <UserGroupDropdown
         selectableUserGroups={selectableChildUserGroups}
         selectableUserGroups={selectableChildUserGroups}
         onClickAddExistingUserGroupButton={onClickAddExistingUserGroupButtonHandler}
         onClickAddExistingUserGroupButton={onClickAddExistingUserGroupButtonHandler}

+ 2 - 2
packages/app/src/components/Admin/UserGroupDetail/UserGroupPageList.tsx

@@ -17,7 +17,7 @@ type Props = {
 }
 }
 
 
 const UserGroupPageList = (props: Props): JSX.Element => {
 const UserGroupPageList = (props: Props): JSX.Element => {
-  const { t } = useTranslation();
+  const { t } = useTranslation('admin');
   const { userGroupId, relatedPages } = props;
   const { userGroupId, relatedPages } = props;
 
 
   const [currentPages, setCurrentPages] = useState<IPageHasId[]>([]);
   const [currentPages, setCurrentPages] = useState<IPageHasId[]>([]);
@@ -52,7 +52,7 @@ const UserGroupPageList = (props: Props): JSX.Element => {
       <ul className="page-list-ul page-list-ul-flat mb-3">
       <ul className="page-list-ul page-list-ul-flat mb-3">
         {currentPages.map(page => <li key={page._id}><PageListItemS page={page} /></li>)}
         {currentPages.map(page => <li key={page._id}><PageListItemS page={page} /></li>)}
       </ul>
       </ul>
-      {relatedPages != null && relatedPages.length === 0 ? <p>{t('admin:user_group_management.no_pages')}</p> : (
+      {relatedPages != null && relatedPages.length === 0 ? <p>{t('user_group_management.no_pages')}</p> : (
         <PaginationWrapper
         <PaginationWrapper
           activePage={activePage}
           activePage={activePage}
           changePage={handlePageChange}
           changePage={handlePageChange}

+ 1 - 1
packages/app/src/components/Admin/UserGroupDetail/UserGroupUserTable.tsx

@@ -33,7 +33,7 @@ export const UserGroupUserTable = (props: Props): JSX.Element => {
           </th>
           </th>
           <th>{t('Name')}</th>
           <th>{t('Name')}</th>
           <th style={{ width: '100px' }}>{t('Created')}</th>
           <th style={{ width: '100px' }}>{t('Created')}</th>
-          <th style={{ width: '160px' }}>{t('Last_Login')}</th>
+          <th style={{ width: '160px' }}>{t('last_login')}</th>
           <th style={{ width: '70px' }}></th>
           <th style={{ width: '70px' }}></th>
         </tr>
         </tr>
       </thead>
       </thead>

+ 1 - 1
packages/app/src/components/Admin/Users/UserTable.jsx

@@ -169,7 +169,7 @@ class UserTable extends React.Component {
                 <th width="150px">
                 <th width="150px">
                   <div className="d-flex align-items-center">
                   <div className="d-flex align-items-center">
                     <div className="mr-3">
                     <div className="mr-3">
-                      {t('Last_Login')}
+                      {t('last_login')}
                     </div>
                     </div>
                     <SortIcons
                     <SortIcons
                       isSelected={adminUsersContainer.state.sort === 'lastLoginAt'}
                       isSelected={adminUsersContainer.state.sort === 'lastLoginAt'}

+ 2 - 2
packages/app/src/pages/admin/[[...path]].page.tsx

@@ -125,7 +125,7 @@ const AdminMarkdownSettingsPage: NextPage<Props> = (props: Props) => {
       component: <MarkDownSettingContents />,
       component: <MarkDownSettingContents />,
     },
     },
     customize: {
     customize: {
-      title: t('customize_setting.customize_setting'),
+      title: t('customize_settings.customize_settings'),
       component: <CustomizeSettingContents />,
       component: <CustomizeSettingContents />,
     },
     },
     importer: {
     importer: {
@@ -158,7 +158,7 @@ const AdminMarkdownSettingsPage: NextPage<Props> = (props: Props) => {
       title: t('user_management.user_management'),
       title: t('user_management.user_management'),
       component: <UserManagement />,
       component: <UserManagement />,
       'external-accounts': {
       'external-accounts': {
-        title: t('external_account_management'),
+        title: t('user_management.external_account'),
         component: <ManageExternalAccount />,
         component: <ManageExternalAccount />,
       },
       },
     },
     },

+ 4 - 3
packages/app/src/server/service/export.js

@@ -1,5 +1,5 @@
-import loggerFactory from '~/utils/logger';
 import { toArrayIfNot } from '~/utils/array-utils';
 import { toArrayIfNot } from '~/utils/array-utils';
+import loggerFactory from '~/utils/logger';
 
 
 import ConfigLoader from './config-loader';
 import ConfigLoader from './config-loader';
 
 
@@ -7,10 +7,11 @@ const logger = loggerFactory('growi:services:ExportService'); // eslint-disable-
 
 
 const fs = require('fs');
 const fs = require('fs');
 const path = require('path');
 const path = require('path');
-const mongoose = require('mongoose');
 const { Transform } = require('stream');
 const { Transform } = require('stream');
-const streamToPromise = require('stream-to-promise');
+
 const archiver = require('archiver');
 const archiver = require('archiver');
+const mongoose = require('mongoose');
+const streamToPromise = require('stream-to-promise');
 
 
 const CollectionProgressingStatus = require('../models/vo/collection-progressing-status');
 const CollectionProgressingStatus = require('../models/vo/collection-progressing-status');