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

Merge pull request #1580 from weseek/imprv/refactor-i18n

Imprv/refactor i18n
Yuki Takei 6 лет назад
Родитель
Сommit
836bcd9ac1
76 измененных файлов с 977 добавлено и 1059 удалено
  1. 10 0
      resource/locales/en-US/admin/admin_top.json
  2. 38 0
      resource/locales/en-US/admin/app_setting.json
  3. 59 0
      resource/locales/en-US/admin/customize_setting.json
  4. 18 0
      resource/locales/en-US/admin/export_management.json
  5. 58 0
      resource/locales/en-US/admin/importer_management.json
  6. 35 0
      resource/locales/en-US/admin/markdown_setting.json
  7. 32 0
      resource/locales/en-US/admin/user_group_management.json
  8. 46 0
      resource/locales/en-US/admin/user_management.json
  9. 9 0
      resource/locales/en-US/common/toaster.json
  10. 0 294
      resource/locales/en-US/translation.json
  11. 10 0
      resource/locales/ja/admin/admin_top.json
  12. 38 0
      resource/locales/ja/admin/app_setting.json
  13. 59 0
      resource/locales/ja/admin/customize_setting.json
  14. 18 0
      resource/locales/ja/admin/export_management.json
  15. 58 0
      resource/locales/ja/admin/importer_management.json
  16. 35 0
      resource/locales/ja/admin/markdown_setting.json
  17. 32 0
      resource/locales/ja/admin/user_group_management.json
  18. 46 0
      resource/locales/ja/admin/user_management.json
  19. 9 0
      resource/locales/ja/common/toaster.json
  20. 0 295
      resource/locales/ja/translation.json
  21. 4 4
      src/client/js/components/Admin/AdminHome/AdminHome.jsx
  22. 8 8
      src/client/js/components/Admin/AdminHome/InstalledPluginTable.jsx
  23. 11 11
      src/client/js/components/Admin/App/AppSetting.jsx
  24. 3 3
      src/client/js/components/Admin/App/AppSettingsPage.jsx
  25. 8 8
      src/client/js/components/Admin/App/AwsSetting.jsx
  26. 8 8
      src/client/js/components/Admin/App/MailSetting.jsx
  27. 3 3
      src/client/js/components/Admin/App/PluginSetting.jsx
  28. 5 5
      src/client/js/components/Admin/App/SiteUrlSetting.jsx
  29. 11 11
      src/client/js/components/Admin/Customize/CustomizeBehaviorSetting.jsx
  30. 5 5
      src/client/js/components/Admin/Customize/CustomizeCssSetting.jsx
  31. 16 16
      src/client/js/components/Admin/Customize/CustomizeFunctionSetting.jsx
  32. 5 5
      src/client/js/components/Admin/Customize/CustomizeHeaderSetting.jsx
  33. 4 4
      src/client/js/components/Admin/Customize/CustomizeHighlightSetting.jsx
  34. 13 13
      src/client/js/components/Admin/Customize/CustomizeLayoutOptions.jsx
  35. 3 3
      src/client/js/components/Admin/Customize/CustomizeLayoutSetting.jsx
  36. 5 5
      src/client/js/components/Admin/Customize/CustomizeScriptSetting.jsx
  37. 3 3
      src/client/js/components/Admin/Customize/CustomizeTitle.jsx
  38. 4 4
      src/client/js/components/Admin/ExportArchiveData/ArchiveFilesTable.jsx
  39. 3 3
      src/client/js/components/Admin/ExportArchiveData/ArchiveFilesTableMenu.jsx
  40. 11 11
      src/client/js/components/Admin/ExportArchiveData/SelectCollectionsModal.jsx
  41. 3 3
      src/client/js/components/Admin/ExportArchiveDataPage.jsx
  42. 2 2
      src/client/js/components/Admin/ImportData/GrowiArchive/ImportCollectionConfigurationModal.jsx
  43. 21 21
      src/client/js/components/Admin/ImportData/GrowiArchive/ImportForm.jsx
  44. 2 2
      src/client/js/components/Admin/ImportData/GrowiArchive/UploadForm.jsx
  45. 8 7
      src/client/js/components/Admin/ImportData/GrowiArchiveSection.jsx
  46. 22 22
      src/client/js/components/Admin/ImportDataPage.jsx
  47. 4 4
      src/client/js/components/Admin/ManageExternalAccount.jsx
  48. 5 5
      src/client/js/components/Admin/MarkdownSetting/LineBreakForm.jsx
  49. 0 115
      src/client/js/components/Admin/MarkdownSetting/LineBreakSetting.jsx
  50. 6 6
      src/client/js/components/Admin/MarkdownSetting/MarkDownSetting.jsx
  51. 11 11
      src/client/js/components/Admin/MarkdownSetting/PresentationForm.jsx
  52. 4 4
      src/client/js/components/Admin/MarkdownSetting/WhiteListInput.jsx
  53. 8 8
      src/client/js/components/Admin/MarkdownSetting/XssForm.jsx
  54. 5 5
      src/client/js/components/Admin/UserGroup/UserGroupCreateForm.jsx
  55. 20 8
      src/client/js/components/Admin/UserGroup/UserGroupDeleteModal.jsx
  56. 6 6
      src/client/js/components/Admin/UserGroup/UserGroupTable.jsx
  57. 1 1
      src/client/js/components/Admin/UserGroupDetail/CheckBoxForSerchUserOption.jsx
  58. 1 1
      src/client/js/components/Admin/UserGroupDetail/RadioButtonForSerchUserOption.jsx
  59. 3 3
      src/client/js/components/Admin/UserGroupDetail/UserGroupDetailPage.jsx
  60. 4 4
      src/client/js/components/Admin/UserGroupDetail/UserGroupEditForm.jsx
  61. 1 1
      src/client/js/components/Admin/UserGroupDetail/UserGroupPageList.jsx
  62. 2 2
      src/client/js/components/Admin/UserGroupDetail/UserGroupUserModal.jsx
  63. 33 33
      src/client/js/components/Admin/UserGroupDetail/UserGroupUserTable.jsx
  64. 2 2
      src/client/js/components/Admin/UserManagement.jsx
  65. 12 12
      src/client/js/components/Admin/Users/ExternalAccountTable.jsx
  66. 2 2
      src/client/js/components/Admin/Users/GiveAdminButton.jsx
  67. 1 1
      src/client/js/components/Admin/Users/InviteUserControl.jsx
  68. 8 8
      src/client/js/components/Admin/Users/PasswordResetModal.jsx
  69. 4 4
      src/client/js/components/Admin/Users/RemoveAdminButton.jsx
  70. 2 2
      src/client/js/components/Admin/Users/StatusActivateButton.jsx
  71. 4 4
      src/client/js/components/Admin/Users/StatusSuspendedButton.jsx
  72. 12 12
      src/client/js/components/Admin/Users/UserInviteModal.jsx
  73. 4 4
      src/client/js/components/Admin/Users/UserMenu.jsx
  74. 2 2
      src/client/js/components/Admin/Users/UserRemoveButton.jsx
  75. 7 7
      src/client/js/components/Admin/Users/UserTable.jsx
  76. 2 3
      src/server/views/admin/index.html

+ 10 - 0
resource/locales/en-US/admin/admin_top.json

@@ -0,0 +1,10 @@
+{
+  "management_wiki": "Management Wiki",
+  "system_information": "System Information",
+  "wiki_administrator": "Only Wiki administrator can access this page",
+  "assign_administrator": "You can assign administrator from Assign administrator button in the User management page",
+  "list_of_installed_plugins": "List of installed plugins",
+  "package_name": "Package name",
+  "specified_version": "Specified version",
+  "installed_version": "Installed version"
+}

+ 38 - 0
resource/locales/en-US/admin/app_setting.json

@@ -0,0 +1,38 @@
+  {
+    "site_name": "Site name",
+    "sitename_change": "You can change Site Name which is used for header and HTML title.",
+    "header_content": "The contents entered here will be shown in the header etc.",
+    "site_url_desc": "This is for the site URL setting.",
+    "site_url_warn": "Some features don't work because the site URL is not set.",
+    "siteurl_help": "Site full URL beginning from <code>http://</code> or <code>https://</code>.",
+    "confidential_name": "Confidential name",
+    "confidential_example": "ex): internal use only",
+    "default_language": "Default Language for new users",
+    "file_uploading": "File Uploading",
+    "enable_files_except_image": "Enable file upload other than image files.",
+    "attach_enable": "You can attach files other than image files if you enable this option.",
+    "update": "Update",
+    "mail_settings": "Mail settings",
+    "smtp_used": "If you have SMTP settings, it will be used.",
+    "smtp_but_aws": "If you do not have SMTP settings but AWS settings,  e-mails will be sent by SES.",
+    "neihter_of": "If you do not of neither of these, e-mails will not be sent.",
+    "from_e-mail_address": "From e-mail address",
+    "smtp_settings": "SMTP settings",
+    "host": "Host",
+    "port": "Port",
+    "user": "User",
+    "aws_settings": "AWS settings",
+    "aws_access": "This is for AWS settings. If you complete AWS settings, file upload function, profile picture function etc will be enabled.",
+    "no_smtp_setting": "If you do not have SMTP settings, e-mails will be sent via SES. You need to verify from e-mail address and production settings.",
+    "change_setting": "Caution:if you change this setting not completed, you will not be able to access files you have uploaded so far.",
+    "region": "Region",
+    "bucket_name": "Bucket name",
+    "custom_endpoint": "Custom endpoint",
+    "custom_endpoint_change": "Input the URL of the endpoint of an object storage service like MinIO that has a S3-compatible API.  Amazon S3 is used if empty.",
+    "plugin_settings": "Plugin settings",
+    "enable_plugin_loading": "Enable plugin loading",
+    "load_plugins": "Load_plugins",
+    "enable": "Enable",
+    "disable": "Disable",
+    "use_env_var_if_empty": "If the value in the database is empty, the value of the environment variable <cod>{{variable}}</code> is used."
+  }

+ 59 - 0
resource/locales/en-US/admin/customize_setting.json

@@ -0,0 +1,59 @@
+{
+  "recommended": "Recommended",
+  "layout": "Layout",
+  "theme": "Theme",
+  "layout_desc": {
+    "growi_title": "Simple and Clear",
+    "growi_text1": "Full screen layout and thin margins/paddings",
+    "growi_text2": "Show and post comments at the bottom of the page",
+    "growi_text3": "Affix Table-of-contents",
+    "kibela_title": "Easy Viewing Structure",
+    "kibela_text1": "Center aligned contents",
+    "kibela_text2": "Show and post comments at the bottom of the page",
+    "kibela_text3": "Affix Table-of-contents",
+    "crowi_title": "Separated Functions",
+    "crowi_text1": "Collapsible Sidebar",
+    "crowi_text2": "Show and post comments in Sidebar",
+    "crowi_text3": "Collapsible Table-of-contents"
+  },
+  "behavior": "Behavior",
+  "behavior_desc": {
+    "growi_text1": "Both of <code>/page</code> and <code>/page/</code> shows the same page。",
+    "growi_text2": "<code>/nonexistent_page</code> shows editing form",
+    "growi_text3": "All pages shows the list of sub pages <b>if using GROWI Enhanced Layout</b>",
+    "crowi_text1": "<code>/page</code> shows the page",
+    "crowi_text2": "<code>/page/</code> shows the list of sub pages",
+    "crowi_text3": "If portal is applied to <code>/page/</code> , the portal and the list of sub pages are shown",
+    "crowi_text4": "<code>/nonexistent_page</code> shows editing form<",
+    "crowi_text5": "<code>/nonexistent_page/</code> the list of sub pages"
+  },
+  "function": "Function",
+  "function_desc": "You can choose Valid/Invalid of the function",
+  "function_options": {
+    "timeline": "Timeline function",
+    "timeline_desc1": "You can show the timeline of the subpages.",
+    "timeline_desc2": "If there are many subpages, performance decreases while page loading.",
+    "timeline_desc3": "You can speed up list page display by invalidating.",
+    "tab_switch": "Save tab-switching in the browser",
+    "tab_switch_desc1": "Save edit tab and history tab switching in the browser and make it object for forward/back command of the browser.",
+    "tab_switch_desc2": "By invalidating, you can make page transition as the only object for forward/back command of the browser.",
+    "attach_title_header": "Add h1 section when create new page automatically",
+    "attach_title_header_desc": "Add page path to the first line as h1 section when create new page",
+    "recent_created__n_draft_num_desc": "Number of Recently Created Pages & Drafts Displayed",
+    "recently_created_n_draft_num_desc": "Number of recently created pages and drafts displayed on user page",
+    "stale_notification": "Display Notification on Stale Pages",
+    "stale_notification_desc": "Displays the notification to pages more than 1 year since the last update."
+  },
+  "code_highlight": "Code Highlight",
+  "nocdn_desc": "This function is disabled when the environment variable <code>NO_CDN=true</code>.<br>Github style has been forcibly applied.",
+  "custom_title": "Custom Title",
+  "custom_title_detail": "You can customize <code>&lt;title&gt;</code> tag.<br><code>&#123;&#123;sitename&#125;&#125;</code> will be automatically replaced with the app name, and <code>&#123;&#123;page&#125;&#125;</code> will be replaced with the page name/path.",
+  "custom_header": "Custom HTML Header",
+  "custom_header_detail": "You can customize HTML header that applies all pages. Your custom script will be inserted in <code>&lt;header&gt;</code> but above other <code>&lt;script&gt;</code> tags.<br>Relaod page to see changes.",
+  "custom_css": "Custom CSS",
+  "write_css": "You can write CSS that is applied to whole system.",
+  "ctrl_space": "Ctrl+Space to Autocomplete",
+  "custom_script": "Custom script",
+  "write_java": "You can write Javascript that is applied to whole system.",
+  "reflect_change": "You need to reload the page to reflect the change."
+}

+ 18 - 0
resource/locales/en-US/admin/export_management.json

@@ -0,0 +1,18 @@
+{
+  "exporting_collection_list": "Exporting Collection List",
+  "exported_data_list": "Exported Archive Data List",
+  "export_collections": "Export Collections",
+  "check_all": "Check All",
+  "uncheck_all": "Uncheck All",
+  "desc_password_seed": "DO NOT FORGET to set current <code>PASSWORD_SEED</code> to your new GROWI system when restoring user data, or users will NOT be able to login with their password.<br><br><strong>HINT:</strong><br>The current <code>PASSWORD_SEED</code> will be stored in <code>meta.json</code> in exported ZIP.",
+  "create_new_archive_data": "Create New Archive Data",
+  "export": "Export",
+  "cancel": "Cancel",
+  "file": "File",
+  "growi_version": "Growi Version",
+  "collections": "Collections",
+  "exported_at": "Exported At",
+  "export_menu": "Export Menu",
+  "download": "Download",
+  "delete": "Delete"
+}

+ 58 - 0
resource/locales/en-US/admin/importer_management.json

@@ -0,0 +1,58 @@
+{
+  "beta_warning": "This function is Beta.",
+  "import_from": "Import from {{from}}",
+  "import_growi_archive": "Import GROWI Archive",
+  "growi_settings": {
+    "overwrite_documents": "Imported documents will overwrite existing documents",
+    "growi_archive_file": "GROWI Archive File",
+    "uploaded_data": "Uploaded Data",
+    "extracted_file": "Extracted File",
+    "collection": "Collection",
+    "upload": "Upload",
+    "discard": "Discard Uploaded Data",
+    "errors": {
+      "at_least_one": "Select one or more collections.",
+      "page_and_revision": "'Pages' and 'Revisions' must be imported both.",
+      "depends": "'{{target}}' must be selected when '{{condition}}' is selected."
+    },
+    "configuration": {
+      "pages": {
+        "overwrite_author": {
+          "label": "Overwrite page's author with the current user",
+          "desc": "Recommended <span class=\"text-danger\">NOT</span> to check this when users will also be restored."
+        },
+        "set_public_to_page": {
+          "label": "Set 'Public' to the pages that is '{{from}}'",
+          "desc": "Make sure that this configuration makes all <b>'{{from}}'</b> pages readable from <span class=\"text-danger\">ANY users</span>."
+        },
+        "initialize_meta_datas": {
+          "label": "Initialize page's like, read users and comment count",
+          "desc": "Recommended <span class=\"text-danger\">NOT</span> to check this when users will also be restored."
+        },
+        "initialize_hackmd_related_datas": {
+          "label": "Initialize HackMD related data",
+          "desc": "Recommended to check this unless there is important drafts on HackMD."
+        }
+      },
+      "revisions": {
+        "overwrite_author": {
+          "label": "Overwrite revision's author with the current user",
+          "desc": "Recommended <span class=\"text-danger\">NOT</span> to check this when users will also be restored."
+        }
+      }
+    }
+  },
+  "esa_settings": {
+    "team_name": "Team name",
+    "access_token": "Access token",
+    "test_connection": "Test connection to esa"
+  },
+  "qiita_settings": {
+    "team_name": "Team name",
+    "access_token": "Access token",
+    "test_connection": "Test connection to qiita:team"
+  },
+  "import": "Import",
+  "page_skip": "Pages with a name that already exists on GROWI are not imported",
+  "Directory_hierarchy_tag": "Directory Hierarchy Tag"
+}

+ 35 - 0
resource/locales/en-US/admin/markdown_setting.json

@@ -0,0 +1,35 @@
+{
+  "lineBreak_header": "Line Break Setting",
+  "lineBreak_desc": "You can change line break settings.",
+  "lineBreak_options": {
+    "enable_lineBreak": "Enable Line Break",
+    "enable_lineBreak_desc": "Treat line break in the text page as<code>&lt;br&gt;</code>in HTML",
+    "enable_lineBreak_for_comment": "Enable Line Break in comment",
+    "enable_lineBreak_for_comment_desc": "Treat line break in comment as<code>&lt;br&gt;</code>in HTML"
+  },
+  "presentation_header": "Presentation Setting",
+  "presentation_desc": "You can change presentation settings.",
+  "presentation_options": {
+    "page_break_setting": "Page break Setting",
+    "preset_one_separator": "Preset 1",
+    "preset_one_separator_desc": "3 Blank lines",
+    "preset_one_separator_value": "\\n\\n\\n",
+    "preset_two_separator": "Preset 2",
+    "preset_two_separator_desc": "5 Hyphens",
+    "preset_two_separator_value": "-----",
+    "custom_separator": "Custom",
+    "custom_separator_desc": "Regular Expression"
+  },
+  "xss_header": "Prevent XSS(Cross Site Scripting) Setting",
+  "xss_desc": "You can change the handling of HTML tags in markdown text.",
+  "xss_options": {
+    "enable_xss_prevention": "Enable XSS Prevention",
+    "ignore_all_tags": "Ignore All Tags",
+    "ignore_all_tags_desc": "Stripe all HTML tags and attributes",
+    "recommended_setting": "Recommended Setting",
+    "custom_whitelist": "Custom Whitelist",
+    "tag_names": "Tag names",
+    "tag_attributes": "Tag attributes",
+    "import_recommended": "Import recommended {{target}}"
+  }
+}

+ 32 - 0
resource/locales/en-US/admin/user_group_management.json

@@ -0,0 +1,32 @@
+{
+  "create_group": "Create New Group",
+  "deny_create_group": "You can't create a new group with the current settings",
+  "group_name": "Group Name",
+  "group_example": "e.g. : Group1",
+  "add_modal": {
+    "add_user": "Add a User to the Created Group",
+    "search_option": "Search Option",
+    "enable_option": "Enable {{option}}",
+    "forward_match": "forword match",
+    "partial_match": "partial match",
+    "backward_match": "backward match"
+  },
+  "group_list": "Group List",
+  "back_to_list": "Go Back to Group List",
+  "basic_info": "Basic Info",
+  "user_list": "User List",
+  "created_group": "Group was created",
+  "is_loading_data": "fetch data...",
+  "no_pages": "There are no pages the group has view permission",
+  "remove_from_group": "Remove this user",
+  "delete_modal": {
+    "header": "Delete Group",
+    "desc": "Once deleted, the deleted group and its private pages cannot be retrieved",
+    "dropdown_desc": "Choose an action for private pages",
+    "select_group": "Select a group",
+    "no_groups": "No groups to select",
+    "publish_pages": "Publish All",
+    "delete_pages": "Delete All",
+    "transfer_pages": "Transfer to another group"
+  }
+}

+ 46 - 0
resource/locales/en-US/admin/user_management.json

@@ -0,0 +1,46 @@
+{
+  "invite_users": "Invite New Users",
+  "invite_modal": {
+    "emails": "Emails",
+    "invite_thru_email": "Send Invitation Email",
+    "valid_email": "Valid email address is required",
+    "temporary_password": "The created user has a temporary password",
+    "send_new_password": "Please send the new password to the user.",
+    "send_temporary_password": "Be sure to copy the temporary password ON THIS SCREEN and send it to the user.",
+    "existing_email": "The following emails already exist"
+  },
+  "user_table": {
+    "administrator": "Administrator",
+    "edit_menu": "Edit Menu",
+    "reset_password": "Reset Password",
+    "administrator_menu": "Administrator Menu",
+    "accept": "Accept",
+    "deactivate_account": "Deactivate Account",
+    "your_own": "You cannot deactivate your own account",
+    "remove_admin_access": "Remove Admin Access",
+    "cannot_remove": "You cannot remove yourself from administrator",
+    "give_admin_access": "Give Admin Access"
+  },
+  "reset_password": "Reset Password",
+  "reset_password_modal": {
+    "password_never_seen": "The temporary password can never be retrieved after this screen is closed.",
+    "password_reset_message": "Let the user know the new password below and strongly recommend to change another one immediately.",
+    "send_new_password": "Please send the new password to the user.",
+    "target_user": "Target User",
+    "new_password": "New Password"
+  },
+  "external_account": "External Account Management",
+  "external_account_list": "External Account List",
+  "invite": "Invite",
+  "invited": "User was invited",
+  "back_to_user_management": "Back to User Management",
+  "authentication_provider": "Authentication Provider",
+  "manage": "Manage",
+  "password_setting": "Password Setting",
+  "password_setting_help": "Is password set?",
+  "set": "Yes",
+  "unset": "No",
+  "related_username": "Related user's ",
+  "cannot_invite_maximum_users": "Can not invite more than the maximum number of users.",
+  "current_users": "Current users:"
+}

+ 9 - 0
resource/locales/en-US/common/toaster.json

@@ -0,0 +1,9 @@
+{
+  "update_successed": "Succeeded to update {{target}} setting",
+  "give_user_admin": "Succeeded to give {{username}} admin",
+  "remove_user_admin": "Succeeded to remove {{username}} admin ",
+  "activate_user_success": "Succeeded to activating {{username}}",
+  "deactivate_user_success": "Succeeded to deactivate {{username}}",
+  "remove_user_success": "Succeeded to removing {{username}} ",
+  "remove_external_user_success": "Succeeded to remove {{accountId}} "
+}

+ 0 - 294
resource/locales/en-US/translation.json

@@ -354,57 +354,6 @@
     "insert_image": "inserts an image",
     "insert_image": "inserts an image",
     "open_sandbox": "Open Sandbox"
     "open_sandbox": "Open Sandbox"
   },
   },
-  "admin_top": {
-    "Management Wiki": "Management Wiki",
-    "System Information": "System Information",
-    "wiki_administrator": "Only Wiki administrator can access this page",
-    "assign_administrator": "You can assign administrator from Assign administrator button in the User management page",
-    "List of installed plugins": "List of installed plugins",
-    "Package name": "Package name",
-    "Specified version": "Specified version",
-    "Installed version": "Installed version"
-  },
-  "app_setting": {
-    "Site Name": "Site name",
-    "sitename_change": "You can change Site Name which is used for header and HTML title.",
-    "header_content": "The contents entered here will be shown in the header etc.",
-    "Site URL desc": "This is for the site URL setting.",
-    "Site URL warn": "Some features don't work because the site URL is not set.",
-    "siteurl_help": "Site full URL beginning from <code>http://</code> or <code>https://</code>.",
-    "Confidential name": "Confidential name",
-    "Default Language for new users": "Default Language for new users",
-    "ex) internal use only":"ex): internal use only",
-    "File Uploading": "File Uploading",
-    "enable_files_except_image": "Enable file upload other than image files.",
-    "attach_enable": "You can attach files other than image files if you enable this option.",
-    "Update": "Update",
-    "Mail settings": "Mail settings",
-    "SMTP_used": "If you have SMTP settings, it will be used.",
-    "SMTP_but_AWS": "If you do not have SMTP settings but AWS settings,  e-mails will be sent by SES.",
-    "neihter_of": "If you do not of neither of these, e-mails will not be sent.",
-    "From e-mail address": "From e-mail address",
-    "SMTP settings": "SMTP settings",
-    "Host": "Host",
-    "Port": "Port",
-    "User": "User",
-    "AWS settings": "AWS settings",
-    "AWS_access": "This is for AWS settings. If you complete AWS settings, file upload function, profile picture function etc will be enabled.",
-    "No_SMTP_setting": "If you do not have SMTP settings, e-mails will be sent via SES. You need to verify from e-mail address and production settings.",
-    "change_setting": "Caution:if you change this setting not completed, you will not be able to access files you have uploaded so far.",
-    "region": "Region",
-    "bucket name": "Bucket name",
-    "custom endpoint": "Custom endpoint",
-    "custom_endpoint_change": "Input the URL of the endpoint of an object storage service like MinIO that has a S3-compatible API.  Amazon S3 is used if empty.",
-    "Plugin settings": "Plugin settings",
-    "Enable plugin loading": "Enable plugin loading",
-    "Load plugins": "Load plugins",
-    "Enable": "Enable",
-    "Disable": "Disable",
-    "Use env var if empty": "If the value in the database is empty, the value of the environment variable <cod>{{variable}}</code> is used.",
-    "updated_app_setting": "Succeeded to update app setting",
-    "updated_site_url": "Succeeded to update site URL",
-    "updated_plugin_setting": "Succeeded to update plugin setting"
-  },
   "security_setting": {
   "security_setting": {
     "Security settings": "Security settings",
     "Security settings": "Security settings",
     "Guest Users Access": "Guest Users Access",
     "Guest Users Access": "Guest Users Access",
@@ -560,38 +509,6 @@
       "security:passport-saml:attrMapLastName": "Last Name"
       "security:passport-saml:attrMapLastName": "Last Name"
     }
     }
   },
   },
-  "markdown_setting": {
-    "line_break_setting": "Line Break Setting",
-    "line_break_setting_desc": "You can change line break settings.",
-    "Enable Line Break": "Enable Line Break",
-    "Enable Line Break desc": "Treat line break in the text page as<code>&lt;br&gt;</code>in HTML",
-    "Enable Line Break for comment": "Enable Line Break in comment",
-    "Enable Line Break for comment desc": "Treat line break in comment as<code>&lt;br&gt;</code>in HTML",
-    "presentation_setting": "Presentation Setting",
-    "presentation_setting_desc": "You can change presentation settings.",
-    "Page break setting": "Page break Setting",
-    "Preset one separator": "Preset 1",
-    "Preset one separator desc": "3 Blank lines",
-    "Preset one separator value": "\\n\\n\\n",
-    "Preset two separator": "Preset 2",
-    "Preset two separator desc": "5 Hyphens",
-    "Preset two separator value": "-----",
-    "Custom separator": "Custom",
-    "Custom separator desc": "Regular Expression",
-    "XSS_setting": "Prevent XSS(Cross Site Scripting) Setting",
-    "XSS_setting_desc": "You can change the handling of HTML tags in markdown text.",
-    "Enable XSS prevention": "Enable XSS Prevention",
-    "Ignore all tags": "Ignore All Tags",
-    "Ignore all tags desc": "Stripe all HTML tags and attributes",
-    "Recommended setting": "Recommended Setting",
-    "Custom Whitelist": "Custom Whitelist",
-    "Tag names": "Tag names",
-    "Tag attributes": "Tag attributes",
-    "import_recommended": "Import recommended {{target}}",
-    "updated_lineBreak": "Succeeded to update line braek setting",
-    "updated_presentation": "Succeeded to update presentation setting",
-    "updated_xss": "Succeeded to update XSS setting"
-  },
   "notification_setting": {
   "notification_setting": {
     "notification_list": "List of Notification Settings",
     "notification_list": "List of Notification Settings",
     "add_notification": "Add New",
     "add_notification": "Add New",
@@ -611,222 +528,11 @@
       "ifttt_link": "Create a new IFTTT applet with Email trigger"
       "ifttt_link": "Create a new IFTTT applet with Email trigger"
     }
     }
   },
   },
-  "customize_page": {
-    "recommended": "Recommended",
-    "Behavior": "Behavior",
-    "Layout": "Layout",
-    "Function": "Function",
-    "function_choose": "You can choose Valid/Invalid of the function",
-    "Timeline function": "Timeline function",
-    "Code Highlight": "Code Highlight",
-    "Theme": "Theme",
-    "subpage_display": "You can show the timeline of the subpages.",
-    "performance_decrease": "If there are many subpages, performance decreases while page loading.",
-    "list_page_display": "You can speed up list page display by invalidating.",
-    "tab_switch": "Save tab-switching in the browser",
-    "save_edit": "Save edit tab and history tab switching in the browser and make it object for forward/back command of the browser.",
-    "by_invalidating": "By invalidating, you can make page transition as the only object for forward/back command of the browser.",
-    "nocdn_desc": "This function is disabled when the environment variable <code>NO_CDN=true</code>.<br>Github style has been forcibly applied.",
-    "custom_title": "Custom Title",
-    "custom_title_detail": "You can customize <code>%s</code> tag.<br><code>%s</code> will be automatically replaced with the app name, and <code>%s</code> will be replaced with the page name/path.",
-    "custom_header": "Custom HTML Header",
-    "custom_header_detail": "You can customize HTML header that applies all pages. Your custom script will be inserted in <code>&lt;header&gt;</code> but above other <code>&lt;script&gt;</code> tags.<br>Relaod page to see changes.",
-    "Custom CSS": "Custom CSS",
-    "write_CSS": "You can write CSS that is applied to whole system.",
-    "reflect_change": "You need to reload the page to reflect the change.",
-    "ctrl_space": "Ctrl+Space to Autocomplete",
-    "Custom script": "Custom script",
-    "write_java": "You can write Javascript that is applied to whole system.",
-    "attach_title_header": "Add h1 section when create new page automatically",
-    "attach_title_header_desc": "Add page path to the first line as h1 section when create new page",
-    "recent_created__n_draft_num_desc": "Number of Recently Created Pages & Drafts Displayed",
-    "recently_created_n_draft_num_desc": "Number of recently created pages and drafts displayed on user page",
-    "stale_notification": "Display Notification on Stale Pages",
-    "stale_notification_desc": "Displays the notification to pages more than 1 year since the last update.",
-    "update_layout_success": "Succeeded to update layout",
-    "update_behavior_success": "Succeeded to update behavior",
-    "update_function_success": "Succeeded to update function",
-    "update_highlight_success": "Succeeded to update code highlight",
-    "update_customTitle_success": "Succeeded to update customize title",
-    "update_customHeader_success": "Succeeded to update customize html header",
-    "update_customCss_success": "Succeeded to update customize css",
-    "update_script_success": "Succeeded to update custom script",
-    "layout_description": {
-      "growi_title": "Simple and Clear",
-      "growi_text1": "Full screen layout and thin margins/paddings",
-      "growi_text2": "Show and post comments at the bottom of the page",
-      "growi_text3": "Affix Table-of-contents",
-      "kibela_title": "Easy Viewing Structure",
-      "kibela_text1": "Center aligned contents",
-      "kibela_text2": "Show and post comments at the bottom of the page",
-      "kibela_text3": "Affix Table-of-contents",
-      "crowi_title": "Separated Functions",
-      "crowi_text1": "Collapsible Sidebar",
-      "crowi_text2": "Show and post comments in Sidebar",
-      "crowi_text3": "Collapsible Table-of-contents"
-    },
-    "behavior_description": {
-      "growi_text1": "Both of <code>/page</code> and <code>/page/</code> shows the same page。",
-      "growi_text2": "<code>/nonexistent_page</code> shows editing form",
-      "growi_text3": "All pages shows the list of sub pages <b>if using GROWI Enhanced Layout</b>",
-      "crowi_text1": "<code>/page</code> shows the page",
-      "crowi_text2": "<code>/page/</code> shows the list of sub pages",
-      "crowi_text3": "If portal is applied to <code>/page/</code> , the portal and the list of sub pages are shown",
-      "crowi_text4": "<code>/nonexistent_page</code> shows editing form<",
-      "crowi_text5": "<code>/nonexistent_page/</code> the list of sub pages"
-    }
-  },
-  "user_management": {
-    "target_user": "Target User",
-    "new_password": "New Password",
-    "invite_users": "Invite New Users",
-    "emails": "Emails",
-    "invite_thru_email": "Send Invitation Email",
-    "invite": "Invite",
-    "invited": "User was invited",
-    "give_admin_access": "Give Admin Access",
-    "remove_admin_access": "Remove Admin Access",
-    "external_account": "External Account Management",
-    "external_account_list": "External Account List",
-    "back_to_user_management": "Back to User Management",
-    "authentication_provider": "Authentication Provider",
-    "manage": "Manage",
-    "edit_menu": "Edit Menu",
-    "password_setting": "Password Setting",
-    "password_setting_help": "Is password set?",
-    "set": "Yes",
-    "unset": "No",
-    "temporary_password": "The created user has a temporary password",
-    "send_temporary_password": "Be sure to copy the temporary password ON THIS SCREEN and send it to the user.",
-    "password_reset_message": "Let the user know the new password below and strongly recommend to change another one immediately.",
-    "send_new_password": "Please send the new password to the user.",
-    "password_never_seen": "The temporary password can never be retrieved after this screen is closed.",
-    "reset_password": "Reset Password",
-    "related_username": "Related user's ",
-    "accept": "Accept",
-    "deactivate_account": "Deactivate Account",
-    "your_own": "You cannot deactivate your own account",
-    "administrator_menu": "Administrator Menu",
-    "cannot_remove": "You cannot remove yourself from administrator",
-    "cannot_invite_maximum_users": "Can not invite more than the maximum number of users.",
-    "current_users": "Current users:",
-    "valid_email": "Valid email address is required",
-    "existing_email": "The following emails already exist",
-    "give_user_admin": "Succeeded to give {{username}} admin",
-    "remove_user_admin": "Succeeded to remove {{username}} admin ",
-    "activate_user_success": "Succeeded to activating {{username}}",
-    "deactivate_user_success": "Succeeded to deactivate {{username}}",
-    "remove_user_success": "Succeeded to removing {{username}} ",
-    "remove_external_user_success": "Succeeded to remove {{accountId}} "
-  },
-  "user_group_management": {
-    "search_option": "Search Option",
-    "enable_option": "Enable {{option}}",
-    "forward_match": "forword match",
-    "partial_match": "partial match",
-    "backward_match": "backward match",
-    "group_list": "Group List",
-    "back_to_list": "Go Back to Group List",
-    "basic_info": "Basic Info",
-    "user_list": "User List",
-    "create_group": "Create New Group",
-    "group_example": "e.g. : Group1",
-    "created_group": "Group was created",
-    "add_user": "Add a User to the Created Group",
-    "deny_create_group": "You can't create a new group with the current settings",
-    "choose_action": "Choose an action for private pages",
-    "delete_group": "Delete Group",
-    "group_name": "Group Name",
-    "group_and_pages_not_retrievable": "Once deleted, the deleted group and its private pages cannot be retrieved",
-    "publish_pages": "Publish All",
-    "delete_pages": "Delete All",
-    "transfer_pages": "Transfer to another group",
-    "select_group": "Select a group",
-    "no_groups": "No groups to select",
-    "no_pages": "There are no pages the group has view permission",
-    "remove_from_group": "Remove this user"
-  },
-  "importer_management": {
-    "beta_warning": "This function is Beta.",
-    "import_from": "Import from {{from}}",
-    "import_growi_archive": "Import GROWI Archive",
-    "growi_settings": {
-      "overwrite_documents": "Imported documents will overwrite existing documents",
-      "growi_archive_file": "GROWI Archive File",
-      "uploaded_data": "Uploaded Data",
-      "extracted_file": "Extracted File",
-      "collection": "Collection",
-      "upload": "Upload",
-      "discard": "Discard Uploaded Data",
-      "errors": {
-        "at_least_one": "Select one or more collections.",
-        "page_and_revision": "'Pages' and 'Revisions' must be imported both.",
-        "depends": "'{{target}}' must be selected when '{{condition}}' is selected."
-      },
-      "configuration": {
-        "pages": {
-          "overwrite_author": {
-            "label": "Overwrite page's author with the current user",
-            "desc": "Recommended <span class=\"text-danger\">NOT</span> to check this when users will also be restored."
-          },
-          "set_public_to_page": {
-            "label": "Set 'Public' to the pages that is '{{from}}'",
-            "desc": "Make sure that this configuration makes all <b>'{{from}}'</b> pages readable from <span class=\"text-danger\">ANY users</span>."
-          },
-          "initialize_meta_datas": {
-            "label": "Initialize page's like, read users and comment count",
-            "desc": "Recommended <span class=\"text-danger\">NOT</span> to check this when users will also be restored."
-          },
-          "initialize_hackmd_related_datas": {
-            "label": "Initialize HackMD related data",
-            "desc": "Recommended to check this unless there is important drafts on HackMD."
-          }
-        },
-        "revisions": {
-          "overwrite_author": {
-            "label": "Overwrite revision's author with the current user",
-            "desc": "Recommended <span class=\"text-danger\">NOT</span> to check this when users will also be restored."
-          }
-        }
-      }
-    },
-    "esa_settings": {
-      "team_name": "Team name",
-      "access_token": "Access token",
-      "test_connection": "Test connection to esa"
-    },
-    "qiita_settings": {
-      "team_name": "Team name",
-      "access_token": "Access token",
-      "test_connection": "Test connection to qiita:team"
-    },
-    "import": "Import",
-    "page_skip": "Pages with a name that already exists on GROWI are not imported",
-    "Directory_hierarchy_tag": "Directory Hierarchy Tag"
-  },
   "full_text_search_management": {
   "full_text_search_management": {
     "elasticsearch_management": "Elasticsearch Management",
     "elasticsearch_management": "Elasticsearch Management",
     "build_button": "Rebuild Index",
     "build_button": "Rebuild Index",
     "rebuild_description_1": "Force rebuild index.",
     "rebuild_description_1": "Force rebuild index.",
     "rebuild_description_2": "Click 'Build Now' to delete and create mapping file and add all pages.",
     "rebuild_description_2": "Click 'Build Now' to delete and create mapping file and add all pages.",
     "rebuild_description_3": "This may take a while."
     "rebuild_description_3": "This may take a while."
-  },
-  "export_management": {
-    "exporting_collection_list": "Exporting Collection List",
-    "exported_data_list": "Exported Archive Data List",
-    "export_collections": "Export Collections",
-    "check_all": "Check All",
-    "uncheck_all": "Uncheck All",
-    "desc_password_seed": "DO NOT FORGET to set current <code>PASSWORD_SEED</code> to your new GROWI system when restoring user data, or users will NOT be able to login with their password.<br><br><strong>HINT:</strong><br>The current <code>PASSWORD_SEED</code> will be stored in <code>meta.json</code> in exported ZIP.",
-    "create_new_archive_data": "Create New Archive Data",
-    "export": "Export",
-    "cancel": "Cancel",
-    "file": "File",
-    "growi_version": "Growi Version",
-    "collections": "Collections",
-    "exported_at": "Exported At",
-    "export_menu": "Export Menu",
-    "download": "Download",
-    "delete": "Delete"
   }
   }
 }
 }

+ 10 - 0
resource/locales/ja/admin/admin_top.json

@@ -0,0 +1,10 @@
+{
+  "management_wiki": "Wiki管理",
+  "system_information": "システム情報",
+  "wiki_administrator": "この画面はWiki管理者のみがアクセスできる画面です。",
+  "assign_administrator": "「ユーザー管理」から「管理者にする」ボタンを使ってユーザーをWiki管理者に任命することができます。",
+  "list_of_installed_plugins": "インストールされているプラグイン一覧",
+  "package_name": "パッケージ名",
+  "specified_version": "指定バージョン",
+  "installed_version": "インストールされているバージョン"
+}

+ 38 - 0
resource/locales/ja/admin/app_setting.json

@@ -0,0 +1,38 @@
+{
+  "site_name": "サイト名",
+  "sitename_change": "ヘッダーや HTML タイトルに使用されるサイト名を変更できます。",
+  "header_content": "ここに入力した内容は、ヘッダー等に表示されます。",
+  "site_url_desc": "サイトURLを設定します。",
+  "site_url_warn": "サイトURLが設定されていないため、一部機能が動作しない状態になっています。",
+  "siteurl_help": "<code>http://</code> または <code>https://</code> から始まるサイトのURL",
+  "confidential_name": "コンフィデンシャル表示",
+  "confidential_example": "例: 社外秘",
+  "default_language": "新規ユーザーのデフォルト設定言語",
+  "file_uploading": "ファイルアップロード",
+  "enable_files_except_image": "画像以外のファイルアップロードを許可",
+  "attach_enable": "許可をしている場合、画像以外のファイルをページに添付可能になります。",
+  "update": "更新",
+  "mail_settings": "メールの設定",
+  "smtp_used": "SMTPの設定がされている場合、それが利用されます。",
+  "smtp_but_aws": "SMTP設定がなく、AWSの設定がある場合、SESでの送信を試みます。",
+  "neihter_of": "どちらの設定もない場合、メールは送信されません。",
+  "from_e-mail_address": "Fromアドレス",
+  "smtp_settings": "SMTP設定",
+  "host": "ホスト",
+  "port": "ポート",
+  "user": "ユーザー",
+  "aws_settings": "AWS設定",
+  "aws_access": "AWS にアクセスするための設定を行います。AWS の設定を完了させると、ファイルアップロード機能、プロフィール写真機能などが有効になります。",
+  "no_smtp_setting": "また、SMTP の設定が無い場合、SES を利用したメール送信が行われます。FromメールアドレスのVerify、プロダクション利用設定をする必要があります。",
+  "change_setting": "この設定を途中で変更すると、これまでにアップロードしたファイル等へのアクセスができなくなりますのでご注意下さい。",
+  "region": "リージョン",
+  "bucket_name": "バケット名",
+  "custom_endpoint": "カスタムエンドポイント",
+  "custom_endpoint_change": "MinIOなど、S3互換APIを持つ他のオブジェクトストレージサービスを使用する場合のみ、そのエンドポイントのURLを入力してください。空欄の場合は、Amazon S3を使用します。",
+  "plugin_settings": "プラグイン設定",
+  "enable_plugin_loading": "プラグインの読み込みを有効にします。",
+  "load_plugins": "プラグインを読み込む",
+  "enable": "有効",
+  "disable": "無効",
+  "use_env_var_if_empty": "データベース側の値が空の場合、環境変数 <code>{{variable}}</code> の値を利用します"
+}

+ 59 - 0
resource/locales/ja/admin/customize_setting.json

@@ -0,0 +1,59 @@
+{
+  "recommended": "おすすめ",
+  "layout": "レイアウト",
+  "theme": "テーマ",
+  "layout_desc": {
+    "growi_title": "シンプル・明瞭",
+    "growi_text1": "全画面レイアウトで、余白は少なくなります。",
+    "growi_text2": "コメントはページの下部に表示されます。",
+    "growi_text3": "ページ情報は下部に表示されます。",
+    "kibela_title": "閲覧重視の構造",
+    "kibela_text1": "コンテンツが中心に表示されます。",
+    "kibela_text2": "コメントはページの下部に表示されます。",
+    "kibela_text3": "ページ情報は下部に表示されます。",
+    "crowi_title": "ビュー・コントロールの分離",
+    "crowi_text1": "サイドバーを開くと情報が表示されます。",
+    "crowi_text2": "コメントはサイドバーに表示されます。",
+    "crowi_text3": "ページ情報はサイドバーに表示されます。"
+  },
+  "behavior": "動作",
+  "behavior_desc": {
+    "growi_text1": "<code>/page</code>と<code>/page/</code>どちらのパスも同じページを表示します。",
+    "growi_text2": "<code>/nonexistent_page</code> では編集フォームを表示します",
+    "growi_text3": "<b>GROWI Enhanced Layout</b>では全てのページが配下のページリストを表示します",
+    "crowi_text1": "<code>/page</code> ではページを表示します。",
+    "crowi_text2": "<code>/page/</code> では配下のページを表示します。",
+    "crowi_text3": "<code>/page/</code>がポータルに適応している場合、ポータルページと配下のページリストを表示します。",
+    "crowi_text4": "<code>/nonexistent_page</code> では編集フォームを表示します",
+    "crowi_text5": "<code>/nonexistent_page</code> では配下のページリストを表示します。"
+  },
+  "function": "機能",
+  "function_desc": "機能の有効/無効を選択できます。",
+  "function_options": {
+    "timeline": "タイムライン機能",
+    "timeline_desc1": "配下ページのタイムラインを表示できます。",
+    "timeline_desc2": "配下ページが多い場合はページロード時のパフォーマンスが落ちます。",
+    "timeline_desc3": "無効化することでリストページの表示を高速化できます。",
+    "tab_switch": "タブ変更をブラウザ履歴に保存",
+    "tab_switch_desc1": "編集タブやヒストリータブ等の切り替えをブラウザ履歴に保存し、ブラウザの戻る/進む操作の対象にします。",
+    "tab_switch_desc2": "無効化することで、ページ遷移のみを戻る/進む操作の対象にすることができます。",
+    "attach_title_header": "新規ページ作成時の h1 セクション自動挿入",
+    "attach_title_header_desc": "新規作成したページの1行目に、ページのパスを h1 セクションとして挿入します。",
+    "recent_created__n_draft_num_desc": "最近作成したページと下書きの表示数",
+    "recently_created_n_draft_num_desc": "ホーム画面の Recently Created での、1ページの表示数を設定します。",
+    "stale_notification": "古いページに通知を表示する",
+    "stale_notification_desc": "最後の更新から1年を超えるページへの通知を表示します。"
+  },
+  "code_highlight": "コードハイライト",
+  "nocdn_desc": "この機能は、環境変数 <code>NO_CDN=true</code> の時は無効化されます。<br>GitHub スタイルが適用されています。",
+  "custom_title": "カスタム Title",
+  "custom_title_detail": "<code>&lt;title&gt;</code>タグのコンテンツをカスタマイズできます。<br><code>&#123;&#123;sitename&#125;&#125;</code>がサイト名、<code>&#123;&#123;page&#125;&#125;</code>がページ名またはページパスに置換されます。",
+  "custom_header": "カスタム HTML Header",
+  "custom_header_detail": "システム全体に適用される HTML を記述できます。<code>&lt;header&gt;</code> タグ内の他の <code>&lt;script&gt;</code> タグ読み込み前に展開されます。<br>変更の反映はページの更新が必要です。",
+  "custom_css": "カスタム CSS",
+  "write_css": " システム全体に適用されるCSSを記述できます。",
+  "ctrl_space": "Ctrl+Space でコード補完",
+  "custom_script": "カスタムスクリプト",
+  "write_java": "システム全体に適用されるJavaScriptを記述できます。",
+  "reflect_change": "変更の反映はページの更新が必要です。"
+}

+ 18 - 0
resource/locales/ja/admin/export_management.json

@@ -0,0 +1,18 @@
+{
+  "exporting_collection_list": "エクスポート中のコレクション",
+  "exported_data_list": "エクスポートされたアーカイブリスト",
+  "export_collections": "コレクションのエクスポート",
+  "check_all": "全てにチェックを付ける",
+  "uncheck_all": "全てからチェックを外す",
+  "desc_password_seed": "ユーザーデータをバックアップ/リストアする場合、現在の <code>PASSWORD_SEED</code> を新しい GROWI システムにセットすることを忘れないでください。さもなくば、ユーザーがパスワードでログインできなくなります。<br><br><strong>ヒント:</strong><br>現在の <code>PASSWORD_SEED</code> は、エクスポートされる ZIP 中の <code>meta.json</code> に保存されます。",
+  "create_new_archive_data": "アーカイブデータの新規作成",
+  "export": "エクスポート",
+  "cancel": "キャンセル",
+  "file": "ファイル名",
+  "growi_version": "Growi バージョン",
+  "collections": "コレクション",
+  "exported_at": "エクスポートされた時間",
+  "export_menu": "エクスポートメニュー",
+  "download": "ダウンロード",
+  "delete": "削除"
+}

+ 58 - 0
resource/locales/ja/admin/importer_management.json

@@ -0,0 +1,58 @@
+{
+  "beta_warning": "この機能はベータ版です",
+  "import_from": "{{from}} からインポート",
+  "import_growi_archive": "GROWI アーカイブをインポート",
+  "growi_settings": {
+    "overwrite_documents": "インポートされたドキュメントは既存のドキュメントを上書きします",
+    "growi_archive_file": "GROWI アーカイブファイル",
+    "uploaded_data": "アップロードされたデータ",
+    "extracted_file": "展開されたファイル",
+    "collection": "コレクション",
+    "upload": "アップロード",
+    "discard": "アップロードしたデータを破棄する",
+    "errors": {
+      "at_least_one": "コレクションが選択されていません",
+      "page_and_revision": "'Pages' と 'Revisions' はセットでインポートする必要があります",
+      "depends": "'{{condition}}' をインポートする場合は、'{{target}}' を一緒に選択する必要があります"
+    },
+    "configuration": {
+      "pages": {
+        "overwrite_author": {
+          "label": "ページ作成者を現在のユーザーで上書きする",
+          "desc": "users を同時に復元しない場合、このオプションは<span class=\"text-danger\">非推奨</span>です。"
+        },
+        "set_public_to_page": {
+          "label": "'{{from}}' 設定のページを '公開' 設定にする",
+          "desc": "全ての <b>'{{from}}'</b> 設定のページが<span class=\"text-danger\">全ユーザーから</span>読み取り可能になることに注意してください。"
+        },
+        "initialize_meta_datas": {
+          "label": "「いいね」「閲覧したユーザー」「コメント数」を初期化する",
+          "desc": "users を同時に復元しない場合、このオプションは<span class=\"text-danger\">非推奨</span>です。"
+        },
+        "initialize_hackmd_related_datas": {
+          "label": "HackMD 関連データを初期化する",
+          "desc": "HackMD に重要な下書きデータがない限りはこのオプションをチェックすることを推奨します。"
+        }
+      },
+      "revisions": {
+        "overwrite_author": {
+          "label": "リビジョン作成者を現在のユーザーで上書きする",
+          "desc": "users を同時に復元しない場合、このオプションは<span class=\"text-danger\">非推奨</span>です。"
+        }
+      }
+    }
+  },
+  "esa_settings": {
+    "team_name": "チーム名",
+    "access_token": "アクセストークン",
+    "test_connection": "接続テスト"
+  },
+  "qiita_settings": {
+    "team_name": "チーム名",
+    "access_token": "アクセストークン",
+    "test_connection": "接続テスト"
+  },
+  "import": "インポート",
+  "page_skip": "既に GROWI 側に同名のページが存在する場合、そのページはスキップされます",
+  "Directory_hierarchy_tag": "ディレクトリ階層タグ"
+}

+ 35 - 0
resource/locales/ja/admin/markdown_setting.json

@@ -0,0 +1,35 @@
+{
+  "lineBreak_header": "Line Break設定",
+  "lineBreak_desc": "Line Breakの設定を変更できます。",
+  "lineBreak_options": {
+    "enable_lineBreak": "Line Break を有効にする",
+    "enable_lineBreak_desc": "ページテキスト中の改行を、HTML内で<code>&lt;br&gt;</code>として扱います",
+    "enable_lineBreak_for_comment": "コメント欄で Line Break を有効にする",
+    "enable_lineBreak_for_comment_desc": "コメント中の改行を、HTML内で<code>&lt;br&gt;</code>として扱います"
+  },
+  "presentation_header": "プレゼンテーション設定",
+  "presentation_desc": "プレゼンテーションの設定を変更できます。",
+  "presentation_options": {
+    "page_break_setting": "改頁を設定する",
+    "preset_one_separator": "プリセット 1",
+    "preset_one_separator_desc": "連続した空行3行で改頁します",
+    "preset_one_separator_value": "\\n\\n\\n",
+    "preset_two_separator": "プリセット 2",
+    "preset_two_separator_desc": "連続したハイフン5つで改頁します",
+    "preset_two_separator_value": "-----",
+    "custom_separator": "カスタム",
+    "custom_separator_desc": "正規表現を設定できます"
+  },
+  "xss_header": "XSS(Cross Site Scripting)対策設定",
+  "xss_desc": "マークダウンテキスト内の HTML タグの扱いを設定し、悪意のあるプログラムからの攻撃を防ぎます",
+  "xss_options": {
+    "enable_xss_prevention": "XSSを抑制する",
+    "ignore_all_tags": "すべてのタグを抑制する",
+    "ignore_all_tags_desc": "すべてのHTMLタグと属性を使用不可にします",
+    "recommended_setting": "おすすめ設定",
+    "custom_whitelist": "カスタムホワイトリスト",
+    "tag_names": "タグ名",
+    "tag_attributes": "タグ属性",
+    "import_recommended": "{{target}} のおすすめをインポート"
+  }
+}

+ 32 - 0
resource/locales/ja/admin/user_group_management.json

@@ -0,0 +1,32 @@
+{
+  "create_group": "新規グループの作成",
+  "deny_create_group": "新規グループの作成はできません。",
+  "group_name": "グループ名",
+  "group_example": "例: Group1",
+  "add_modal": {
+    "add_user": "グループへのユーザー追加",
+    "search_option": "検索オプション",
+    "enable_option": "{{option}}を有効にする",
+    "forward_match": "前方一致",
+    "partial_match": "部分一致",
+    "backward_match": "後方一致"
+  },
+  "group_list": "グループ一覧",
+  "back_to_list": "グループ一覧に戻る",
+  "basic_info": "基本情報",
+  "user_list": "ユーザー一覧",
+  "created_group": "グループを作成しました",
+  "is_loading_data": "データを取得中です...",
+  "no_pages": "グループが閲覧権限を保有するページはありません",
+  "remove_from_group": "グループから外す",
+  "delete_modal": {
+    "header": "グループの削除",
+    "desc": "グループ及び限定公開のページの削除を行うと元に戻すことはできませんのでご注意ください。",
+    "dropdown_desc": "削除するグループの限定公開ページの処理を選択してください",
+    "select_group": "グループを選択してください",
+    "no_groups": "グループがありません",
+    "publish_pages": "全て公開する",
+    "delete_pages": "全て削除する",
+    "transfer_pages": "全て他のグループに移譲する"
+  }
+}

+ 46 - 0
resource/locales/ja/admin/user_management.json

@@ -0,0 +1,46 @@
+{
+  "invite_users": "新規ユーザーの招待",
+  "invite_modal": {
+    "emails": "メールアドレス (複数行入力で複数人招待可能)",
+    "invite_thru_email": "招待をメールで送信",
+    "valid_email": "メールアドレスを入力してください。",
+    "temporary_password": "作成したユーザーは仮パスワードが設定されています。",
+    "send_new_password": "新規発行したパスワードを、対象ユーザーへ連絡してください。",
+    "send_temporary_password": "招待メールを送っていない場合、この画面で必ず仮パスワードをコピーし、招待者へ連絡してください。",
+    "existing_email": "以下のEmailはすでに存在しています。"
+  },
+  "user_table": {
+    "administrator": "管理者",
+    "edit_menu": "編集メニュー",
+    "reset_password": "パスワードの再発行",
+    "administrator_menu": "管理者メニュー",
+    "accept": "承認する",
+    "deactivate_account": "アカウント停止",
+    "your_own": "自分自身のアカウントを停止することはできません",
+    "remove_admin_access": "管理者から外す",
+    "cannot_remove": "自分自身を管理者から外すことはできません",
+    "give_admin_access": "管理者にする"
+  },
+  "reset_password": "パスワードのリセット",
+  "reset_password_modal": {
+    "password_never_seen": "表示されたパスワードはこの画面を閉じると二度と表示できませんのでご注意ください。",
+    "password_reset_message": "対象ユーザーに下記のパスワードを伝え、すぐに新しく別のパスワードを設定するよう伝えてください。",
+    "send_new_password": "新規発行したパスワードを、対象ユーザーへ連絡してください。",
+    "target_user": "対象ユーザー",
+    "new_password": "新しいパスワード"
+  },
+  "external_account": "外部アカウントの管理",
+  "external_account_list": "外部アカウント一覧",
+  "invite": "招待する",
+  "invited": "ユーザーを招待しました",
+  "back_to_user_management": "ユーザー管理に戻る",
+  "authentication_provider": "認証情報プロバイダ",
+  "manage": "操作",
+  "password_setting": "パスワード設定",
+  "password_setting_help": "関連付けられているユーザーがパスワードを設定しているかどうかを表示します",
+  "set": "設定済み",
+  "unset": "未設定",
+  "related_username": "関連付けられているユーザーの ",
+  "cannot_invite_maximum_users": "ユーザーが上限に達したため招待できません。",
+  "current_users": "現在のユーザー数:"
+}

+ 9 - 0
resource/locales/ja/common/toaster.json

@@ -0,0 +1,9 @@
+{
+  "update_successed": "{{target}}を更新しました",
+  "give_user_admin": "{{username}}を管理者に設定しました",
+  "remove_user_admin": "{{username}}を管理者から外しました",
+  "activate_user_success": "{{username}}を有効化しました",
+  "deactivate_user_success": "{{username}}を無効化しました",
+  "remove_user_success": "{{username}}を削除しました",
+  "remove_external_user_success": "{{accountId}}を削除しました "
+}

+ 0 - 295
resource/locales/ja/translation.json

@@ -352,57 +352,6 @@
     "insert_image": "で画像を挿入できます",
     "insert_image": "で画像を挿入できます",
     "open_sandbox": "Sandbox を開く"
     "open_sandbox": "Sandbox を開く"
   },
   },
-  "admin_top": {
-    "Management Wiki": "Wiki管理",
-    "System Information": "システム情報",
-    "wiki_administrator": "この画面はWiki管理者のみがアクセスできる画面です。",
-    "assign_administrator": "「ユーザー管理」から「管理者にする」ボタンを使ってユーザーをWiki管理者に任命することができます。",
-    "List of installed plugins": "インストールされているプラグイン一覧",
-    "Package name": "パッケージ名",
-    "Specified version": "指定バージョン",
-    "Installed version": "インストールされているバージョン"
-  },
-  "app_setting": {
-    "Site Name": "サイト名",
-    "sitename_change": "ヘッダーや HTML タイトルに使用されるサイト名を変更できます。",
-    "header_content": "ここに入力した内容は、ヘッダー等に表示されます。",
-    "Site URL desc": "サイトURLを設定します。",
-    "Site URL warn": "サイトURLが設定されていないため、一部機能が動作しない状態になっています。",
-    "siteurl_help": "<code>http://</code> または <code>https://</code> から始まるサイトのURL",
-    "Confidential name": "コンフィデンシャル表示",
-    "Default Language for new users": "新規ユーザーのデフォルト設定言語",
-    "ex) internal use only": "例: 社外秘",
-    "File Uploading": "ファイルアップロード",
-    "enable_files_except_image": "画像以外のファイルアップロードを許可",
-    "attach_enable": "許可をしている場合、画像以外のファイルをページに添付可能になります。",
-    "Update": "更新",
-    "Mail settings": "メールの設定",
-    "SMTP_used": "SMTPの設定がされている場合、それが利用されます。",
-    "SMTP_but_AWS": "SMTP設定がなく、AWSの設定がある場合、SESでの送信を試みます。",
-    "neihter_of": "どちらの設定もない場合、メールは送信されません。",
-    "From e-mail address": "Fromアドレス",
-    "SMTP settings": "SMTP設定",
-    "Host": "ホスト",
-    "Port": "ポート",
-    "User": "ユーザー",
-    "AWS settings": "AWS設定",
-    "AWS_access": "AWS にアクセスするための設定を行います。AWS の設定を完了させると、ファイルアップロード機能、プロフィール写真機能などが有効になります。",
-    "No_SMTP_setting": "また、SMTP の設定が無い場合、SES を利用したメール送信が行われます。FromメールアドレスのVerify、プロダクション利用設定をする必要があります。",
-    "change_setting": "この設定を途中で変更すると、これまでにアップロードしたファイル等へのアクセスができなくなりますのでご注意下さい。",
-    "region": "リージョン",
-    "bucket name": "バケット名",
-    "custom endpoint": "カスタムエンドポイント",
-    "custom_endpoint_change": "MinIOなど、S3互換APIを持つ他のオブジェクトストレージサービスを使用する場合のみ、そのエンドポイントのURLを入力してください。空欄の場合は、Amazon S3を使用します。",
-    "Plugin settings": "プラグイン設定",
-    "Enable plugin loading": "プラグインの読み込みを有効にします。",
-    "Load plugins": "プラグインを読み込む",
-    "Enable": "有効",
-    "Disable": "無効",
-    "Use env var if empty": "データベース側の値が空の場合、環境変数 <code>{{variable}}</code> の値を利用します",
-    "updated_app_setting": "アプリ設定を更新しました",
-    "updated_site_url": "サイトURLを更新しました",
-    "updated_plugin_setting": "プラグイン設定を更新しました"
-  },
   "security_setting": {
   "security_setting": {
     "Guest Users Access": "ゲストユーザーのアクセス",
     "Guest Users Access": "ゲストユーザーのアクセス",
     "Fixed by env var": "環境変数 <code>%s=%s</code> により固定されています。",
     "Fixed by env var": "環境変数 <code>%s=%s</code> により固定されています。",
@@ -543,38 +492,6 @@
       "security:passport-saml:attrMapLastName": "名"
       "security:passport-saml:attrMapLastName": "名"
     }
     }
   },
   },
-  "markdown_setting": {
-    "line_break_setting": "Line Break設定",
-    "line_break_setting_desc": "Line Breakの設定を変更できます。",
-    "Enable Line Break": "Line Break を有効にする",
-    "Enable Line Break desc": "ページテキスト中の改行を、HTML内で<code>&lt;br&gt;</code>として扱います",
-    "Enable Line Break for comment": "コメント欄で Line Break を有効にする",
-    "Enable Line Break for comment desc": "コメント中の改行を、HTML内で<code>&lt;br&gt;</code>として扱います",
-    "presentation_setting": "プレゼンテーション設定",
-    "presentation_setting_desc": "プレゼンテーションの設定を変更できます。",
-    "Page break setting": "改頁を設定する",
-    "Preset one separator": "プリセット 1",
-    "Preset one separator desc": "連続した空行3行で改頁します",
-    "Preset one separator value": "\\n\\n\\n",
-    "Preset two separator": "プリセット 2",
-    "Preset two separator desc": "連続したハイフン5つで改頁します",
-    "Preset two separator value": "-----",
-    "Custom separator": "カスタム",
-    "Custom separator desc": "正規表現を設定できます",
-    "XSS_setting": "XSS(Cross Site Scripting)対策設定",
-    "XSS_setting_desc": "マークダウンテキスト内の HTML タグの扱いを設定し、悪意のあるプログラムからの攻撃を防ぎます",
-    "Enable XSS prevention": "XSSを抑制する",
-    "Ignore all tags": "すべてのタグを抑制する",
-    "Ignore all tags desc": "すべてのHTMLタグと属性を使用不可にします",
-    "Recommended setting": "おすすめ設定",
-    "Custom Whitelist": "カスタムホワイトリスト",
-    "Tag names": "タグ名",
-    "Tag attributes": "タグ属性",
-    "import_recommended": "{{target}} のおすすめをインポート",
-    "updated_lineBreak": "改行設定を更新しました",
-    "updated_presentation": "プレゼンテーション設定を更新しました",
-    "updated_xss": "XSS設定を更新しました"
-  },
   "notification_setting": {
   "notification_setting": {
     "notification_list": "通知設定の一覧",
     "notification_list": "通知設定の一覧",
     "add_notification": "通知設定の追加",
     "add_notification": "通知設定の追加",
@@ -594,223 +511,11 @@
       "ifttt_link": "IFTTT でメールトリガの新しいアプレットを作る"
       "ifttt_link": "IFTTT でメールトリガの新しいアプレットを作る"
     }
     }
   },
   },
-  "customize_page": {
-    "recommended": "おすすめ",
-    "Behavior": "動作",
-    "Layout": "レイアウト",
-    "Function": "機能",
-    "function_choose": "機能の有効/無効を選択できます。",
-    "Timeline function": "タイムライン機能",
-    "Code Highlight": "コードハイライト",
-    "Theme": "テーマ",
-    "subpage_display": "配下ページのタイムラインを表示できます。",
-    "performance_decrease": "配下ページが多い場合はページロード時のパフォーマンスが落ちます。",
-    "list_page_display": "無効化することでリストページの表示を高速化できます。",
-    "tab_switch": "タブ変更をブラウザ履歴に保存",
-    "save_edit": "編集タブやヒストリータブ等の切り替えをブラウザ履歴に保存し、ブラウザの戻る/進む操作の対象にします。",
-    "by_invalidating": "無効化することで、ページ遷移のみを戻る/進む操作の対象にすることができます。",
-    "nocdn_desc": "この機能は、環境変数 <code>NO_CDN=true</code> の時は無効化されます。<br>GitHub スタイルが適用されています。",
-    "custom_title": "カスタム Title",
-    "custom_title_detail": "<code>%s</code>タグのコンテンツをカスタマイズできます。<br><code>%s</code>がサイト名、<code>%s</code>がページ名またはページパスに置換されます。",
-    "custom_header": "カスタム HTML Header",
-    "custom_header_detail": "システム全体に適用される HTML を記述できます。<code>&lt;header&gt;</code> タグ内の他の <code>&lt;script&gt;</code> タグ読み込み前に展開されます。<br>変更の反映はページの更新が必要です。",
-    "Custom CSS": "カスタム CSS",
-    "write_CSS": " システム全体に適用されるCSSを記述できます。",
-    "reflect_change": "変更の反映はページの更新が必要です。",
-    "ctrl_space": "Ctrl+Space でコード補完",
-    "Custom script": "カスタムスクリプト",
-    "write_java": "システム全体に適用されるJavaScriptを記述できます。",
-    "attach_title_header": "新規ページ作成時の h1 セクション自動挿入",
-    "attach_title_header_desc": "新規作成したページの1行目に、ページのパスを h1 セクションとして挿入します。",
-    "recent_created__n_draft_num_desc": "最近作成したページと下書きの表示数",
-    "recently_created_n_draft_num_desc": "ホーム画面の Recently Created での、1ページの表示数を設定します。",
-    "stale_notification": "更新されていないページに通知を表示",
-    "stale_notification_desc": "最終更新から1年以上が経過しているページに通知を表示します。",
-    "update_layout_success": "レイアウトを更新しました",
-    "update_behavior_success": "動作を更新しました",
-    "update_function_success": "機能を更新しました",
-    "update_highlight_success": "コードハイライトを更新しました",
-    "update_customTitle_success": "カスタムタイトルを更新しました",
-    "update_customHeader_success": "カスタムHTMLヘッダーを更新しました",
-    "update_customCss_success": "カスタムCSSを更新しました",
-    "update_script_success": "カスタムスクリプトを更新しました",
-    "layout_description": {
-      "growi_title": "シンプル・明瞭",
-      "growi_text1": "全画面レイアウトで、余白は少なくなります。",
-      "growi_text2": "コメントはページの下部に表示されます。",
-      "growi_text3": "ページ情報は下部に表示されます。",
-      "kibela_title": "閲覧重視の構造",
-      "kibela_text1": "コンテンツが中心に表示されます。",
-      "kibela_text2": "コメントはページの下部に表示されます。",
-      "kibela_text3": "ページ情報は下部に表示されます。",
-      "crowi_title": "ビュー・コントロールの分離",
-      "crowi_text1": "サイドバーを開くと情報が表示されます。",
-      "crowi_text2": "コメントはサイドバーに表示されます。",
-      "crowi_text3": "ページ情報はサイドバーに表示されます。"
-    },
-    "behavior_description": {
-      "growi_text1": "<code>/page</code>と<code>/page/</code>どちらのパスも同じページを表示します。",
-      "growi_text2": "<code>/nonexistent_page</code> では編集フォームを表示します",
-      "growi_text3": "<b>GROWI Enhanced Layout</b>では全てのページが配下のページリストを表示します",
-      "crowi_text1": "<code>/page</code> ではページを表示します。",
-      "crowi_text2": "<code>/page/</code> では配下のページを表示します。",
-      "crowi_text3": "<code>/page/</code>がポータルに適応している場合、ポータルページと配下のページリストを表示します。",
-      "crowi_text4": "<code>/nonexistent_page</code> では編集フォームを表示します",
-      "crowi_text5": "<code>/nonexistent_page</code> では配下のページリストを表示します。"
-    }
-  },
-  "user_management": {
-    "target_user": "対象ユーザー",
-    "new_password": "新しいパスワード",
-    "invite_users": "新規ユーザーの招待",
-    "emails": "メールアドレス (複数行入力で複数人招待可能)",
-    "invite_thru_email": "招待をメールで送信",
-    "invite": "招待する",
-    "invited": "ユーザーを招待しました",
-    "give_admin_access": "管理者にする",
-    "remove_admin_access": "管理者から外す",
-    "external_account": "外部アカウントの管理",
-    "external_account_list": "外部アカウント一覧",
-    "back_to_user_management": "ユーザー管理に戻る",
-    "authentication_provider": "認証情報プロバイダ",
-    "manage": "操作",
-    "edit_menu": "編集メニュー",
-    "password_setting": "パスワード設定",
-    "password_setting_help": "関連付けられているユーザーがパスワードを設定しているかどうかを表示します",
-    "set": "設定済み",
-    "unset": "未設定",
-    "temporary_password": "作成したユーザーは仮パスワードが設定されています。",
-    "send_temporary_password": "招待メールを送っていない場合、この画面で必ず仮パスワードをコピーし、招待者へ連絡してください。",
-    "password_reset_message": "対象ユーザーに下記のパスワードを伝え、すぐに新しく別のパスワードを設定するよう伝えてください。",
-    "send_new_password": "新規発行したパスワードを、対象ユーザーへ連絡してください。",
-    "password_never_seen": "表示されたパスワードはこの画面を閉じると二度と表示できませんのでご注意ください。",
-    "reset_password": "パスワードの再発行",
-    "related_username": "関連付けられているユーザーの ",
-    "accept": "承認する",
-    "deactivate_account": "アカウント停止",
-    "your_own": "自分自身のアカウントを停止することはできません",
-    "administrator_menu": "管理者メニュー",
-    "cannot_remove": "自分自身を管理者から外すことはできません",
-    "cannot_invite_maximum_users": "ユーザーが上限に達したため招待できません。",
-    "current_users": "現在のユーザー数:",
-    "valid_email": "メールアドレスを入力してください。",
-    "existing_email": "以下のEmailはすでに存在しています。",
-    "give_user_admin": "{{username}}を管理者に設定しました",
-    "remove_user_admin": "{{username}}を管理者から外しました",
-    "activate_user_success": "{{username}}を有効化しました",
-    "deactivate_user_success": "{{username}}を無効化しました",
-    "remove_user_success": "{{username}}を削除しました",
-    "remove_external_user_success": "{{accountId}}を削除しました "
-  },
-  "user_group_management": {
-    "search_option": "検索オプション",
-    "enable_option": "{{option}}を有効にする",
-    "forward_match": "前方一致",
-    "partial_match": "部分一致",
-    "backward_match": "後方一致",
-    "group_list": "グループ一覧",
-    "back_to_list": "グループ一覧に戻る",
-    "basic_info": "基本情報",
-    "user_list": "ユーザー一覧",
-    "create_group": "新規グループの作成",
-    "group_example": "例: Group1",
-    "created_group": "グループを作成しました",
-    "add_user": "グループへのユーザー追加",
-    "deny_create_group": "新規グループの作成はできません。",
-    "is_loading_data": "データを取得中です...",
-    "choose_action": "削除するグループの限定公開ページの処理を選択してください",
-    "delete_group": "グループの削除",
-    "group_name": "グループ名",
-    "group_and_pages_not_retrievable": "グループ及び限定公開のページの削除を行うと元に戻すことはできませんのでご注意ください。",
-    "publish_pages": "全て公開する",
-    "delete_pages": "全て削除する",
-    "transfer_pages": "全て他のグループに移譲する",
-    "select_group": "グループを選択してください",
-    "no_groups": "グループがありません",
-    "no_pages": "グループが閲覧権限を保有するページはありません",
-    "remove_from_group": "グループから外す"
-  },
-  "importer_management": {
-    "beta_warning": "この機能はベータ版です",
-    "import_from": "{{from}} からインポート",
-    "import_growi_archive": "GROWI アーカイブをインポート",
-    "growi_settings": {
-      "overwrite_documents": "インポートされたドキュメントは既存のドキュメントを上書きします",
-      "growi_archive_file": "GROWI アーカイブファイル",
-      "uploaded_data": "アップロードされたデータ",
-      "extracted_file": "展開されたファイル",
-      "collection": "コレクション",
-      "upload": "アップロード",
-      "discard": "アップロードしたデータを破棄する",
-      "errors": {
-        "at_least_one": "コレクションが選択されていません",
-        "page_and_revision": "'Pages' と 'Revisions' はセットでインポートする必要があります",
-        "depends": "'{{condition}}' をインポートする場合は、'{{target}}' を一緒に選択する必要があります"
-      },
-      "configuration": {
-        "pages": {
-          "overwrite_author": {
-            "label": "ページ作成者を現在のユーザーで上書きする",
-            "desc": "users を同時に復元しない場合、このオプションは<span class=\"text-danger\">非推奨</span>です。"
-          },
-          "set_public_to_page": {
-            "label": "'{{from}}' 設定のページを '公開' 設定にする",
-            "desc": "全ての <b>'{{from}}'</b> 設定のページが<span class=\"text-danger\">全ユーザーから</span>読み取り可能になることに注意してください。"
-          },
-          "initialize_meta_datas": {
-            "label": "「いいね」「閲覧したユーザー」「コメント数」を初期化する",
-            "desc": "users を同時に復元しない場合、このオプションは<span class=\"text-danger\">非推奨</span>です。"
-          },
-          "initialize_hackmd_related_datas": {
-            "label": "HackMD 関連データを初期化する",
-            "desc": "HackMD に重要な下書きデータがない限りはこのオプションをチェックすることを推奨します。"
-          }
-        },
-        "revisions": {
-          "overwrite_author": {
-            "label": "リビジョン作成者を現在のユーザーで上書きする",
-            "desc": "users を同時に復元しない場合、このオプションは<span class=\"text-danger\">非推奨</span>です。"
-          }
-        }
-      }
-    },
-    "esa_settings": {
-      "team_name": "チーム名",
-      "access_token": "アクセストークン",
-      "test_connection": "接続テスト"
-    },
-    "qiita_settings": {
-      "team_name": "チーム名",
-      "access_token": "アクセストークン",
-      "test_connection": "接続テスト"
-    },
-    "import": "インポート",
-    "page_skip": "既に GROWI 側に同名のページが存在する場合、そのページはスキップされます",
-    "Directory_hierarchy_tag": "ディレクトリ階層タグ"
-  },
   "full_text_search_management": {
   "full_text_search_management": {
     "elasticsearch_management": "Elasticsearch 管理",
     "elasticsearch_management": "Elasticsearch 管理",
     "build_button": "インデックスのリビルド",
     "build_button": "インデックスのリビルド",
     "rebuild_description_1": "Build Now ボタンを押すと全てのページのインデックスを削除し、作り直します。",
     "rebuild_description_1": "Build Now ボタンを押すと全てのページのインデックスを削除し、作り直します。",
     "rebuild_description_2": "この作業には数秒かかります。",
     "rebuild_description_2": "この作業には数秒かかります。",
     "rebuild_description_3": ""
     "rebuild_description_3": ""
-  },
-  "export_management": {
-    "exporting_collection_list": "エクスポート中のコレクション",
-    "exported_data_list": "エクスポートされたアーカイブリスト",
-    "export_collections": "コレクションのエクスポート",
-    "check_all": "全てにチェックを付ける",
-    "uncheck_all": "全てからチェックを外す",
-    "desc_password_seed": "ユーザーデータをバックアップ/リストアする場合、現在の <code>PASSWORD_SEED</code> を新しい GROWI システムにセットすることを忘れないでください。さもなくば、ユーザーがパスワードでログインできなくなります。<br><br><strong>ヒント:</strong><br>現在の <code>PASSWORD_SEED</code> は、エクスポートされる ZIP 中の <code>meta.json</code> に保存されます。",
-    "create_new_archive_data": "アーカイブデータの新規作成",
-    "export": "エクスポート",
-    "cancel": "キャンセル",
-    "file": "ファイル名",
-    "growi_version": "Growi バージョン",
-    "collections": "コレクション",
-    "exported_at": "エクスポートされた時間",
-    "export_menu": "エクスポートメニュー",
-    "download": "ダウンロード",
-    "delete": "削除"
   }
   }
 }
 }

+ 4 - 4
src/client/js/components/Admin/AdminHome/AdminHome.jsx

@@ -34,21 +34,21 @@ class AdminHome extends React.Component {
     return (
     return (
       <Fragment>
       <Fragment>
         <p>
         <p>
-          {t('admin_top.wiki_administrator')}
+          {t('admin_top:wiki_administrator')}
           <br></br>
           <br></br>
-          {t('admin_top.assign_administrator')}
+          {t('admin_top:assign_administrator')}
         </p>
         </p>
 
 
         <div className="row mb-5">
         <div className="row mb-5">
           <div className="col-md-12">
           <div className="col-md-12">
-            <h2 className="admin-setting-header">{t('admin_top.System Information')}</h2>
+            <h2 className="admin-setting-header">{t('admin_top:system_information')}</h2>
             <SystemInfomationTable />
             <SystemInfomationTable />
           </div>
           </div>
         </div>
         </div>
 
 
         <div className="row mb-5">
         <div className="row mb-5">
           <div className="col-md-12">
           <div className="col-md-12">
-            <h2 className="admin-setting-header">{t('admin_top.List of installed plugins')}</h2>
+            <h2 className="admin-setting-header">{t('admin_top:list_of_installed_plugins')}</h2>
             <InstalledPluginTable />
             <InstalledPluginTable />
           </div>
           </div>
         </div>
         </div>

+ 8 - 8
src/client/js/components/Admin/AdminHome/InstalledPluginTable.jsx

@@ -15,21 +15,21 @@ class InstalledPluginTable extends React.Component {
       <table className="table table-bordered">
       <table className="table table-bordered">
         <thead>
         <thead>
           <tr>
           <tr>
-            <th className="text-center">{ t('admin_top.Package name') }</th>
-            <th className="text-center">{ t('admin_top.Specified version') }</th>
-            <th className="text-center">{ t('admin_top.Installed version') }</th>
+            <th className="text-center">{t('admin_top:package_name')}</th>
+            <th className="text-center">{t('admin_top:specified_version')}</th>
+            <th className="text-center">{t('admin_top:installed_version')}</th>
           </tr>
           </tr>
         </thead>
         </thead>
         <tbody>
         <tbody>
-          { adminHomeContainer.state.installedPlugins.map((plugin) => {
+          {adminHomeContainer.state.installedPlugins.map((plugin) => {
             return (
             return (
               <tr key={plugin.name}>
               <tr key={plugin.name}>
-                <td>{ plugin.name }</td>
-                <td className="text-center">{ plugin.requiredVersion }</td>
-                <td className="text-center">{ plugin.installedVersion }</td>
+                <td>{plugin.name}</td>
+                <td className="text-center">{plugin.requiredVersion}</td>
+                <td className="text-center">{plugin.installedVersion}</td>
               </tr>
               </tr>
             );
             );
-          }) }
+          })}
         </tbody>
         </tbody>
       </table>
       </table>
     );
     );

+ 11 - 11
src/client/js/components/Admin/App/AppSetting.jsx

@@ -25,7 +25,7 @@ class AppSetting extends React.Component {
 
 
     try {
     try {
       await adminAppContainer.updateAppSettingHandler();
       await adminAppContainer.updateAppSettingHandler();
-      toastSuccess(t('app_setting.updated_app_setting'));
+      toastSuccess(t('toaster:update_successed', { target: 'App' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -39,7 +39,7 @@ class AppSetting extends React.Component {
     return (
     return (
       <React.Fragment>
       <React.Fragment>
         <div className="row md-5">
         <div className="row md-5">
-          <label className="col-xs-3 control-label">{t('app_setting.Site Name')}</label>
+          <label className="col-xs-3 control-label">{t('app_setting:site_name')}</label>
           <div className="col-xs-6">
           <div className="col-xs-6">
             <input
             <input
               className="form-control"
               className="form-control"
@@ -48,26 +48,26 @@ class AppSetting extends React.Component {
               onChange={(e) => { adminAppContainer.changeTitle(e.target.value) }}
               onChange={(e) => { adminAppContainer.changeTitle(e.target.value) }}
               placeholder="GROWI"
               placeholder="GROWI"
             />
             />
-            <p className="help-block">{t('app_setting.sitename_change')}</p>
+            <p className="help-block">{t('app_setting:sitename_change')}</p>
           </div>
           </div>
         </div>
         </div>
 
 
         <div className="row md-5">
         <div className="row md-5">
-          <label className="col-xs-3 control-label">{t('app_setting.Confidential name')}</label>
+          <label className="col-xs-3 control-label">{t('app_setting:confidential_name')}</label>
           <div className="col-xs-6">
           <div className="col-xs-6">
             <input
             <input
               className="form-control"
               className="form-control"
               type="text"
               type="text"
               defaultValue={adminAppContainer.state.confidential}
               defaultValue={adminAppContainer.state.confidential}
               onChange={(e) => { adminAppContainer.changeConfidential(e.target.value) }}
               onChange={(e) => { adminAppContainer.changeConfidential(e.target.value) }}
-              placeholder={t('app_setting.ex) internal use only')}
+              placeholder={t('app_setting:confidential_example')}
             />
             />
-            <p className="help-block">{t('app_setting.header_content')}</p>
+            <p className="help-block">{t('app_setting:header_content')}</p>
           </div>
           </div>
         </div>
         </div>
 
 
         <div className="row md-5">
         <div className="row md-5">
-          <label className="col-xs-3 control-label">{t('app_setting.Default Language for new users')}</label>
+          <label className="col-xs-3 control-label">{t('app_setting:default_language')}</label>
           <div className="col-xs-6">
           <div className="col-xs-6">
             <div className="radio radio-primary radio-inline">
             <div className="radio radio-primary radio-inline">
               <input
               <input
@@ -95,7 +95,7 @@ class AppSetting extends React.Component {
         </div>
         </div>
 
 
         <div className="row md-5">
         <div className="row md-5">
-          <label className="col-xs-3 control-label">{t('app_setting.File Uploading')}</label>
+          <label className="col-xs-3 control-label">{t('app_setting:file_uploading')}</label>
           <div className="col-xs-6">
           <div className="col-xs-6">
             <div className="checkbox checkbox-info">
             <div className="checkbox checkbox-info">
               <input
               <input
@@ -105,13 +105,13 @@ class AppSetting extends React.Component {
                 checked={adminAppContainer.state.fileUpload}
                 checked={adminAppContainer.state.fileUpload}
                 onChange={(e) => { adminAppContainer.changeFileUpload(e.target.checked) }}
                 onChange={(e) => { adminAppContainer.changeFileUpload(e.target.checked) }}
               />
               />
-              <label htmlFor="cbFileUpload">{t('app_setting.enable_files_except_image')}</label>
+              <label htmlFor="cbFileUpload">{t('app_setting:enable_files_except_image')}</label>
             </div>
             </div>
 
 
             <p className="help-block">
             <p className="help-block">
-              {t('app_setting.enable_files_except_image')}
+              {t('app_setting:enable_files_except_image')}
               <br />
               <br />
-              {t('app_setting.attach_enable')}
+              {t('app_setting:attach_enable')}
             </p>
             </p>
           </div>
           </div>
         </div>
         </div>

+ 3 - 3
src/client/js/components/Admin/App/AppSettingsPage.jsx

@@ -53,21 +53,21 @@ class AppSettingsPage extends React.Component {
 
 
         <div className="row mt-5">
         <div className="row mt-5">
           <div className="col-md-12">
           <div className="col-md-12">
-            <h2 className="admin-setting-header">{t('app_setting.Mail settings')}</h2>
+            <h2 className="admin-setting-header">{t('app_setting:mail_settings')}</h2>
             <MailSetting />
             <MailSetting />
           </div>
           </div>
         </div>
         </div>
 
 
         <div className="row mt-5">
         <div className="row mt-5">
           <div className="col-md-12">
           <div className="col-md-12">
-            <h2 className="admin-setting-header">{t('app_setting.AWS settings')}</h2>
+            <h2 className="admin-setting-header">{t('app_setting:aws_settings')}</h2>
             <AwsSetting />
             <AwsSetting />
           </div>
           </div>
         </div>
         </div>
 
 
         <div className="row mt-5">
         <div className="row mt-5">
           <div className="col-md-12">
           <div className="col-md-12">
-            <h2 className="admin-setting-header">{t('app_setting.Plugin settings')}</h2>
+            <h2 className="admin-setting-header">{t('app_setting:plugin_settings')}</h2>
             <PluginSetting />
             <PluginSetting />
           </div>
           </div>
         </div>
         </div>

+ 8 - 8
src/client/js/components/Admin/App/AwsSetting.jsx

@@ -25,7 +25,7 @@ class AwsSetting extends React.Component {
 
 
     try {
     try {
       await adminAppContainer.updateAwsSettingHandler();
       await adminAppContainer.updateAwsSettingHandler();
-      toastSuccess(t('app_setting.updated_app_setting'));
+      toastSuccess(t('toaster:update_successed', { target: 'AWS' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -39,20 +39,20 @@ class AwsSetting extends React.Component {
     return (
     return (
       <React.Fragment>
       <React.Fragment>
         <p className="well">
         <p className="well">
-          {t('app_setting.AWS_access')}
+          {t('app_setting:aws_access')}
           <br />
           <br />
-          {t('app_setting.No_SMTP_setting')}
+          {t('app_setting:no_smtp_setting')}
           <br />
           <br />
           <br />
           <br />
           <span className="text-danger">
           <span className="text-danger">
             <i className="ti-unlink"></i>
             <i className="ti-unlink"></i>
-            {t('app_setting.change_setting')}
+            {t('app_setting:change_setting')}
           </span>
           </span>
         </p>
         </p>
 
 
         <div className="row mb-5">
         <div className="row mb-5">
           <label className="col-xs-3 control-label">
           <label className="col-xs-3 control-label">
-            {t('app_setting.region')}
+            {t('app_setting:region')}
           </label>
           </label>
           <div className="col-xs-6">
           <div className="col-xs-6">
             <input
             <input
@@ -68,7 +68,7 @@ class AwsSetting extends React.Component {
 
 
         <div className="row mb-5">
         <div className="row mb-5">
           <label className="col-xs-3 control-label">
           <label className="col-xs-3 control-label">
-            {t('app_setting.custom endpoint')}
+            {t('app_setting:custom_endpoint')}
           </label>
           </label>
           <div className="col-xs-6">
           <div className="col-xs-6">
             <input
             <input
@@ -80,13 +80,13 @@ class AwsSetting extends React.Component {
                 adminAppContainer.changeCustomEndpoint(e.target.value);
                 adminAppContainer.changeCustomEndpoint(e.target.value);
               }}
               }}
             />
             />
-            <p className="help-block">{t('app_setting.custom_endpoint_change')}</p>
+            <p className="help-block">{t('app_setting:custom_endpoint_change')}</p>
           </div>
           </div>
         </div>
         </div>
 
 
         <div className="row mb-5">
         <div className="row mb-5">
           <label className="col-xs-3 control-label">
           <label className="col-xs-3 control-label">
-            {t('app_setting.bucket name')}
+            {t('app_setting:bucket_name')}
           </label>
           </label>
           <div className="col-xs-6">
           <div className="col-xs-6">
             <input
             <input

+ 8 - 8
src/client/js/components/Admin/App/MailSetting.jsx

@@ -25,7 +25,7 @@ class MailSetting extends React.Component {
 
 
     try {
     try {
       await adminAppContainer.updateMailSettingHandler();
       await adminAppContainer.updateMailSettingHandler();
-      toastSuccess(t('app_setting.updated_app_setting'));
+      toastSuccess(t('toster.update_successed', { target: 'Mail' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -38,9 +38,9 @@ class MailSetting extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <p className="well">{t('app_setting.SMTP_used')} {t('app_setting.SMTP_but_AWS')}<br />{t('app_setting.neihter_of')}</p>
+        <p className="well">{t('app_setting:smtp_used')} {t('app_setting:smtp_but_aws')}<br />{t('app_setting:neihter_of')}</p>
         <div className="row mb-5">
         <div className="row mb-5">
-          <label className="col-xs-3 control-label">{t('app_setting.From e-mail address')}</label>
+          <label className="col-xs-3 control-label">{t('app_setting:from_e-mail_address')}</label>
           <div className="col-xs-6">
           <div className="col-xs-6">
             <input
             <input
               className="form-control"
               className="form-control"
@@ -53,9 +53,9 @@ class MailSetting extends React.Component {
         </div>
         </div>
 
 
         <div className="row mb-5">
         <div className="row mb-5">
-          <label className="col-xs-3 control-label">{ t('app_setting.SMTP settings') }</label>
+          <label className="col-xs-3 control-label">{t('app_setting:smtp_settings')}</label>
           <div className="col-xs-4">
           <div className="col-xs-4">
-            <label>{ t('app_setting.Host') }</label>
+            <label>{t('app_setting:host')}</label>
             <input
             <input
               className="form-control"
               className="form-control"
               type="text"
               type="text"
@@ -64,7 +64,7 @@ class MailSetting extends React.Component {
             />
             />
           </div>
           </div>
           <div className="col-xs-2">
           <div className="col-xs-2">
-            <label>{ t('app_setting.Port') }</label>
+            <label>{t('app_setting:port')}</label>
             <input
             <input
               className="form-control"
               className="form-control"
               defaultValue={adminAppContainer.state.smtpPort}
               defaultValue={adminAppContainer.state.smtpPort}
@@ -75,7 +75,7 @@ class MailSetting extends React.Component {
 
 
         <div className="row mb-5">
         <div className="row mb-5">
           <div className="col-xs-3 col-xs-offset-3">
           <div className="col-xs-3 col-xs-offset-3">
-            <label>{ t('app_setting.User') }</label>
+            <label>{t('app_setting:user')}</label>
             <input
             <input
               className="form-control"
               className="form-control"
               type="text"
               type="text"
@@ -84,7 +84,7 @@ class MailSetting extends React.Component {
             />
             />
           </div>
           </div>
           <div className="col-xs-3">
           <div className="col-xs-3">
-            <label>{ t('Password') }</label>
+            <label>{t('Password')}</label>
             <input
             <input
               className="form-control"
               className="form-control"
               type="password"
               type="password"

+ 3 - 3
src/client/js/components/Admin/App/PluginSetting.jsx

@@ -26,7 +26,7 @@ class PluginSetting extends React.Component {
 
 
     try {
     try {
       await adminAppContainer.updatePluginSettingHandler();
       await adminAppContainer.updatePluginSettingHandler();
-      toastSuccess(t('app_setting.updated_plugin_setting'));
+      toastSuccess(t('toaster:update_successed', { target: 'Plugin' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -39,7 +39,7 @@ class PluginSetting extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <p className="well">{t('app_setting.Enable plugin loading')}</p>
+        <p className="well">{t('app_setting:enable_plugin_loading')}</p>
 
 
         <div className="row mb-5">
         <div className="row mb-5">
           <div className="col-xs-offset-3 col-xs-6 text-left">
           <div className="col-xs-offset-3 col-xs-6 text-left">
@@ -52,7 +52,7 @@ class PluginSetting extends React.Component {
                   adminAppContainer.changeIsEnabledPlugins(e.target.checked);
                   adminAppContainer.changeIsEnabledPlugins(e.target.checked);
                 }}
                 }}
               />
               />
-              <label htmlFor="isEnabledPlugins">{t('app_setting.Load plugins')}</label>
+              <label htmlFor="isEnabledPlugins">{t('app_setting:load_plugins')}</label>
             </div>
             </div>
           </div>
           </div>
         </div>
         </div>

+ 5 - 5
src/client/js/components/Admin/App/SiteUrlSetting.jsx

@@ -25,7 +25,7 @@ class SiteUrlSetting extends React.Component {
 
 
     try {
     try {
       await adminAppContainer.updateSiteUrlSettingHandler();
       await adminAppContainer.updateSiteUrlSettingHandler();
-      toastSuccess(t('app_setting.updated_site_url'));
+      toastSuccess(t('toaster:update_successed', { target: 'URL' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -38,8 +38,8 @@ class SiteUrlSetting extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <p className="well">{t('app_setting.Site URL desc')}</p>
-        {!adminAppContainer.state.isSetSiteUrl && (<p className="alert alert-danger"><i className="icon-exclamation"></i> {t('app_setting.Site URL warn')}</p>)}
+        <p className="well">{t('app_setting:site_url_desc')}</p>
+        {!adminAppContainer.state.isSetSiteUrl && (<p className="alert alert-danger"><i className="icon-exclamation"></i> {t('app_setting:site_url_warn')}</p>)}
 
 
         <div className="row">
         <div className="row">
           <div className="col-md-12">
           <div className="col-md-12">
@@ -68,14 +68,14 @@ class SiteUrlSetting extends React.Component {
                       />
                       />
                       <p className="help-block">
                       <p className="help-block">
                         {/* eslint-disable-next-line react/no-danger */}
                         {/* eslint-disable-next-line react/no-danger */}
-                        <div dangerouslySetInnerHTML={{ __html: t('app_setting.siteurl_help') }} />
+                        <div dangerouslySetInnerHTML={{ __html: t('app_setting:siteurl_help') }} />
                       </p>
                       </p>
                     </td>
                     </td>
                     <td>
                     <td>
                       <input className="form-control" type="text" value={adminAppContainer.state.envSiteUrl} readOnly />
                       <input className="form-control" type="text" value={adminAppContainer.state.envSiteUrl} readOnly />
                       <p className="help-block">
                       <p className="help-block">
                         {/* eslint-disable-next-line react/no-danger */}
                         {/* eslint-disable-next-line react/no-danger */}
-                        <div dangerouslySetInnerHTML={{ __html: t('app_setting.Use env var if empty', { variable: 'APP_SITE_URL' }) }} />
+                        <div dangerouslySetInnerHTML={{ __html: t('app_setting:use_env_var_if_empty', { variable: 'APP_SITE_URL' }) }} />
                       </p>
                       </p>
                     </td>
                     </td>
                   </tr>
                   </tr>

+ 11 - 11
src/client/js/components/Admin/Customize/CustomizeBehaviorSetting.jsx

@@ -29,7 +29,7 @@ class CustomizeBehaviorSetting extends React.Component {
 
 
     try {
     try {
       await adminCustomizeContainer.updateCustomizeBehavior();
       await adminCustomizeContainer.updateCustomizeBehavior();
-      toastSuccess(t('customize_page.update_behavior_success'));
+      toastSuccess(t('toaster:update_successed', { target: 'Behavior' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -42,19 +42,19 @@ class CustomizeBehaviorSetting extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <h2 className="admin-setting-header">{t('customize_page.Behavior')}</h2>
+        <h2 className="admin-setting-header">{t('customize_setting:behavior')}</h2>
         <div className="row">
         <div className="row">
           <div className="col-xs-6">
           <div className="col-xs-6">
             <CustomizeBehaviorOption
             <CustomizeBehaviorOption
               behaviorType="growi"
               behaviorType="growi"
               isSelected={adminCustomizeContainer.state.currentBehavior === 'growi'}
               isSelected={adminCustomizeContainer.state.currentBehavior === 'growi'}
               onSelected={() => adminCustomizeContainer.switchBehaviorType('growi')}
               onSelected={() => adminCustomizeContainer.switchBehaviorType('growi')}
-              labelHtml={`GROWI Simplified Behavior <small class="text-success">${t('customize_page.recommended')}</small>`}
+              labelHtml={`GROWI Simplified Behavior <small class="text-success">${t('customize_setting:recommended')}</small>`}
             >
             >
               <ul>
               <ul>
-                <li><span dangerouslySetInnerHTML={{ __html: t('customize_page.behavior_description.growi_text1') }} /></li>
-                <li><span dangerouslySetInnerHTML={{ __html: t('customize_page.behavior_description.growi_text2') }} /></li>
-                <li><span dangerouslySetInnerHTML={{ __html: t('customize_page.behavior_description.growi_text3') }} /></li>
+                <li><span dangerouslySetInnerHTML={{ __html: t('customize_setting:behavior_desc.growi_text1') }} /></li>
+                <li><span dangerouslySetInnerHTML={{ __html: t('customize_setting:behavior_desc.growi_text2') }} /></li>
+                <li><span dangerouslySetInnerHTML={{ __html: t('customize_setting:behavior_desc.growi_text3') }} /></li>
               </ul>
               </ul>
             </CustomizeBehaviorOption>
             </CustomizeBehaviorOption>
           </div>
           </div>
@@ -67,13 +67,13 @@ class CustomizeBehaviorSetting extends React.Component {
               labelHtml="Crowi Classic Behavior"
               labelHtml="Crowi Classic Behavior"
             >
             >
               <ul>
               <ul>
-                <li><span dangerouslySetInnerHTML={{ __html: t('customize_page.behavior_description.crowi_text1') }} /></li>
-                <li><span dangerouslySetInnerHTML={{ __html: t('customize_page.behavior_description.crowi_text2') }} /></li>
+                <li><span dangerouslySetInnerHTML={{ __html: t('customize_setting:behavior_desc.crowi_text1') }} /></li>
+                <li><span dangerouslySetInnerHTML={{ __html: t('customize_setting:behavior_desc.crowi_text2') }} /></li>
                 <ul>
                 <ul>
-                  <li><span dangerouslySetInnerHTML={{ __html: t('customize_page.behavior_description.crowi_text3') }} /></li>
+                  <li><span dangerouslySetInnerHTML={{ __html: t('customize_setting:behavior_desc.crowi_text3') }} /></li>
                 </ul>
                 </ul>
-                <li><span dangerouslySetInnerHTML={{ __html: t('customize_page.behavior_description.crowi_text4') }} /></li>
-                <li><span dangerouslySetInnerHTML={{ __html: t('customize_page.behavior_description.crowi_text5') }} /></li>
+                <li><span dangerouslySetInnerHTML={{ __html: t('customize_setting:behavior_desc.crowi_text4') }} /></li>
+                <li><span dangerouslySetInnerHTML={{ __html: t('customize_setting:behavior_desc.crowi_text5') }} /></li>
               </ul>
               </ul>
             </CustomizeBehaviorOption>
             </CustomizeBehaviorOption>
           </div>
           </div>

+ 5 - 5
src/client/js/components/Admin/Customize/CustomizeCssSetting.jsx

@@ -37,7 +37,7 @@ class CustomizeCssSetting extends React.Component {
 
 
     try {
     try {
       await adminCustomizeContainer.updateCustomizeCss();
       await adminCustomizeContainer.updateCustomizeCss();
-      toastSuccess(t('customize_page.update_customCss_success'));
+      toastSuccess(t('toaster:update_successed', { target: 'CustomCss' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -50,10 +50,10 @@ class CustomizeCssSetting extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <h2 className="admin-setting-header">{t('customize_page.Custom CSS')}</h2>
+        <h2 className="admin-setting-header">{t('customize_setting:custom_css')}</h2>
         <p className="well">
         <p className="well">
-          { t('customize_page.write_CSS') }<br />
-          { t('customize_page.reflect_change') }
+          {t('customize_setting:write_css')}<br />
+          {t('customize_setting:reflect_change')}
         </p>
         </p>
         <div className="form-group">
         <div className="form-group">
           <div className="col-xs-12">
           <div className="col-xs-12">
@@ -66,7 +66,7 @@ class CustomizeCssSetting extends React.Component {
           <div className="col-xs-12">
           <div className="col-xs-12">
             <p className="help-block text-right">
             <p className="help-block text-right">
               <i className="fa fa-fw fa-keyboard-o" aria-hidden="true" />
               <i className="fa fa-fw fa-keyboard-o" aria-hidden="true" />
-              { t('customize_page.ctrl_space') }
+              {t('customize_setting:ctrl_space')}
             </p>
             </p>
           </div>
           </div>
         </div>
         </div>

+ 16 - 16
src/client/js/components/Admin/Customize/CustomizeFunctionSetting.jsx

@@ -28,7 +28,7 @@ class CustomizeBehaviorSetting extends React.Component {
 
 
     try {
     try {
       await adminCustomizeContainer.updateCustomizeFunction();
       await adminCustomizeContainer.updateCustomizeFunction();
-      toastSuccess(t('customize_page.update_function_success'));
+      toastSuccess(t('toaster:update_successed', { target: 'Function' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -41,21 +41,21 @@ class CustomizeBehaviorSetting extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <h2 className="admin-setting-header">{t('customize_page.Function')}</h2>
-        <p className="well">{ t('customize_page.function_choose') }</p>
+        <h2 className="admin-setting-header">{t('customize_setting:function')}</h2>
+        <p className="well">{t('customize_setting:function_desc')}</p>
 
 
         <div className="form-group row">
         <div className="form-group row">
           <div className="col-xs-offset-3 col-xs-6 text-left">
           <div className="col-xs-offset-3 col-xs-6 text-left">
             <CustomizeFunctionOption
             <CustomizeFunctionOption
               optionId="isEnabledTimeline"
               optionId="isEnabledTimeline"
-              label={t('customize_page.Timeline function')}
+              label={t('customize_setting:function_options.timeline')}
               isChecked={adminCustomizeContainer.state.isEnabledTimeline}
               isChecked={adminCustomizeContainer.state.isEnabledTimeline}
               onChecked={() => { adminCustomizeContainer.switchEnableTimeline() }}
               onChecked={() => { adminCustomizeContainer.switchEnableTimeline() }}
             >
             >
               <p className="help-block">
               <p className="help-block">
-                { t('customize_page.subpage_display') }<br />
-                { t('customize_page.performance_decrease') }<br />
-                { t('customize_page.list_page_display') }
+                {t('customize_setting:function_options.timeline_desc1')}<br />
+                {t('customize_setting:function_options.timeline_desc2')}<br />
+                {t('customize_setting:function_options.timeline_desc3')}
               </p>
               </p>
             </CustomizeFunctionOption>
             </CustomizeFunctionOption>
           </div>
           </div>
@@ -65,13 +65,13 @@ class CustomizeBehaviorSetting extends React.Component {
           <div className="col-xs-offset-3 col-xs-6 text-left">
           <div className="col-xs-offset-3 col-xs-6 text-left">
             <CustomizeFunctionOption
             <CustomizeFunctionOption
               optionId="isSavedStatesOfTabChanges"
               optionId="isSavedStatesOfTabChanges"
-              label={t('customize_page.tab_switch')}
+              label={t('customize_setting:function_options.tab_switch')}
               isChecked={adminCustomizeContainer.state.isSavedStatesOfTabChanges}
               isChecked={adminCustomizeContainer.state.isSavedStatesOfTabChanges}
               onChecked={() => { adminCustomizeContainer.switchSavedStatesOfTabChanges() }}
               onChecked={() => { adminCustomizeContainer.switchSavedStatesOfTabChanges() }}
             >
             >
               <p className="help-block">
               <p className="help-block">
-                { t('customize_page.save_edit') }<br />
-                { t('customize_page.by_invalidating') }
+                {t('customize_setting:function_options.tab_switch_desc1')}<br />
+                {t('customize_setting:function_options.tab_switch_desc2')}
               </p>
               </p>
             </CustomizeFunctionOption>
             </CustomizeFunctionOption>
           </div>
           </div>
@@ -81,12 +81,12 @@ class CustomizeBehaviorSetting extends React.Component {
           <div className="col-xs-offset-3 col-xs-6 text-left">
           <div className="col-xs-offset-3 col-xs-6 text-left">
             <CustomizeFunctionOption
             <CustomizeFunctionOption
               optionId="isEnabledAttachTitleHeader"
               optionId="isEnabledAttachTitleHeader"
-              label={t('customize_page.attach_title_header')}
+              label={t('customize_setting:function_options.attach_title_header')}
               isChecked={adminCustomizeContainer.state.isEnabledAttachTitleHeader}
               isChecked={adminCustomizeContainer.state.isEnabledAttachTitleHeader}
               onChecked={() => { adminCustomizeContainer.switchEnabledAttachTitleHeader() }}
               onChecked={() => { adminCustomizeContainer.switchEnabledAttachTitleHeader() }}
             >
             >
               <p className="help-block">
               <p className="help-block">
-                { t('customize_page.attach_title_header_desc') }
+                {t('customize_setting:function_options.attach_title_header_desc')}
               </p>
               </p>
             </CustomizeFunctionOption>
             </CustomizeFunctionOption>
           </div>
           </div>
@@ -95,7 +95,7 @@ class CustomizeBehaviorSetting extends React.Component {
         <div className="form-group row">
         <div className="form-group row">
           <div className="col-xs-offset-3 col-xs-6 text-left">
           <div className="col-xs-offset-3 col-xs-6 text-left">
             <div className="my-0 btn-group">
             <div className="my-0 btn-group">
-              <label>{t('customize_page.recent_created__n_draft_num_desc')}</label>
+              <label>{t('customize_setting:function_options.recent_created__n_draft_num_desc')}</label>
               <div className="dropdown">
               <div className="dropdown">
                 <button className="btn btn-default dropdown-toggle w-100" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                 <button className="btn btn-default dropdown-toggle w-100" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                   <span className="pull-left">{adminCustomizeContainer.state.currentRecentCreatedLimit}</span>
                   <span className="pull-left">{adminCustomizeContainer.state.currentRecentCreatedLimit}</span>
@@ -117,7 +117,7 @@ class CustomizeBehaviorSetting extends React.Component {
                 </ul>
                 </ul>
               </div>
               </div>
               <p className="help-block">
               <p className="help-block">
-                { t('customize_page.recently_created_n_draft_num_desc') }
+                {t('customize_setting:function_options.recently_created_n_draft_num_desc')}
               </p>
               </p>
             </div>
             </div>
           </div>
           </div>
@@ -127,12 +127,12 @@ class CustomizeBehaviorSetting extends React.Component {
           <div className="col-xs-offset-3 col-xs-6 text-left">
           <div className="col-xs-offset-3 col-xs-6 text-left">
             <CustomizeFunctionOption
             <CustomizeFunctionOption
               optionId="isEnabledStaleNotification"
               optionId="isEnabledStaleNotification"
-              label={t('customize_page.stale_notification')}
+              label={t('customize_setting:function_options.stale_notification')}
               isChecked={adminCustomizeContainer.state.isEnabledStaleNotification}
               isChecked={adminCustomizeContainer.state.isEnabledStaleNotification}
               onChecked={() => { adminCustomizeContainer.switchEnableStaleNotification() }}
               onChecked={() => { adminCustomizeContainer.switchEnableStaleNotification() }}
             >
             >
               <p className="help-block">
               <p className="help-block">
-                { t('customize_page.stale_notification_desc') }
+                {t('customize_setting:function_options.stale_notification_desc')}
               </p>
               </p>
             </CustomizeFunctionOption>
             </CustomizeFunctionOption>
           </div>
           </div>

+ 5 - 5
src/client/js/components/Admin/Customize/CustomizeHeaderSetting.jsx

@@ -37,7 +37,7 @@ class CustomizeHeaderSetting extends React.Component {
 
 
     try {
     try {
       await adminCustomizeContainer.updateCustomizeHeader();
       await adminCustomizeContainer.updateCustomizeHeader();
-      toastSuccess(t('customize_page.update_customHeader_success'));
+      toastSuccess(t('toaster:update_successed', { target: 'CustomHeader' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -50,16 +50,16 @@ class CustomizeHeaderSetting extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <h2 className="admin-setting-header">{t('customize_page.custom_header')}</h2>
+        <h2 className="admin-setting-header">{t('customize_setting:custom_header')}</h2>
 
 
         <p
         <p
           className="well"
           className="well"
           // eslint-disable-next-line react/no-danger
           // eslint-disable-next-line react/no-danger
-          dangerouslySetInnerHTML={{ __html: t('customize_page.custom_header_detail') }}
+          dangerouslySetInnerHTML={{ __html: t('customize_setting:custom_header_detail') }}
         />
         />
 
 
         <div className="help-block">
         <div className="help-block">
-          { t('Example') }:
+          {t('Example')}:
           <pre className="hljs">
           <pre className="hljs">
             {/* eslint-disable-next-line react/no-unescaped-entities */}
             {/* eslint-disable-next-line react/no-unescaped-entities */}
             <code>&lt;script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.13.0/build/languages/yaml.min.js" defer&gt;&lt;/script&gt;</code>
             <code>&lt;script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.13.0/build/languages/yaml.min.js" defer&gt;&lt;/script&gt;</code>
@@ -76,7 +76,7 @@ class CustomizeHeaderSetting extends React.Component {
         <div className="col-xs-12">
         <div className="col-xs-12">
           <p className="help-block text-right">
           <p className="help-block text-right">
             <i className="fa fa-fw fa-keyboard-o" aria-hidden="true"></i>
             <i className="fa fa-fw fa-keyboard-o" aria-hidden="true"></i>
-            { t('customize_page.ctrl_space') }
+            {t('customize_setting:ctrl_space')}
           </p>
           </p>
         </div>
         </div>
 
 

+ 4 - 4
src/client/js/components/Admin/Customize/CustomizeHighlightSetting.jsx

@@ -28,7 +28,7 @@ class CustomizeHighlightSetting extends React.Component {
 
 
     try {
     try {
       await adminCustomizeContainer.updateHighlightJsStyle();
       await adminCustomizeContainer.updateHighlightJsStyle();
-      toastSuccess(t('customize_page.update_highlight_success'));
+      toastSuccess(t('toaster:update_successed', { target: 'Highlight' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -72,12 +72,12 @@ class CustomizeHighlightSetting extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <h2 className="admin-setting-header">{t('customize_page.Code Highlight')}</h2>
+        <h2 className="admin-setting-header">{t('customize_setting:code_highlight')}</h2>
 
 
         <div className="form-group row">
         <div className="form-group row">
           <div className="col-xs-offset-3 col-xs-6 text-left">
           <div className="col-xs-offset-3 col-xs-6 text-left">
             <div className="my-0 btn-group">
             <div className="my-0 btn-group">
-              <label>{t('customize_page.Theme')}</label>
+              <label>{t('customize_setting:theme')}</label>
               <div className="dropdown">
               <div className="dropdown">
                 <button className="btn btn-default dropdown-toggle w-100" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                 <button className="btn btn-default dropdown-toggle w-100" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                   <span className="pull-left">{adminCustomizeContainer.state.currentHighlightJsStyleName}</span>
                   <span className="pull-left">{adminCustomizeContainer.state.currentHighlightJsStyleName}</span>
@@ -91,7 +91,7 @@ class CustomizeHighlightSetting extends React.Component {
                 </ul>
                 </ul>
               </div>
               </div>
               {/* eslint-disable-next-line react/no-danger */}
               {/* eslint-disable-next-line react/no-danger */}
-              <p className="help-block text-warning"><span dangerouslySetInnerHTML={{ __html:  t('customize_page.nocdn_desc') }} /></p>
+              <p className="help-block text-warning"><span dangerouslySetInnerHTML={{ __html: t('customize_setting:nocdn_desc') }} /></p>
             </div>
             </div>
           </div>
           </div>
         </div>
         </div>

+ 13 - 13
src/client/js/components/Admin/Customize/CustomizeLayoutOptions.jsx

@@ -20,13 +20,13 @@ class CustomizeLayoutOptions extends React.Component {
             layoutType="crowi-plus"
             layoutType="crowi-plus"
             isSelected={adminCustomizeContainer.state.currentLayout === 'growi'}
             isSelected={adminCustomizeContainer.state.currentLayout === 'growi'}
             onSelected={() => adminCustomizeContainer.switchLayoutType('growi')}
             onSelected={() => adminCustomizeContainer.switchLayoutType('growi')}
-            labelHtml={`GROWI Enhanced Layout <small class="text-success">${t('customize_page.recommended')}</small>`}
+            labelHtml={`GROWI Enhanced Layout <small class="text-success">${t('customize_setting:recommended')}</small>`}
           >
           >
-            <h4>{t('customize_page.layout_description.growi_title')}</h4>
+            <h4>{t('customize_setting:layout_desc.growi_title')}</h4>
             <ul>
             <ul>
-              <li>{t('customize_page.layout_description.growi_text1')}</li>
-              <li>{t('customize_page.layout_description.growi_text2')}</li>
-              <li>{t('customize_page.layout_description.growi_text3')}</li>
+              <li>{t('customize_setting:layout_desc.growi_text1')}</li>
+              <li>{t('customize_setting:layout_desc.growi_text2')}</li>
+              <li>{t('customize_setting:layout_desc.growi_text3')}</li>
             </ul>
             </ul>
           </CustomizeLayoutOption>
           </CustomizeLayoutOption>
         </div>
         </div>
@@ -38,11 +38,11 @@ class CustomizeLayoutOptions extends React.Component {
             onSelected={() => adminCustomizeContainer.switchLayoutType('kibela')}
             onSelected={() => adminCustomizeContainer.switchLayoutType('kibela')}
             labelHtml="Kibela Like Layout"
             labelHtml="Kibela Like Layout"
           >
           >
-            <h4>{t('customize_page.layout_description.kibela_title')}</h4>
+            <h4>{t('customize_setting:layout_desc.kibela_title')}</h4>
             <ul>
             <ul>
-              <li>{t('customize_page.layout_description.kibela_text1')}</li>
-              <li>{t('customize_page.layout_description.kibela_text2')}</li>
-              <li>{t('customize_page.layout_description.kibela_text3')}</li>
+              <li>{t('customize_setting:layout_desc.kibela_text1')}</li>
+              <li>{t('customize_setting:layout_desc.kibela_text2')}</li>
+              <li>{t('customize_setting:layout_desc.kibela_text3')}</li>
             </ul>
             </ul>
           </CustomizeLayoutOption>
           </CustomizeLayoutOption>
         </div>
         </div>
@@ -54,11 +54,11 @@ class CustomizeLayoutOptions extends React.Component {
             onSelected={() => adminCustomizeContainer.switchLayoutType('crowi')}
             onSelected={() => adminCustomizeContainer.switchLayoutType('crowi')}
             labelHtml="Crowi Classic Layout"
             labelHtml="Crowi Classic Layout"
           >
           >
-            <h4>{t('customize_page.layout_description.crowi_title')}</h4>
+            <h4>{t('customize_setting:layout_desc.crowi_title')}</h4>
             <ul>
             <ul>
-              <li>{t('customize_page.layout_description.crowi_text1')}</li>
-              <li>{t('customize_page.layout_description.crowi_text2')}</li>
-              <li>{t('customize_page.layout_description.crowi_text3')}</li>
+              <li>{t('customize_setting:layout_desc.crowi_text1')}</li>
+              <li>{t('customize_setting:layout_desc.crowi_text2')}</li>
+              <li>{t('customize_setting:layout_desc.crowi_text3')}</li>
             </ul>
             </ul>
           </CustomizeLayoutOption>
           </CustomizeLayoutOption>
         </div>
         </div>

+ 3 - 3
src/client/js/components/Admin/Customize/CustomizeLayoutSetting.jsx

@@ -30,7 +30,7 @@ class CustomizeLayoutSetting extends React.Component {
 
 
     try {
     try {
       await adminCustomizeContainer.updateCustomizeLayoutAndTheme();
       await adminCustomizeContainer.updateCustomizeLayoutAndTheme();
-      toastSuccess(t('customize_page.update_layout_success'));
+      toastSuccess(t('toaster:update_successed', { target: 'Layout' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -54,9 +54,9 @@ class CustomizeLayoutSetting extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <h2 className="admin-setting-header">{t('customize_page.Layout')}</h2>
+        <h2 className="admin-setting-header">{t('customize_setting:layout')}</h2>
         <CustomizeLayoutOptions />
         <CustomizeLayoutOptions />
-        <h2 className="admin-setting-header">{t('customize_page.Theme')}</h2>
+        <h2 className="admin-setting-header">{t('customize_setting:theme')}</h2>
         {this.renderDevAlert()}
         {this.renderDevAlert()}
         <CustomizeThemeOptions />
         <CustomizeThemeOptions />
         <AdminUpdateButtonRow onClick={this.onClickSubmit} disabled={adminCustomizeContainer.state.retrieveError != null} />
         <AdminUpdateButtonRow onClick={this.onClickSubmit} disabled={adminCustomizeContainer.state.retrieveError != null} />

+ 5 - 5
src/client/js/components/Admin/Customize/CustomizeScriptSetting.jsx

@@ -37,7 +37,7 @@ class CustomizeScriptSetting extends React.Component {
 
 
     try {
     try {
       await adminCustomizeContainer.updateCustomizeScript();
       await adminCustomizeContainer.updateCustomizeScript();
-      toastSuccess(t('customize_page.update_script_success'));
+      toastSuccess(t('toaster:update_successed', { target: 'CustomScript' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -58,10 +58,10 @@ class CustomizeScriptSetting extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <h2 className="admin-setting-header">{t('customize_page.Custom script')}</h2>
+        <h2 className="admin-setting-header">{t('customize_setting:custom_script')}</h2>
         <p className="well">
         <p className="well">
-          { t('customize_page.write_java') }<br />
-          { t('customize_page.reflect_change') }
+          {t('customize_setting:write_java')}<br />
+          {t('customize_setting:reflect_change')}
         </p>
         </p>
 
 
         <div className="help-block">
         <div className="help-block">
@@ -97,7 +97,7 @@ class CustomizeScriptSetting extends React.Component {
           <div className="col-xs-12">
           <div className="col-xs-12">
             <p className="help-block text-right">
             <p className="help-block text-right">
               <i className="fa fa-fw fa-keyboard-o" aria-hidden="true" />
               <i className="fa fa-fw fa-keyboard-o" aria-hidden="true" />
-              { t('customize_page.ctrl_space') }
+              {t('customize_setting:ctrl_space')}
             </p>
             </p>
           </div>
           </div>
         </div>
         </div>

+ 3 - 3
src/client/js/components/Admin/Customize/CustomizeTitle.jsx

@@ -25,7 +25,7 @@ class CustomizeTitle extends React.Component {
 
 
     try {
     try {
       await adminCustomizeContainer.updateCustomizeTitle();
       await adminCustomizeContainer.updateCustomizeTitle();
-      toastSuccess(t('customize_page.update_customTitle_success'));
+      toastSuccess(t('toaster:update_successed', { target: 'CustomTitle' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -39,11 +39,11 @@ class CustomizeTitle extends React.Component {
 
 
     return (
     return (
       <React.Fragment>
       <React.Fragment>
-        <h2 className="admin-setting-header">{t('customize_page.custom_title')}</h2>
+        <h2 className="admin-setting-header">{t('customize_setting:custom_title')}</h2>
         <p
         <p
           className="well"
           className="well"
           // eslint-disable-next-line react/no-danger, max-len
           // eslint-disable-next-line react/no-danger, max-len
-          dangerouslySetInnerHTML={{ __html: '<code>&lt;title&gt;</code>タグのコンテンツをカスタマイズできます。<br><code>&#123;&#123;sitename&#125;&#125;</code>がサイト名、<code>&#123;&#123;page&#125;&#125;</code>がページ名またはページパスに置換されます。' }}
+          dangerouslySetInnerHTML={{ __html: t('customize_setting:custom_title_detail') }}
         />
         />
         {/* TODO i18n */}
         {/* TODO i18n */}
         <div className="help-block">
         <div className="help-block">

+ 4 - 4
src/client/js/components/Admin/ExportArchiveData/ArchiveFilesTable.jsx

@@ -19,10 +19,10 @@ class ArchiveFilesTable extends React.Component {
       <table className="table table-bordered">
       <table className="table table-bordered">
         <thead>
         <thead>
           <tr>
           <tr>
-            <th>{t('export_management.file')}</th>
-            <th>{t('export_management.growi_version')}</th>
-            <th>{t('export_management.collections')}</th>
-            <th>{t('export_management.exported_at')}</th>
+            <th>{t('export_management:file')}</th>
+            <th>{t('export_management:growi_version')}</th>
+            <th>{t('export_management:collections')}</th>
+            <th>{t('export_management:exported_at')}</th>
             <th></th>
             <th></th>
           </tr>
           </tr>
         </thead>
         </thead>

+ 3 - 3
src/client/js/components/Admin/ExportArchiveData/ArchiveFilesTableMenu.jsx

@@ -17,15 +17,15 @@ class ArchiveFilesTableMenu extends React.Component {
           <i className="icon-settings"></i> <span className="caret"></span>
           <i className="icon-settings"></i> <span className="caret"></span>
         </button>
         </button>
         <ul className="dropdown-menu" role="menu">
         <ul className="dropdown-menu" role="menu">
-          <li className="dropdown-header">{t('export_management.export_menu')}</li>
+          <li className="dropdown-header">{t('export_management:export_menu')}</li>
           <li>
           <li>
             <a type="button" href={`/admin/export/${this.props.fileName}`}>
             <a type="button" href={`/admin/export/${this.props.fileName}`}>
-              <i className="icon-cloud-download" /> {t('export_management.download')}
+              <i className="icon-cloud-download" /> {t('export_management:download')}
             </a>
             </a>
           </li>
           </li>
           <li>
           <li>
             <a type="button" role="button" onClick={() => this.props.onZipFileStatRemove(this.props.fileName)}>
             <a type="button" role="button" onClick={() => this.props.onZipFileStatRemove(this.props.fileName)}>
-              <span className="text-danger"><i className="icon-trash" /> {t('export_management.delete')}</span>
+              <span className="text-danger"><i className="icon-trash" /> {t('export_management:delete')}</span>
             </a>
             </a>
           </li>
           </li>
         </ul>
         </ul>

+ 11 - 11
src/client/js/components/Admin/ExportArchiveData/SelectCollectionsModal.jsx

@@ -117,7 +117,7 @@ class SelectCollectionsModal extends React.Component {
       return <></>;
       return <></>;
     }
     }
 
 
-    const html = this.props.t('export_management.desc_password_seed');
+    const html = this.props.t('export_management:desc_password_seed');
 
 
     // eslint-disable-next-line react/no-danger
     // eslint-disable-next-line react/no-danger
     return <div className="well well-sm" dangerouslySetInnerHTML={{ __html: html }}></div>;
     return <div className="well well-sm" dangerouslySetInnerHTML={{ __html: html }}></div>;
@@ -172,7 +172,7 @@ class SelectCollectionsModal extends React.Component {
     return (
     return (
       <Modal show={this.props.isOpen} onHide={this.props.onClose}>
       <Modal show={this.props.isOpen} onHide={this.props.onClose}>
         <Modal.Header closeButton>
         <Modal.Header closeButton>
-          <Modal.Title>{t('export_management.export_collections')}</Modal.Title>
+          <Modal.Title>{t('export_management:export_collections')}</Modal.Title>
         </Modal.Header>
         </Modal.Header>
 
 
         <form onSubmit={this.export}>
         <form onSubmit={this.export}>
@@ -180,43 +180,43 @@ class SelectCollectionsModal extends React.Component {
             <div className="row">
             <div className="row">
               <div className="col-sm-12">
               <div className="col-sm-12">
                 <button type="button" className="btn btn-sm btn-default mr-2" onClick={this.checkAll}>
                 <button type="button" className="btn btn-sm btn-default mr-2" onClick={this.checkAll}>
-                  <i className="fa fa-check-square-o"></i> {t('export_management.check_all')}
+                  <i className="fa fa-check-square-o"></i> {t('export_management:check_all')}
                 </button>
                 </button>
                 <button type="button" className="btn btn-sm btn-default mr-2" onClick={this.uncheckAll}>
                 <button type="button" className="btn btn-sm btn-default mr-2" onClick={this.uncheckAll}>
-                  <i className="fa fa-square-o"></i> {t('export_management.uncheck_all')}
+                  <i className="fa fa-square-o"></i> {t('export_management:uncheck_all')}
                 </button>
                 </button>
               </div>
               </div>
             </div>
             </div>
             <div className="row mt-4">
             <div className="row mt-4">
               <div className="col-xs-12">
               <div className="col-xs-12">
                 <legend>Page Collections</legend>
                 <legend>Page Collections</legend>
-                { this.renderGroups(GROUPS_PAGE) }
+                {this.renderGroups(GROUPS_PAGE)}
               </div>
               </div>
             </div>
             </div>
             <div className="row mt-4">
             <div className="row mt-4">
               <div className="col-xs-12">
               <div className="col-xs-12">
                 <legend>User Collections</legend>
                 <legend>User Collections</legend>
-                { this.renderGroups(GROUPS_USER, 'danger') }
-                { this.renderWarnForUser() }
+                {this.renderGroups(GROUPS_USER, 'danger')}
+                {this.renderWarnForUser()}
               </div>
               </div>
             </div>
             </div>
             <div className="row mt-4">
             <div className="row mt-4">
               <div className="col-xs-12">
               <div className="col-xs-12">
                 <legend>Config Collections</legend>
                 <legend>Config Collections</legend>
-                { this.renderGroups(GROUPS_CONFIG) }
+                {this.renderGroups(GROUPS_CONFIG)}
               </div>
               </div>
             </div>
             </div>
             <div className="row mt-4">
             <div className="row mt-4">
               <div className="col-xs-12">
               <div className="col-xs-12">
                 <legend>Other Collections</legend>
                 <legend>Other Collections</legend>
-                { this.renderOthers() }
+                {this.renderOthers()}
               </div>
               </div>
             </div>
             </div>
           </Modal.Body>
           </Modal.Body>
 
 
           <Modal.Footer>
           <Modal.Footer>
-            <button type="button" className="btn btn-sm btn-default" onClick={this.props.onClose}>{t('export_management.cancel')}</button>
-            <button type="submit" className="btn btn-sm btn-primary" disabled={!this.validateForm()}>{t('export_management.export')}</button>
+            <button type="button" className="btn btn-sm btn-default" onClick={this.props.onClose}>{t('export_management:cancel')}</button>
+            <button type="submit" className="btn btn-sm btn-primary" disabled={!this.validateForm()}>{t('export_management:export')}</button>
           </Modal.Footer>
           </Modal.Footer>
         </form>
         </form>
       </Modal>
       </Modal>

+ 3 - 3
src/client/js/components/Admin/ExportArchiveDataPage.jsx

@@ -214,19 +214,19 @@ class ExportArchiveDataPage extends React.Component {
         <h2>{t('Export Archive Data')}</h2>
         <h2>{t('Export Archive Data')}</h2>
 
 
         <button type="button" className="btn btn-default" disabled={isExporting} onClick={this.openExportModal}>
         <button type="button" className="btn btn-default" disabled={isExporting} onClick={this.openExportModal}>
-          {t('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('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('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}

+ 2 - 2
src/client/js/components/Admin/ImportData/GrowiArchive/ImportCollectionConfigurationModal.jsx

@@ -57,7 +57,7 @@ class ImportCollectionConfigurationModal extends React.Component {
     const { t } = this.props;
     const { t } = this.props;
     const { option } = this.state;
     const { option } = this.state;
 
 
-    const translationBase = 'importer_management.growi_settings.configuration.pages';
+    const translationBase = 'importer_management:growi_settings.configuration.pages';
 
 
     /* eslint-disable react/no-unescaped-entities */
     /* eslint-disable react/no-unescaped-entities */
     return (
     return (
@@ -149,7 +149,7 @@ class ImportCollectionConfigurationModal extends React.Component {
     const { t } = this.props;
     const { t } = this.props;
     const { option } = this.state;
     const { option } = this.state;
 
 
-    const translationBase = 'importer_management.growi_settings.configuration.revisions';
+    const translationBase = 'importer_management:growi_settings.configuration.revisions';
 
 
     /* eslint-disable react/no-unescaped-entities */
     /* eslint-disable react/no-unescaped-entities */
     return (
     return (

+ 21 - 21
src/client/js/components/Admin/ImportData/GrowiArchive/ImportForm.jsx

@@ -222,7 +222,7 @@ class ImportForm extends React.Component {
     const { warnForOtherGroups, selectedCollections } = this.state;
     const { warnForOtherGroups, selectedCollections } = this.state;
 
 
     if (selectedCollections.size === 0) {
     if (selectedCollections.size === 0) {
-      warnForOtherGroups.push(t('importer_management.growi_settings.errors.at_least_one'));
+      warnForOtherGroups.push(t('importer_management:growi_settings.errors.at_least_one'));
     }
     }
 
 
     this.setState({ warnForOtherGroups });
     this.setState({ warnForOtherGroups });
@@ -238,7 +238,7 @@ class ImportForm extends React.Component {
 
 
     // MUST be included both or neither when importing
     // MUST be included both or neither when importing
     if (pageRelatedCollectionsLength !== 0 && pageRelatedCollectionsLength !== 2) {
     if (pageRelatedCollectionsLength !== 0 && pageRelatedCollectionsLength !== 2) {
-      warnForPageGroups.push(t('importer_management.growi_settings.errors.page_and_revision'));
+      warnForPageGroups.push(t('importer_management:growi_settings.errors.page_and_revision'));
     }
     }
 
 
     this.setState({ warnForPageGroups });
     this.setState({ warnForPageGroups });
@@ -251,7 +251,7 @@ class ImportForm extends React.Component {
     // MUST include also 'users' if 'externalaccounts' is selected
     // MUST include also 'users' if 'externalaccounts' is selected
     if (selectedCollections.has('externalaccounts')) {
     if (selectedCollections.has('externalaccounts')) {
       if (!selectedCollections.has('users')) {
       if (!selectedCollections.has('users')) {
-        warnForUserGroups.push(t('importer_management.growi_settings.errors.depends', { target: 'Users', condition: 'Externalaccounts' }));
+        warnForUserGroups.push(t('importer_management:growi_settings.errors.depends', { target: 'Users', condition: 'Externalaccounts' }));
       }
       }
     }
     }
 
 
@@ -265,7 +265,7 @@ class ImportForm extends React.Component {
     // MUST include also 'users' if 'usergroups' is selected
     // MUST include also 'users' if 'usergroups' is selected
     if (selectedCollections.has('usergroups')) {
     if (selectedCollections.has('usergroups')) {
       if (!selectedCollections.has('users')) {
       if (!selectedCollections.has('users')) {
-        warnForUserGroups.push(t('importer_management.growi_settings.errors.depends', { target: 'Users', condition: 'Usergroups' }));
+        warnForUserGroups.push(t('importer_management:growi_settings.errors.depends', { target: 'Users', condition: 'Usergroups' }));
       }
       }
     }
     }
 
 
@@ -279,7 +279,7 @@ class ImportForm extends React.Component {
     // MUST include also 'usergroups' if 'usergrouprelations' is selected
     // MUST include also 'usergroups' if 'usergrouprelations' is selected
     if (selectedCollections.has('usergrouprelations')) {
     if (selectedCollections.has('usergrouprelations')) {
       if (!selectedCollections.has('usergroups')) {
       if (!selectedCollections.has('usergroups')) {
-        warnForUserGroups.push(t('importer_management.growi_settings.errors.depends', { target: 'Usergroups', condition: 'Usergrouprelations' }));
+        warnForUserGroups.push(t('importer_management:growi_settings.errors.depends', { target: 'Usergroups', condition: 'Usergrouprelations' }));
       }
       }
     }
     }
 
 
@@ -324,10 +324,10 @@ class ImportForm extends React.Component {
     return (
     return (
       <div key={key} className="alert alert-warning">
       <div key={key} className="alert alert-warning">
         <ul>
         <ul>
-          { errors.map((error, index) => {
+          {errors.map((error, index) => {
             // eslint-disable-next-line react/no-array-index-key
             // eslint-disable-next-line react/no-array-index-key
             return <li key={`${key}-${index}`}>{error}</li>;
             return <li key={`${key}-${index}`}>{error}</li>;
-          }) }
+          })}
         </ul>
         </ul>
       </div>
       </div>
     );
     );
@@ -345,15 +345,15 @@ class ImportForm extends React.Component {
     return (
     return (
       <div className="mt-4">
       <div className="mt-4">
         <legend>{groupName} Collections</legend>
         <legend>{groupName} Collections</legend>
-        { wellContent != null && (
+        {wellContent != null && (
           <div className="well well-sm small">
           <div className="well well-sm small">
             <ul>
             <ul>
               <li>{wellContent}</li>
               <li>{wellContent}</li>
             </ul>
             </ul>
           </div>
           </div>
-        ) }
-        { this.renderImportItems(collectionNames) }
-        { this.renderWarnForGroups(errors, `warnFor${groupName}`) }
+        )}
+        {this.renderImportItems(collectionNames)}
+        {this.renderWarnForGroups(errors, `warnFor${groupName}`)}
       </div>
       </div>
     );
     );
   }
   }
@@ -454,32 +454,32 @@ class ImportForm extends React.Component {
         <form className="form-inline">
         <form className="form-inline">
           <div className="form-group">
           <div className="form-group">
             <button type="button" className="btn btn-sm btn-default mr-2" onClick={this.checkAll}>
             <button type="button" className="btn btn-sm btn-default mr-2" onClick={this.checkAll}>
-              <i className="fa fa-check-square-o"></i> {t('export_management.check_all')}
+              <i className="fa fa-check-square-o"></i> {t('export_management:check_all')}
             </button>
             </button>
           </div>
           </div>
           <div className="form-group">
           <div className="form-group">
             <button type="button" className="btn btn-sm btn-default mr-2" onClick={this.uncheckAll}>
             <button type="button" className="btn btn-sm btn-default mr-2" onClick={this.uncheckAll}>
-              <i className="fa fa-square-o"></i> {t('export_management.uncheck_all')}
+              <i className="fa fa-square-o"></i> {t('export_management:uncheck_all')}
             </button>
             </button>
           </div>
           </div>
         </form>
         </form>
 
 
-        { this.renderGroups(GROUPS_PAGE, 'Page', warnForPageGroups, { wellContent: t('importer_management.growi_settings.overwrite_documents') }) }
-        { this.renderGroups(GROUPS_USER, 'User', warnForUserGroups) }
-        { this.renderGroups(GROUPS_CONFIG, 'Config', warnForConfigGroups) }
-        { this.renderOthers() }
+        {this.renderGroups(GROUPS_PAGE, 'Page', warnForPageGroups, { wellContent: t('importer_management:growi_settings.overwrite_documents') })}
+        {this.renderGroups(GROUPS_USER, 'User', warnForUserGroups)}
+        {this.renderGroups(GROUPS_CONFIG, 'Config', warnForConfigGroups)}
+        {this.renderOthers()}
 
 
         <div className="mt-4 text-center">
         <div className="mt-4 text-center">
           <button type="button" className="btn btn-default mx-1" onClick={this.props.onDiscard}>
           <button type="button" className="btn btn-default mx-1" onClick={this.props.onDiscard}>
-            { t('importer_management.growi_settings.discard') }
+            {t('importer_management:growi_settings.discard')}
           </button>
           </button>
           <button type="button" className="btn btn-primary mx-1" onClick={this.import} disabled={!canImport || isImporting}>
           <button type="button" className="btn btn-primary mx-1" onClick={this.import} disabled={!canImport || isImporting}>
-            { t('importer_management.import') }
+            {t('importer_management:import')}
           </button>
           </button>
         </div>
         </div>
 
 
-        { this.renderConfigurationModal() }
-        { this.renderErrorsViewer() }
+        {this.renderConfigurationModal()}
+        {this.renderErrorsViewer()}
       </>
       </>
     );
     );
   }
   }

+ 2 - 2
src/client/js/components/Admin/ImportData/GrowiArchive/UploadForm.jsx

@@ -51,7 +51,7 @@ class UploadForm extends React.Component {
       <form className="form-horizontal" onSubmit={this.uploadZipFile}>
       <form className="form-horizontal" onSubmit={this.uploadZipFile}>
         <fieldset>
         <fieldset>
           <div className="form-group">
           <div className="form-group">
-            <label htmlFor="file" className="col-xs-3 control-label">{t('importer_management.growi_settings.growi_archive_file')}</label>
+            <label htmlFor="file" className="col-xs-3 control-label">{t('importer_management:growi_settings.growi_archive_file')}</label>
             <div className="col-xs-6">
             <div className="col-xs-6">
               <input
               <input
                 type="file"
                 type="file"
@@ -66,7 +66,7 @@ class UploadForm extends React.Component {
           <div className="form-group">
           <div className="form-group">
             <div className="col-xs-offset-3 col-xs-6">
             <div className="col-xs-offset-3 col-xs-6">
               <button type="submit" className="btn btn-primary" disabled={!this.validateForm()}>
               <button type="submit" className="btn btn-primary" disabled={!this.validateForm()}>
-                {t('importer_management.growi_settings.upload')}
+                {t('importer_management:growi_settings.upload')}
               </button>
               </button>
             </div>
             </div>
           </div>
           </div>

+ 8 - 7
src/client/js/components/Admin/ImportData/GrowiArchiveSection.jsx

@@ -83,9 +83,9 @@ class GrowiArchiveSection extends React.Component {
 
 
     return (
     return (
       <Fragment>
       <Fragment>
-        <h2>{t('importer_management.import_growi_archive')}</h2>
+        <h2>{t('importer_management:import_growi_archive')}</h2>
 
 
-        { this.state.fileName != null ? (
+        {this.state.fileName != null ? (
           <div className="px-4">
           <div className="px-4">
             <ImportForm
             <ImportForm
               fileName={this.state.fileName}
               fileName={this.state.fileName}
@@ -93,11 +93,12 @@ class GrowiArchiveSection extends React.Component {
               onDiscard={this.discardData}
               onDiscard={this.discardData}
             />
             />
           </div>
           </div>
-        ) : (
-          <UploadForm
-            onUpload={this.handleUpload}
-          />
-        )}
+        )
+          : (
+            <UploadForm
+              onUpload={this.handleUpload}
+            />
+          )}
       </Fragment>
       </Fragment>
     );
     );
   }
   }

+ 22 - 22
src/client/js/components/Admin/ImportDataPage.jsx

@@ -143,7 +143,7 @@ class ImportDataPage extends React.Component {
           role="form"
           role="form"
         >
         >
           <fieldset>
           <fieldset>
-            <legend>{ t('importer_management.import_from', { from: 'esa.io' }) }</legend>
+            <legend>{t('importer_management:import_from', { from: 'esa.io' })}</legend>
             <table className="table table-bordered table-mapping">
             <table className="table table-bordered table-mapping">
               <thead>
               <thead>
                 <tr>
                 <tr>
@@ -154,17 +154,17 @@ class ImportDataPage extends React.Component {
               </thead>
               </thead>
               <tbody>
               <tbody>
                 <tr>
                 <tr>
-                  <th>{ t('Article') }</th>
+                  <th>{t('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('Page')}</th>
                 </tr>
                 </tr>
                 <tr>
                 <tr>
-                  <th>{ t('Category') }</th>
+                  <th>{t('Category')}</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 Path') }</th>
+                  <th>{t('Page Path')}</th>
                 </tr>
                 </tr>
                 <tr>
                 <tr>
-                  <th>{ t('User') }</th>
+                  <th>{t('User')}</th>
                   <th></th>
                   <th></th>
                   <th>(TBD)</th>
                   <th>(TBD)</th>
                 </tr>
                 </tr>
@@ -173,7 +173,7 @@ class ImportDataPage extends React.Component {
 
 
             <div className="well well-sm mb-0 small">
             <div className="well well-sm mb-0 small">
               <ul>
               <ul>
-                <li>{ t('importer_management.page_skip') }</li>
+                <li>{t('importer_management:page_skip')}</li>
               </ul>
               </ul>
             </div>
             </div>
 
 
@@ -183,7 +183,7 @@ class ImportDataPage extends React.Component {
 
 
             <div className="form-group">
             <div className="form-group">
               <label htmlFor="settingForm[importer:esa:team_name]" className="col-xs-3 control-label">
               <label htmlFor="settingForm[importer:esa:team_name]" className="col-xs-3 control-label">
-                { t('importer_management.esa_settings.team_name') }
+                {t('importer_management:esa_settings.team_name')}
               </label>
               </label>
               <div className="col-xs-6">
               <div className="col-xs-6">
                 <input className="form-control" type="text" name="esaTeamName" value={esaTeamName} onChange={this.handleInputValue} />
                 <input className="form-control" type="text" name="esaTeamName" value={esaTeamName} onChange={this.handleInputValue} />
@@ -193,7 +193,7 @@ class ImportDataPage extends React.Component {
 
 
             <div className="form-group">
             <div className="form-group">
               <label htmlFor="settingForm[importer:esa:access_token]" className="col-xs-3 control-label">
               <label htmlFor="settingForm[importer:esa:access_token]" className="col-xs-3 control-label">
-                { t('importer_management.esa_settings.access_token') }
+                {t('importer_management:esa_settings.access_token')}
               </label>
               </label>
               <div className="col-xs-6">
               <div className="col-xs-6">
                 <input className="form-control" type="password" name="esaAccessToken" value={esaAccessToken} onChange={this.handleInputValue} />
                 <input className="form-control" type="password" name="esaAccessToken" value={esaAccessToken} onChange={this.handleInputValue} />
@@ -208,7 +208,7 @@ class ImportDataPage extends React.Component {
                   className="btn btn-primary btn-esa"
                   className="btn btn-primary btn-esa"
                   name="Esa"
                   name="Esa"
                   onClick={this.esaHandleSubmit}
                   onClick={this.esaHandleSubmit}
-                  value={t('importer_management.import')}
+                  value={t('importer_management:import')}
                 />
                 />
                 <input type="button" className="btn btn-secondary" onClick={this.esaHandleSubmitUpdate} value={t('Update')} />
                 <input type="button" className="btn btn-secondary" onClick={this.esaHandleSubmitUpdate} value={t('Update')} />
                 <span className="col-xs-offset-1">
                 <span className="col-xs-offset-1">
@@ -218,7 +218,7 @@ class ImportDataPage extends React.Component {
                     id="importFromEsa"
                     id="importFromEsa"
                     className="btn btn-default btn-esa"
                     className="btn btn-default btn-esa"
                     onClick={this.esaHandleSubmitTest}
                     onClick={this.esaHandleSubmitTest}
-                    value={t('importer_management.esa_settings.test_connection')}
+                    value={t('importer_management:esa_settings.test_connection')}
                   />
                   />
                 </span>
                 </span>
 
 
@@ -233,7 +233,7 @@ class ImportDataPage extends React.Component {
           role="form"
           role="form"
         >
         >
           <fieldset>
           <fieldset>
-            <legend>{ t('importer_management.import_from', { from: 'Qiita:Team' }) }</legend>
+            <legend>{t('importer_management:import_from', { from: 'Qiita:Team' })}</legend>
             <table className="table table-bordered table-mapping">
             <table className="table table-bordered table-mapping">
               <thead>
               <thead>
                 <tr>
                 <tr>
@@ -244,22 +244,22 @@ class ImportDataPage extends React.Component {
               </thead>
               </thead>
               <tbody>
               <tbody>
                 <tr>
                 <tr>
-                  <th>{ t('Article') }</th>
+                  <th>{t('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('Page')}</th>
                 </tr>
                 </tr>
                 <tr>
                 <tr>
-                  <th>{ t('Tag')}</th>
+                  <th>{t('Tag')}</th>
                   <th></th>
                   <th></th>
                   <th>-</th>
                   <th>-</th>
                 </tr>
                 </tr>
                 <tr>
                 <tr>
-                  <th>{ t('importer_management.Directory_hierarchy_tag') }</th>
+                  <th>{t('importer_management:Directory_hierarchy_tag')}</th>
                   <th></th>
                   <th></th>
                   <th>(TBD)</th>
                   <th>(TBD)</th>
                 </tr>
                 </tr>
                 <tr>
                 <tr>
-                  <th>{ t('User') }</th>
+                  <th>{t('User')}</th>
                   <th></th>
                   <th></th>
                   <th>(TBD)</th>
                   <th>(TBD)</th>
                 </tr>
                 </tr>
@@ -267,7 +267,7 @@ class ImportDataPage extends React.Component {
             </table>
             </table>
             <div className="well well-sm mb-0 small">
             <div className="well well-sm mb-0 small">
               <ul>
               <ul>
-                <li>{ t('importer_management.page_skip') }</li>
+                <li>{t('importer_management:page_skip')}</li>
               </ul>
               </ul>
             </div>
             </div>
 
 
@@ -276,7 +276,7 @@ class ImportDataPage extends React.Component {
             </div>
             </div>
             <div className="form-group">
             <div className="form-group">
               <label htmlFor="settingForm[importer:qiita:team_name]" className="col-xs-3 control-label">
               <label htmlFor="settingForm[importer:qiita:team_name]" className="col-xs-3 control-label">
-                { t('importer_management.qiita_settings.team_name') }
+                {t('importer_management:qiita_settings.team_name')}
               </label>
               </label>
               <div className="col-xs-6">
               <div className="col-xs-6">
                 <input className="form-control" type="text" name="qiitaTeamName" value={qiitaTeamName} onChange={this.handleInputValue} />
                 <input className="form-control" type="text" name="qiitaTeamName" value={qiitaTeamName} onChange={this.handleInputValue} />
@@ -285,7 +285,7 @@ class ImportDataPage extends React.Component {
 
 
             <div className="form-group">
             <div className="form-group">
               <label htmlFor="settingForm[importer:qiita:access_token]" className="col-xs-3 control-label">
               <label htmlFor="settingForm[importer:qiita:access_token]" className="col-xs-3 control-label">
-                { t('importer_management.qiita_settings.access_token') }
+                {t('importer_management:qiita_settings.access_token')}
               </label>
               </label>
               <div className="col-xs-6">
               <div className="col-xs-6">
                 <input className="form-control" type="password" name="qiitaAccessToken" value={qiitaAccessToken} onChange={this.handleInputValue} />
                 <input className="form-control" type="password" name="qiitaAccessToken" value={qiitaAccessToken} onChange={this.handleInputValue} />
@@ -301,7 +301,7 @@ class ImportDataPage extends React.Component {
                   className="btn btn-primary btn-qiita"
                   className="btn btn-primary btn-qiita"
                   name="Qiita"
                   name="Qiita"
                   onClick={this.qiitaHandleSubmit}
                   onClick={this.qiitaHandleSubmit}
-                  value={t('importer_management.import')}
+                  value={t('importer_management:import')}
                 />
                 />
                 <input type="button" className="btn btn-secondary" onClick={this.qiitaHandleSubmitUpdate} value={t('Update')} />
                 <input type="button" className="btn btn-secondary" onClick={this.qiitaHandleSubmitUpdate} value={t('Update')} />
                 <span className="col-xs-offset-1">
                 <span className="col-xs-offset-1">
@@ -311,7 +311,7 @@ class ImportDataPage extends React.Component {
                     id="importFromQiita"
                     id="importFromQiita"
                     className="btn btn-default btn-qiita"
                     className="btn btn-default btn-qiita"
                     onClick={this.qiitaHandleSubmitTest}
                     onClick={this.qiitaHandleSubmitTest}
-                    value={t('importer_management.qiita_settings.test_connection')}
+                    value={t('importer_management:qiita_settings.test_connection')}
                   />
                   />
                 </span>
                 </span>
 
 

+ 4 - 4
src/client/js/components/Admin/ManageExternalAccount.jsx

@@ -50,15 +50,15 @@ class ManageExternalAccount extends React.Component {
         <p>
         <p>
           <a className="btn btn-default" href="/admin/users">
           <a className="btn btn-default" href="/admin/users">
             <i className="icon-fw ti-arrow-left" aria-hidden="true"></i>
             <i className="icon-fw ti-arrow-left" aria-hidden="true"></i>
-            { t('user_management.back_to_user_management') }
+            {t('user_management:back_to_user_management')}
           </a>
           </a>
         </p>
         </p>
 
 
-        <h2>{ t('user_management.external_account_list') }</h2>
+        <h2>{t('user_management:external_account_list')}</h2>
 
 
-        { pager }
+        {pager}
         <ExternalAccountTable />
         <ExternalAccountTable />
-        { pager }
+        {pager}
 
 
       </Fragment>
       </Fragment>
     );
     );

+ 5 - 5
src/client/js/components/Admin/MarkdownSetting/LineBreakForm.jsx

@@ -26,7 +26,7 @@ class LineBreakForm extends React.Component {
 
 
     try {
     try {
       await this.props.adminMarkDownContainer.updateLineBreakSetting();
       await this.props.adminMarkDownContainer.updateLineBreakSetting();
-      toastSuccess(t('markdown_setting.updated_lineBreak'));
+      toastSuccess(t('toaster:update_successed', { target: 'Line Break' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -38,7 +38,7 @@ class LineBreakForm extends React.Component {
     const { t, adminMarkDownContainer } = this.props;
     const { t, adminMarkDownContainer } = this.props;
     const { isEnabledLinebreaks } = adminMarkDownContainer.state;
     const { isEnabledLinebreaks } = adminMarkDownContainer.state;
 
 
-    const helpLineBreak = { __html: t('markdown_setting.Enable Line Break desc') };
+    const helpLineBreak = { __html: t('markdown_setting:lineBreak_options.enable_lineBreak_desc') };
 
 
     return (
     return (
       <div className="form-group row">
       <div className="form-group row">
@@ -51,7 +51,7 @@ class LineBreakForm extends React.Component {
               onChange={() => { adminMarkDownContainer.setState({ isEnabledLinebreaks: !isEnabledLinebreaks }) }}
               onChange={() => { adminMarkDownContainer.setState({ isEnabledLinebreaks: !isEnabledLinebreaks }) }}
             />
             />
             <label htmlFor="isEnabledLinebreaks">
             <label htmlFor="isEnabledLinebreaks">
-              {t('markdown_setting.Enable Line Break')}
+              {t('markdown_setting:lineBreak_options.enable_lineBreak')}
             </label>
             </label>
           </div>
           </div>
           <p className="help-block" dangerouslySetInnerHTML={helpLineBreak} />
           <p className="help-block" dangerouslySetInnerHTML={helpLineBreak} />
@@ -64,7 +64,7 @@ class LineBreakForm extends React.Component {
     const { t, adminMarkDownContainer } = this.props;
     const { t, adminMarkDownContainer } = this.props;
     const { isEnabledLinebreaksInComments } = adminMarkDownContainer.state;
     const { isEnabledLinebreaksInComments } = adminMarkDownContainer.state;
 
 
-    const helpLineBreakInComment = { __html: t('markdown_setting.Enable Line Break for comment desc') };
+    const helpLineBreakInComment = { __html: t('markdown_setting:lineBreak_options.enable_lineBreak_for_comment_desc') };
 
 
     return (
     return (
       <div className="form-group row">
       <div className="form-group row">
@@ -77,7 +77,7 @@ class LineBreakForm extends React.Component {
               onChange={() => { adminMarkDownContainer.setState({ isEnabledLinebreaksInComments: !isEnabledLinebreaksInComments }) }}
               onChange={() => { adminMarkDownContainer.setState({ isEnabledLinebreaksInComments: !isEnabledLinebreaksInComments }) }}
             />
             />
             <label htmlFor="isEnabledLinebreaksInComments">
             <label htmlFor="isEnabledLinebreaksInComments">
-              {t('markdown_setting.Enable Line Break for comment')}
+              {t('markdown_setting:lineBreak_options.enable_lineBreak')}
             </label>
             </label>
           </div>
           </div>
           <p className="help-block" dangerouslySetInnerHTML={helpLineBreakInComment} />
           <p className="help-block" dangerouslySetInnerHTML={helpLineBreakInComment} />

+ 0 - 115
src/client/js/components/Admin/MarkdownSetting/LineBreakSetting.jsx

@@ -1,115 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-import { withTranslation } from 'react-i18next';
-import loggerFactory from '@alias/logger';
-
-import { createSubscribedElement } from '../../UnstatedUtils';
-import { toastSuccess, toastError } from '../../../util/apiNotification';
-
-import AppContainer from '../../../services/AppContainer';
-
-const logger = loggerFactory('growi:LineBreak');
-
-class LineBreakSetting extends React.Component {
-
-  constructor(props) {
-    super(props);
-
-    const { appContainer } = this.props;
-
-    this.state = {
-      isEnabledLinebreaks: appContainer.config.isEnabledLinebreaks,
-      isEnabledLinebreaksInComments: appContainer.config.isEnabledLinebreaksInComments,
-    };
-    this.onChangeEnableLineBreaks = this.onChangeEnableLineBreaks.bind(this);
-    this.onChangeEnableLineBreaksInComments = this.onChangeEnableLineBreaksInComments.bind(this);
-    this.changeLineBreakSettings = this.changeLineBreakSettings.bind(this);
-  }
-
-
-  onChangeEnableLineBreaks() {
-    this.setState({ isEnabledLinebreaks: !this.state.isEnabledLinebreaks });
-  }
-
-  onChangeEnableLineBreaksInComments() {
-    this.setState({ isEnabledLinebreaksInComments: !this.state.isEnabledLinebreaksInComments });
-  }
-
-  async changeLineBreakSettings() {
-    const { appContainer } = this.props;
-    const params = {
-      isEnabledLinebreaks: this.state.isEnabledLinebreaks,
-      isEnabledLinebreaksInComments: this.state.isEnabledLinebreaksInComments,
-    };
-    try {
-      await appContainer.apiPost('/admin/markdown/lineBreaksSetting', { params });
-      toastSuccess('Success change line braek setting');
-    }
-    catch (err) {
-      toastError(err);
-      logger.error(err);
-    }
-  }
-
-
-  render() {
-    const { t } = this.props;
-
-    return (
-      <React.Fragment>
-        <div className="row my-3">
-          <div className="form-group">
-            <legend>{ t('markdown_setting.line_break_setting') }</legend>
-            <p className="well">{ t('markdown_setting.line_break_setting_desc') }</p>
-            <fieldset className="row">
-              <div className="form-group">
-                <div className="col-xs-4 text-right">
-                  <div className="checkbox checkbox-success" onChange={this.onChangeEnableLineBreaks}>
-                    <input type="checkbox" name="isEnabledLinebreaks" checked={this.state.isEnabledLinebreaks} />
-                    <label>
-                      { t('markdown_setting.Enable Line Break') }
-                    </label>
-                    <p className="help-block">{ t('markdown_setting.Enable Line Break desc') }</p>
-                  </div>
-                </div>
-              </div>
-            </fieldset>
-            <fieldset className="row">
-              <div className="form-group my-3">
-                <div className="col-xs-4 text-right">
-                  <div className="checkbox checkbox-success" onChange={this.onChangeEnableLineBreaksInComments}>
-                    <input type="checkbox" name="isEnabledLinebreaksInComments" checked={this.state.isEnabledLinebreaksInComments} />
-                    <label>
-                      { t('markdown_setting.Enable Line Break for comment') }
-                    </label>
-                    <p className="help-block">{ t('markdown_setting.Enable Line Break for comment desc') }</p>
-                  </div>
-                </div>
-              </div>
-            </fieldset>
-          </div>
-          <div className="form-group my-3">
-            <div className="col-xs-offset-4 col-xs-5">
-              <button type="submit" className="btn btn-primary" onClick={this.changeLineBreakSettings}>{ t('Update') }</button>
-            </div>
-          </div>
-        </div>
-      </React.Fragment>
-    );
-  }
-
-}
-
-/**
- * Wrapper component for using unstated
- */
-const LineBreakSettingWrapper = (props) => {
-  return createSubscribedElement(LineBreakSetting, props, [AppContainer]);
-};
-
-LineBreakSetting.propTypes = {
-  t: PropTypes.func.isRequired, // i18next
-  appContainer: PropTypes.instanceOf(AppContainer).isRequired,
-};
-
-export default withTranslation()(LineBreakSettingWrapper);

+ 6 - 6
src/client/js/components/Admin/MarkdownSetting/MarkDownSetting.jsx

@@ -38,22 +38,22 @@ class MarkdownSetting extends React.Component {
       <React.Fragment>
       <React.Fragment>
         {/* Line Break Setting */}
         {/* Line Break Setting */}
         <div className="row mb-5">
         <div className="row mb-5">
-          <h2 className="border-bottom">{ t('markdown_setting.line_break_setting') }</h2>
-          <p className="well">{ t('markdown_setting.line_break_setting_desc') }</p>
+          <h2 className="border-bottom">{t('markdown_setting:lineBreak_header')}</h2>
+          <p className="well">{t('markdown_setting:lineBreak_desc')}</p>
           <LineBreakForm />
           <LineBreakForm />
         </div>
         </div>
 
 
         {/* Presentation Setting */}
         {/* Presentation Setting */}
         <div className="row mb-5">
         <div className="row mb-5">
-          <h2 className="border-bottom">{ t('markdown_setting.presentation_setting') }</h2>
-          <p className="well">{ t('markdown_setting.presentation_setting_desc') }</p>
+          <h2 className="border-bottom">{t('markdown_setting:presentation_header')}</h2>
+          <p className="well">{t('markdown_setting:presentation_desc')}</p>
           <PresentationForm />
           <PresentationForm />
         </div>
         </div>
 
 
         {/* XSS Setting */}
         {/* XSS Setting */}
         <div className="row mb-5">
         <div className="row mb-5">
-          <h2 className="border-bottom">{ t('markdown_setting.XSS_setting') }</h2>
-          <p className="well">{ t('markdown_setting.XSS_setting_desc') }</p>
+          <h2 className="border-bottom">{t('markdown_setting:xss_header')}</h2>
+          <p className="well">{t('markdown_setting:xss_desc')}</p>
           <XssForm />
           <XssForm />
         </div>
         </div>
       </React.Fragment>
       </React.Fragment>

+ 11 - 11
src/client/js/components/Admin/MarkdownSetting/PresentationForm.jsx

@@ -24,7 +24,7 @@ class PresentationForm extends React.Component {
 
 
     try {
     try {
       await this.props.adminMarkDownContainer.updatePresentationSetting();
       await this.props.adminMarkDownContainer.updatePresentationSetting();
-      toastSuccess(t('markdown_setting.updated_presentation'));
+      toastSuccess(t('toaster:update_successed', { target: 'Presentation' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -41,7 +41,7 @@ class PresentationForm extends React.Component {
       <fieldset className="form-group row my-2">
       <fieldset className="form-group row my-2">
 
 
         <label className="col-xs-3 control-label text-right">
         <label className="col-xs-3 control-label text-right">
-          { t('markdown_setting.Page break setting') }
+          {t('markdown_setting:presentation_options.page_break_setting')}
         </label>
         </label>
 
 
         <div className="col-xs-3 radio radio-primary">
         <div className="col-xs-3 radio radio-primary">
@@ -52,10 +52,10 @@ class PresentationForm extends React.Component {
             onChange={() => adminMarkDownContainer.switchPageBreakSeparator(1)}
             onChange={() => adminMarkDownContainer.switchPageBreakSeparator(1)}
           />
           />
           <label htmlFor="pageBreakOption1">
           <label htmlFor="pageBreakOption1">
-            <p className="font-weight-bold">{ t('markdown_setting.Preset one separator') }</p>
+            <p className="font-weight-bold">{t('markdown_setting:presentation_options.preset_one_separator')}</p>
             <div className="mt-3">
             <div className="mt-3">
-              { t('markdown_setting.Preset one separator desc') }
-              <pre><code>{ t('markdown_setting.Preset one separator value') }</code></pre>
+              {t('markdown_setting:presentation_options.preset_one_separator_desc')}
+              <pre><code>{t('markdown_setting:presentation_options.preset_one_separator_value')}</code></pre>
             </div>
             </div>
           </label>
           </label>
         </div>
         </div>
@@ -68,10 +68,10 @@ class PresentationForm extends React.Component {
             onChange={() => adminMarkDownContainer.switchPageBreakSeparator(2)}
             onChange={() => adminMarkDownContainer.switchPageBreakSeparator(2)}
           />
           />
           <label htmlFor="pageBreakOption2">
           <label htmlFor="pageBreakOption2">
-            <p className="font-weight-bold">{ t('markdown_setting.Preset two separator') }</p>
+            <p className="font-weight-bold">{t('markdown_setting:presentation_options.preset_two_separator')}</p>
             <div className="mt-3">
             <div className="mt-3">
-              { t('markdown_setting.Preset two separator desc') }
-              <pre><code>{ t('markdown_setting.Preset two separator value') }</code></pre>
+              {t('markdown_setting:presentation_options.preset_two_separator_desc')}
+              <pre><code>{t('markdown_setting:presentation_options.preset_two_separator_value')}</code></pre>
             </div>
             </div>
           </label>
           </label>
         </div>
         </div>
@@ -84,9 +84,9 @@ class PresentationForm extends React.Component {
             onChange={() => adminMarkDownContainer.switchPageBreakSeparator(3)}
             onChange={() => adminMarkDownContainer.switchPageBreakSeparator(3)}
           />
           />
           <label htmlFor="pageBreakOption3">
           <label htmlFor="pageBreakOption3">
-            <p className="font-weight-bold">{ t('markdown_setting.Custom separator') }</p>
+            <p className="font-weight-bold">{t('markdown_setting:presentation_options.custom_separator')}</p>
             <div className="mt-3">
             <div className="mt-3">
-              { t('markdown_setting.Custom separator desc') }
+              {t('markdown_setting:presentation_options.custom_separator_desc')}
               <input
               <input
                 className="form-control"
                 className="form-control"
                 defaultValue={pageBreakCustomSeparator}
                 defaultValue={pageBreakCustomSeparator}
@@ -98,7 +98,7 @@ class PresentationForm extends React.Component {
 
 
         <div className="form-group my-3">
         <div className="form-group my-3">
           <div className="col-xs-offset-4 col-xs-5">
           <div className="col-xs-offset-4 col-xs-5">
-            <div className="btn btn-primary" onClick={this.onClickSubmit} disabled={adminMarkDownContainer.state.retrieveError != null}>{ t('Update') }</div>
+            <div className="btn btn-primary" onClick={this.onClickSubmit} disabled={adminMarkDownContainer.state.retrieveError != null}>{t('Update')}</div>
           </div>
           </div>
         </div>
         </div>
 
 

+ 4 - 4
src/client/js/components/Admin/MarkdownSetting/WhiteListInput.jsx

@@ -37,9 +37,9 @@ class WhiteListInput extends React.Component {
       <>
       <>
         <div className="m-t-15">
         <div className="m-t-15">
           <div className="d-flex justify-content-between">
           <div className="d-flex justify-content-between">
-            {t('markdown_setting.Tag names')}
+            {t('markdown_setting:xss_options.tag_names')}
             <p id="btn-import-tags" className="btn btn-xs btn-primary" onClick={this.onClickRecommendTagButton}>
             <p id="btn-import-tags" className="btn btn-xs btn-primary" onClick={this.onClickRecommendTagButton}>
-              {t('markdown_setting.import_recommended', { target: 'Tags' })}
+              {t('markdown_setting:xss_options.import_recommended', { target: 'Tags' })}
             </p>
             </p>
           </div>
           </div>
           <textarea
           <textarea
@@ -54,9 +54,9 @@ class WhiteListInput extends React.Component {
         </div>
         </div>
         <div className="m-t-15">
         <div className="m-t-15">
           <div className="d-flex justify-content-between">
           <div className="d-flex justify-content-between">
-            {t('markdown_setting.Tag attributes')}
+            {t('markdown_setting:xss_options.tag_attributes')}
             <p id="btn-import-tags" className="btn btn-xs btn-primary" onClick={this.onClickRecommendAttrButton}>
             <p id="btn-import-tags" className="btn btn-xs btn-primary" onClick={this.onClickRecommendAttrButton}>
-              {t('markdown_setting.import_recommended', { target: 'Attrs' })}
+              {t('markdown_setting:xss_options.import_recommended', { target: 'Attrs' })}
             </p>
             </p>
           </div>
           </div>
           <textarea
           <textarea

+ 8 - 8
src/client/js/components/Admin/MarkdownSetting/XssForm.jsx

@@ -27,7 +27,7 @@ class XssForm extends React.Component {
 
 
     try {
     try {
       await this.props.adminMarkDownContainer.updateXssSetting();
       await this.props.adminMarkDownContainer.updateXssSetting();
-      toastSuccess(t('markdown_setting.updated_xss'));
+      toastSuccess(t('toaster:update_successed', { target: 'XSS' }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -50,9 +50,9 @@ class XssForm extends React.Component {
             onChange={() => { adminMarkDownContainer.setState({ xssOption: 1 }) }}
             onChange={() => { adminMarkDownContainer.setState({ xssOption: 1 }) }}
           />
           />
           <label htmlFor="xssOption1">
           <label htmlFor="xssOption1">
-            <p className="font-weight-bold">{t('markdown_setting.Ignore all tags')}</p>
+            <p className="font-weight-bold">{t('markdown_setting:xss_options.ignore_all_tags')}</p>
             <div className="m-t-15">
             <div className="m-t-15">
-              {t('markdown_setting.Ignore all tags desc')}
+              {t('markdown_setting:xss_options.ignore_all_tags_desc')}
             </div>
             </div>
           </label>
           </label>
         </div>
         </div>
@@ -66,10 +66,10 @@ class XssForm extends React.Component {
             onChange={() => { adminMarkDownContainer.setState({ xssOption: 2 }) }}
             onChange={() => { adminMarkDownContainer.setState({ xssOption: 2 }) }}
           />
           />
           <label htmlFor="xssOption2">
           <label htmlFor="xssOption2">
-            <p className="font-weight-bold">{t('markdown_setting.Recommended setting')}</p>
+            <p className="font-weight-bold">{t('markdown_setting:xss_options.recommended_setting')}</p>
             <div className="m-t-15">
             <div className="m-t-15">
               <div className="d-flex justify-content-between">
               <div className="d-flex justify-content-between">
-                {t('markdown_setting.Tag names')}
+                {t('markdown_setting:xss_options.tag_names')}
               </div>
               </div>
               <textarea
               <textarea
                 className="form-control xss-list"
                 className="form-control xss-list"
@@ -82,7 +82,7 @@ class XssForm extends React.Component {
             </div>
             </div>
             <div className="m-t-15">
             <div className="m-t-15">
               <div className="d-flex justify-content-between">
               <div className="d-flex justify-content-between">
-                {t('markdown_setting.Tag attributes')}
+                {t('markdown_setting:xss_options.tag_attributes')}
               </div>
               </div>
               <textarea
               <textarea
                 className="form-control xss-list"
                 className="form-control xss-list"
@@ -105,7 +105,7 @@ class XssForm extends React.Component {
             onChange={() => { adminMarkDownContainer.setState({ xssOption: 3 }) }}
             onChange={() => { adminMarkDownContainer.setState({ xssOption: 3 }) }}
           />
           />
           <label htmlFor="xssOption3">
           <label htmlFor="xssOption3">
-            <p className="font-weight-bold">{t('markdown_setting.Custom Whitelist')}</p>
+            <p className="font-weight-bold">{t('markdown_setting:xss_options.custom_whitelist')}</p>
             <WhiteListInput />
             <WhiteListInput />
           </label>
           </label>
         </div>
         </div>
@@ -132,7 +132,7 @@ class XssForm extends React.Component {
                   onChange={adminMarkDownContainer.switchEnableXss}
                   onChange={adminMarkDownContainer.switchEnableXss}
                 />
                 />
                 <label htmlFor="XssEnable">
                 <label htmlFor="XssEnable">
-                  {t('markdown_setting.Enable XSS prevention')}
+                  {t('markdown_setting:xss_options.enable_xss_prevention')}
                 </label>
                 </label>
               </div>
               </div>
             </div>
             </div>

+ 5 - 5
src/client/js/components/Admin/UserGroup/UserGroupCreateForm.jsx

@@ -71,29 +71,29 @@ class UserGroupCreateForm extends React.Component {
           {this.props.isAclEnabled
           {this.props.isAclEnabled
             ? (
             ? (
               <button type="button" data-toggle="collapse" className="btn btn-default" href="#createGroupForm">
               <button type="button" data-toggle="collapse" className="btn btn-default" href="#createGroupForm">
-                { t('user_group_management.create_group') }
+                {t('user_group_management:create_group')}
               </button>
               </button>
             )
             )
             : (
             : (
-              t('user_group_management.deny_create_group')
+              t('user_group_management:deny_create_group')
             )
             )
           }
           }
         </p>
         </p>
         <form onSubmit={this.handleSubmit}>
         <form onSubmit={this.handleSubmit}>
           <div id="createGroupForm" className="collapse">
           <div id="createGroupForm" className="collapse">
             <div className="form-group">
             <div className="form-group">
-              <label htmlFor="name">{ t('user_group_management.group_name') }</label>
+              <label htmlFor="name">{t('user_group_management:group_name')}</label>
               <textarea
               <textarea
                 id="name"
                 id="name"
                 name="name"
                 name="name"
                 className="form-control"
                 className="form-control"
-                placeholder={t('user_group_management.group_example')}
+                placeholder={t('user_group_management:group_example')}
                 value={this.state.name}
                 value={this.state.name}
                 onChange={this.handleChange}
                 onChange={this.handleChange}
               >
               >
               </textarea>
               </textarea>
             </div>
             </div>
-            <button type="submit" className="btn btn-primary" disabled={!this.validateForm()}>{ t('Create') }</button>
+            <button type="submit" className="btn btn-primary" disabled={!this.validateForm()}>{t('Create')}</button>
           </div>
           </div>
         </form>
         </form>
       </div>
       </div>

+ 20 - 8
src/client/js/components/Admin/UserGroup/UserGroupDeleteModal.jsx

@@ -30,13 +30,25 @@ class UserGroupDeleteModal extends React.Component {
 
 
     this.availableOptions = [
     this.availableOptions = [
       {
       {
-        id: 1, actionForPages: this.actionForPages.public, iconClass: 'icon-people', styleClass: '', label: t('user_group_management.publish_pages'),
+        id: 1,
+        actionForPages: this.actionForPages.public,
+        iconClass: 'icon-people',
+        styleClass: '',
+        label: t('user_group_management:delete_modal.publish_pages'),
       },
       },
       {
       {
-        id: 2, actionForPages: this.actionForPages.delete, iconClass: 'icon-trash', styleClass: 'text-danger', label: t('user_group_management.delete_pages'),
+        id: 2,
+        actionForPages: this.actionForPages.delete,
+        iconClass: 'icon-trash',
+        styleClass: 'text-danger',
+        label: t('user_group_management:delete_modal.delete_pages'),
       },
       },
       {
       {
-        id: 3, actionForPages: this.actionForPages.transfer, iconClass: 'icon-options', styleClass: '', label: t('user_group_management.transfer_pages'),
+        id: 3,
+        actionForPages: this.actionForPages.transfer,
+        iconClass: 'icon-options',
+        styleClass: '',
+        label: t('user_group_management:delete_modal.transfer_pages'),
       },
       },
     ];
     ];
 
 
@@ -99,7 +111,7 @@ class UserGroupDeleteModal extends React.Component {
         value={this.state.actionName}
         value={this.state.actionName}
         onChange={this.handleActionChange}
         onChange={this.handleActionChange}
       >
       >
-        <option value="" disabled>{t('user_group_management.choose_action')}</option>
+        <option value="" disabled>{t('user_group_management:delete_modal.dropdown_desc')}</option>
         {optoins}
         {optoins}
       </select>
       </select>
     );
     );
@@ -117,7 +129,7 @@ class UserGroupDeleteModal extends React.Component {
       return <option key={group._id} value={group._id} data-content={dataContent}>{this.xss.process(group.name)}</option>;
       return <option key={group._id} value={group._id} data-content={dataContent}>{this.xss.process(group.name)}</option>;
     });
     });
 
 
-    const defaultOptionText = groups.length === 0 ? t('user_group_management.no_groups') : t('user_group_management.select_group');
+    const defaultOptionText = groups.length === 0 ? t('user_group_management:delete_modal.no_groups') : t('user_group_management:delete_modal.select_group');
 
 
     return (
     return (
       <select
       <select
@@ -152,15 +164,15 @@ class UserGroupDeleteModal extends React.Component {
       <Modal show={this.props.isShow} onHide={this.onHide}>
       <Modal show={this.props.isShow} onHide={this.onHide}>
         <Modal.Header className="modal-header bg-danger" closeButton>
         <Modal.Header className="modal-header bg-danger" closeButton>
           <Modal.Title>
           <Modal.Title>
-            <i className="icon icon-fire"></i> {t('user_group_management.delete_group')}
+            <i className="icon icon-fire"></i> {t('user_group_management:delete_modal.header')}
           </Modal.Title>
           </Modal.Title>
         </Modal.Header>
         </Modal.Header>
         <Modal.Body>
         <Modal.Body>
           <div>
           <div>
-            <span className="font-weight-bold">{t('user_group_management.group_name')}</span> : &quot;{this.props.deleteUserGroup.name}&quot;
+            <span className="font-weight-bold">{t('user_group_management:group_name')}</span> : &quot;{this.props.deleteUserGroup.name}&quot;
           </div>
           </div>
           <div className="text-danger mt-5">
           <div className="text-danger mt-5">
-            {t('user_group_management.group_and_pages_not_retrievable')}
+            {t('user_group_management:delete_modal.desc')}
           </div>
           </div>
         </Modal.Body>
         </Modal.Body>
         <Modal.Footer>
         <Modal.Footer>

+ 6 - 6
src/client/js/components/Admin/UserGroup/UserGroupTable.jsx

@@ -43,14 +43,14 @@ class UserGroupTable extends React.Component {
 
 
     return (
     return (
       <Fragment>
       <Fragment>
-        <h2>{t('user_group_management.group_list')}</h2>
+        <h2>{t('user_group_management:group_list')}</h2>
 
 
         <table className="table table-bordered table-user-list">
         <table className="table table-bordered table-user-list">
           <thead>
           <thead>
             <tr>
             <tr>
-              <th>{ t('Name') }</th>
-              <th>{ t('User') }</th>
-              <th width="100px">{ t('Created') }</th>
+              <th>{t('Name')}</th>
+              <th>{t('User')}</th>
+              <th width="100px">{t('Created')}</th>
               <th width="70px"></th>
               <th width="70px"></th>
             </tr>
             </tr>
           </thead>
           </thead>
@@ -84,13 +84,13 @@ class UserGroupTable extends React.Component {
                           <ul className="dropdown-menu" role="menu">
                           <ul className="dropdown-menu" role="menu">
                             <li>
                             <li>
                               <a href={`/admin/user-group-detail/${group._id}`}>
                               <a href={`/admin/user-group-detail/${group._id}`}>
-                                <i className="icon-fw icon-note"></i> { t('Edit') }
+                                <i className="icon-fw icon-note"></i> {t('Edit')}
                               </a>
                               </a>
                             </li>
                             </li>
 
 
                             <li>
                             <li>
                               <a href="#" onClick={this.onDelete} data-user-group-id={group._id}>
                               <a href="#" onClick={this.onDelete} data-user-group-id={group._id}>
-                                <i className="icon-fw icon-fire text-danger"></i> { t('Delete') }
+                                <i className="icon-fw icon-fire text-danger"></i> {t('Delete')}
                               </a>
                               </a>
                             </li>
                             </li>
 
 

+ 1 - 1
src/client/js/components/Admin/UserGroupDetail/CheckBoxForSerchUserOption.jsx

@@ -17,7 +17,7 @@ class CheckBoxForSerchUserOption extends React.Component {
           onChange={this.props.onChange}
           onChange={this.props.onChange}
         />
         />
         <label className="text-capitalize form-check-label ml-3" htmlFor={`isAlso${option}Searched`}>
         <label className="text-capitalize form-check-label ml-3" htmlFor={`isAlso${option}Searched`}>
-          {t('user_group_management.enable_option', { option })}
+          {t('user_group_management:add_modal.enable_option', { option })}
         </label>
         </label>
       </div>
       </div>
     );
     );

+ 1 - 1
src/client/js/components/Admin/UserGroupDetail/RadioButtonForSerchUserOption.jsx

@@ -17,7 +17,7 @@ class RadioButtonForSerchUserOption extends React.Component {
           onChange={this.props.onChange}
           onChange={this.props.onChange}
         />
         />
         <label className="text-capitalize form-check-label ml-3" htmlFor={`${searchType}Match`}>
         <label className="text-capitalize form-check-label ml-3" htmlFor={`${searchType}Match`}>
-          {t(`user_group_management.${searchType}_match`)}
+          {t(`user_group_management:add_modal.${searchType}_match`)}
         </label>
         </label>
       </div>
       </div>
     );
     );

+ 3 - 3
src/client/js/components/Admin/UserGroupDetail/UserGroupDetailPage.jsx

@@ -18,15 +18,15 @@ class UserGroupDetailPage extends React.Component {
       <div>
       <div>
         <a href="/admin/user-groups" className="btn btn-default">
         <a href="/admin/user-groups" className="btn btn-default">
           <i className="icon-fw ti-arrow-left" aria-hidden="true"></i>
           <i className="icon-fw ti-arrow-left" aria-hidden="true"></i>
-          {t('user_group_management.back_to_list')}
+          {t('user_group_management:back_to_list')}
         </a>
         </a>
         <div className="m-t-20 form-box">
         <div className="m-t-20 form-box">
           <UserGroupEditForm />
           <UserGroupEditForm />
         </div>
         </div>
-        <legend className="m-t-20">{ t('user_group_management.user_list') }</legend>
+        <legend className="m-t-20">{t('user_group_management:user_list')}</legend>
         <UserGroupUserTable />
         <UserGroupUserTable />
         <UserGroupUserModal />
         <UserGroupUserModal />
-        <legend className="m-t-20">{ t('Page') }</legend>
+        <legend className="m-t-20">{t('Page')}</legend>
         <div className="page-list">
         <div className="page-list">
           <UserGroupPageList />
           <UserGroupPageList />
         </div>
         </div>

+ 4 - 4
src/client/js/components/Admin/UserGroupDetail/UserGroupEditForm.jsx

@@ -60,15 +60,15 @@ class UserGroupEditForm extends React.Component {
     return (
     return (
       <form className="form-horizontal" onSubmit={this.handleSubmit}>
       <form className="form-horizontal" onSubmit={this.handleSubmit}>
         <fieldset>
         <fieldset>
-          <legend>{ t('user_group_management.basic_info') }</legend>
+          <legend>{t('user_group_management:basic_info')}</legend>
           <div className="form-group">
           <div className="form-group">
-            <label htmlFor="name" className="col-sm-2 control-label">{ t('Name') }</label>
+            <label htmlFor="name" className="col-sm-2 control-label">{t('Name')}</label>
             <div className="col-sm-4">
             <div className="col-sm-4">
               <input className="form-control" type="text" name="name" value={this.state.name} onChange={this.changeUserGroupName} />
               <input className="form-control" type="text" name="name" value={this.state.name} onChange={this.changeUserGroupName} />
             </div>
             </div>
           </div>
           </div>
           <div className="form-group">
           <div className="form-group">
-            <label className="col-sm-2 control-label">{ t('Created') }</label>
+            <label className="col-sm-2 control-label">{t('Created')}</label>
             <div className="col-sm-4">
             <div className="col-sm-4">
               <input
               <input
                 type="text"
                 type="text"
@@ -80,7 +80,7 @@ class UserGroupEditForm extends React.Component {
           </div>
           </div>
           <div className="form-group">
           <div className="form-group">
             <div className="col-sm-offset-2 col-sm-10">
             <div className="col-sm-offset-2 col-sm-10">
-              <button type="submit" className="btn btn-primary" disabled={!this.validateForm()}>{ t('Update') }</button>
+              <button type="submit" className="btn btn-primary" disabled={!this.validateForm()}>{t('Update')}</button>
             </div>
             </div>
           </div>
           </div>
         </fieldset>
         </fieldset>

+ 1 - 1
src/client/js/components/Admin/UserGroupDetail/UserGroupPageList.jsx

@@ -58,7 +58,7 @@ class UserGroupPageList extends React.Component {
         <ul className="page-list-ul page-list-ul-flat">
         <ul className="page-list-ul page-list-ul-flat">
           {this.state.currentPages.map((page) => { return <Page key={page._id} page={page} /> })}
           {this.state.currentPages.map((page) => { return <Page key={page._id} page={page} /> })}
         </ul>
         </ul>
-        {userGroupDetailContainer.state.relatedPages.length === 0 ? <p>{ t('user_group_management.no_pages') }</p> : null}
+        {userGroupDetailContainer.state.relatedPages.length === 0 ? <p>{t('user_group_management:no_pages')}</p> : null}
         <PaginationWrapper
         <PaginationWrapper
           activePage={this.state.activePage}
           activePage={this.state.activePage}
           changePage={this.handlePageChange}
           changePage={this.handlePageChange}

+ 2 - 2
src/client/js/components/Admin/UserGroupDetail/UserGroupUserModal.jsx

@@ -18,13 +18,13 @@ class UserGroupUserModal extends React.Component {
     return (
     return (
       <Modal show={userGroupDetailContainer.state.isUserGroupUserModalOpen} onHide={userGroupDetailContainer.closeUserGroupUserModal}>
       <Modal show={userGroupDetailContainer.state.isUserGroupUserModalOpen} onHide={userGroupDetailContainer.closeUserGroupUserModal}>
         <Modal.Header closeButton>
         <Modal.Header closeButton>
-          <Modal.Title>{t('user_group_management.add_user')}</Modal.Title>
+          <Modal.Title>{t('user_group_management:add_modal.add_user')}</Modal.Title>
         </Modal.Header>
         </Modal.Header>
         <Modal.Body>
         <Modal.Body>
           <div className="p-3">
           <div className="p-3">
             <UserGroupUserFormByInput />
             <UserGroupUserFormByInput />
           </div>
           </div>
-          <h2 className="border-bottom">{t('user_group_management.search_option')}</h2>
+          <h2 className="border-bottom">{t('user_group_management:add_modal.search_option')}</h2>
           <div className="row mt-4">
           <div className="row mt-4">
             <div className="col-xs-6">
             <div className="col-xs-6">
               <div className="mb-5">
               <div className="mb-5">

+ 33 - 33
src/client/js/components/Admin/UserGroupDetail/UserGroupUserTable.jsx

@@ -39,46 +39,46 @@ class UserGroupUserTable extends React.Component {
           <tr>
           <tr>
             <th width="100px">#</th>
             <th width="100px">#</th>
             <th>
             <th>
-              { t('username') }
+              {t('username')}
             </th>
             </th>
-            <th>{ t('Name') }</th>
-            <th width="100px">{ t('Created') }</th>
-            <th width="160px">{ t('Last_Login')}</th>
+            <th>{t('Name')}</th>
+            <th width="100px">{t('Created')}</th>
+            <th width="160px">{t('Last_Login')}</th>
             <th width="70px"></th>
             <th width="70px"></th>
           </tr>
           </tr>
         </thead>
         </thead>
         <tbody>
         <tbody>
           {userGroupDetailContainer.state.userGroupRelations.map((sRelation) => {
           {userGroupDetailContainer.state.userGroupRelations.map((sRelation) => {
-              const { relatedUser } = sRelation;
+            const { relatedUser } = sRelation;
 
 
-              return (
-                <tr key={sRelation._id}>
-                  <td>
-                    <UserPicture user={relatedUser} className="picture img-circle" />
-                  </td>
-                  <td>
-                    <strong>{relatedUser.username}</strong>
-                  </td>
-                  <td>{relatedUser.name}</td>
-                  <td>{relatedUser.createdAt ? dateFnsFormat(new Date(relatedUser.createdAt), 'yyyy-MM-dd') : ''}</td>
-                  <td>{relatedUser.lastLoginAt ? dateFnsFormat(new Date(relatedUser.lastLoginAt), 'yyyy-MM-dd HH:mm:ss') : ''}</td>
-                  <td>
-                    <div className="btn-group admin-user-menu">
-                      <button type="button" className="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
-                        <i className="icon-settings"></i> <span className="caret"></span>
-                      </button>
-                      <ul className="dropdown-menu" role="menu">
-                        <li>
-                          <a onClick={() => { return this.removeUser(relatedUser.username) }}>
-                            <i className="icon-fw icon-user-unfollow"></i> { t('user_group_management.remove_from_group')}
-                          </a>
-                        </li>
-                      </ul>
-                    </div>
-                  </td>
-                </tr>
-              );
-            })}
+            return (
+              <tr key={sRelation._id}>
+                <td>
+                  <UserPicture user={relatedUser} className="picture img-circle" />
+                </td>
+                <td>
+                  <strong>{relatedUser.username}</strong>
+                </td>
+                <td>{relatedUser.name}</td>
+                <td>{relatedUser.createdAt ? dateFnsFormat(new Date(relatedUser.createdAt), 'yyyy-MM-dd') : ''}</td>
+                <td>{relatedUser.lastLoginAt ? dateFnsFormat(new Date(relatedUser.lastLoginAt), 'yyyy-MM-dd HH:mm:ss') : ''}</td>
+                <td>
+                  <div className="btn-group admin-user-menu">
+                    <button type="button" className="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
+                      <i className="icon-settings"></i> <span className="caret"></span>
+                    </button>
+                    <ul className="dropdown-menu" role="menu">
+                      <li>
+                        <a onClick={() => { return this.removeUser(relatedUser.username) }}>
+                          <i className="icon-fw icon-user-unfollow"></i> {t('user_group_management:remove_from_group')}
+                        </a>
+                      </li>
+                    </ul>
+                  </div>
+                </td>
+              </tr>
+            );
+          })}
 
 
           <tr>
           <tr>
             <td></td>
             <td></td>

+ 2 - 2
src/client/js/components/Admin/UserManagement.jsx

@@ -57,11 +57,11 @@ class UserManagement extends React.Component {
           <InviteUserControl />
           <InviteUserControl />
           <a className="btn btn-default btn-outline ml-2" href="/admin/users/external-accounts">
           <a className="btn btn-default btn-outline ml-2" href="/admin/users/external-accounts">
             <i className="icon-user-follow" aria-hidden="true"></i>
             <i className="icon-user-follow" aria-hidden="true"></i>
-            { t('user_management.external_account') }
+            {t('user_management:external_account')}
           </a>
           </a>
         </p>
         </p>
 
 
-        <h2>{ t('User_Management') }</h2>
+        <h2>{t('User_Management')}</h2>
 
 
         {pager}
         {pager}
         <UserTable />
         <UserTable />

+ 12 - 12
src/client/js/components/Admin/Users/ExternalAccountTable.jsx

@@ -26,7 +26,7 @@ class ExternalAccountTable extends React.Component {
 
 
     try {
     try {
       const accountId = await this.props.adminExternalAccountsContainer.removeExternalAccountById(externalAccountId);
       const accountId = await this.props.adminExternalAccountsContainer.removeExternalAccountById(externalAccountId);
-      toastSuccess(t('user_management.remove_external_user_success', { accountId }));
+      toastSuccess(t('toaster:remove_external_user_success', { accountId }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -41,11 +41,11 @@ class ExternalAccountTable extends React.Component {
         <table className="table table-bordered table-user-list">
         <table className="table table-bordered table-user-list">
           <thead>
           <thead>
             <tr>
             <tr>
-              <th width="120px">{ t('user_management.authentication_provider') }</th>
+              <th width="120px">{t('user_management:authentication_provider')}</th>
               <th><code>accountId</code></th>
               <th><code>accountId</code></th>
-              <th>{ t('user_management.related_username') }<code>username</code></th>
+              <th>{t('user_management:related_username')}<code>username</code></th>
               <th>
               <th>
-                { t('user_management.password_setting') }
+                {t('user_management:password_setting')}
                 <div
                 <div
                   className="text-muted"
                   className="text-muted"
                   data-toggle="popover"
                   data-toggle="popover"
@@ -55,14 +55,14 @@ class ExternalAccountTable extends React.Component {
                   role="button"
                   role="button"
                   data-animation="false"
                   data-animation="false"
                   data-html="true"
                   data-html="true"
-                  data-content={t('user_management.password_setting_help')}
+                  data-content={t('user_management:password_setting_help')}
                 >
                 >
                   <small>
                   <small>
                     <i className="icon-question" aria-hidden="true"></i>
                     <i className="icon-question" aria-hidden="true"></i>
                   </small>
                   </small>
                 </div>
                 </div>
               </th>
               </th>
-              <th width="100px">{ t('Created') }</th>
+              <th width="100px">{t('Created')}</th>
               <th width="70px"></th>
               <th width="70px"></th>
             </tr>
             </tr>
           </thead>
           </thead>
@@ -75,18 +75,18 @@ class ExternalAccountTable extends React.Component {
                     <strong>{ea.accountId}</strong>
                     <strong>{ea.accountId}</strong>
                   </td>
                   </td>
                   <td>
                   <td>
-                    <strong>{ ea.user.username }</strong>
+                    <strong>{ea.user.username}</strong>
                   </td>
                   </td>
                   <td>
                   <td>
-                    { ea.user.password
+                    {ea.user.password
                       ? (
                       ? (
                         <span className="label label-info">
                         <span className="label label-info">
-                          { t('user_management.set') }
+                          {t('user_management:set')}
                         </span>
                         </span>
                       )
                       )
                       : (
                       : (
                         <span className="label label-warning">
                         <span className="label label-warning">
-                          { t('user_management.unset') }
+                          {t('user_management:unset')}
                         </span>
                         </span>
                       )
                       )
                     }
                     }
@@ -98,10 +98,10 @@ class ExternalAccountTable extends React.Component {
                         <i className="icon-settings"></i> <span className="caret"></span>
                         <i className="icon-settings"></i> <span className="caret"></span>
                       </button>
                       </button>
                       <ul className="dropdown-menu" role="menu">
                       <ul className="dropdown-menu" role="menu">
-                        <li className="dropdown-header">{ t('user_management.edit_menu') }</li>
+                        <li className="dropdown-header">{t('user_management:user_table.edit_menu')}</li>
                         <li>
                         <li>
                           <a onClick={() => { return this.removeExtenalAccount(ea._id) }}>
                           <a onClick={() => { return this.removeExtenalAccount(ea._id) }}>
-                            <i className="icon-fw icon-fire text-danger"></i> { t('Delete') }
+                            <i className="icon-fw icon-fire text-danger"></i> {t('Delete')}
                           </a>
                           </a>
                         </li>
                         </li>
                       </ul>
                       </ul>

+ 2 - 2
src/client/js/components/Admin/Users/GiveAdminButton.jsx

@@ -20,7 +20,7 @@ class GiveAdminButton extends React.Component {
 
 
     try {
     try {
       const username = await this.props.adminUsersContainer.giveUserAdmin(this.props.user._id);
       const username = await this.props.adminUsersContainer.giveUserAdmin(this.props.user._id);
-      toastSuccess(t('user_management.give_user_admin', { username }));
+      toastSuccess(t('toaster:give_user_admin', { username }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -32,7 +32,7 @@ class GiveAdminButton extends React.Component {
 
 
     return (
     return (
       <a className="px-4" onClick={() => { this.onClickGiveAdminBtn() }}>
       <a className="px-4" onClick={() => { this.onClickGiveAdminBtn() }}>
-        <i className="icon-fw icon-user-following"></i> { t('user_management.give_admin_access') }
+        <i className="icon-fw icon-user-following"></i> {t('user_management:user_table.give_admin_access')}
       </a>
       </a>
     );
     );
   }
   }

+ 1 - 1
src/client/js/components/Admin/Users/InviteUserControl.jsx

@@ -15,7 +15,7 @@ class InviteUserControl extends React.Component {
     return (
     return (
       <Fragment>
       <Fragment>
         <button type="button" className="btn btn-default" onClick={adminUsersContainer.toggleUserInviteModal}>
         <button type="button" className="btn btn-default" onClick={adminUsersContainer.toggleUserInviteModal}>
-          { t('user_management.invite_users') }
+          {t('user_management:invite_users')}
         </button>
         </button>
         <UserInviteModal />
         <UserInviteModal />
       </Fragment>
       </Fragment>

+ 8 - 8
src/client/js/components/Admin/Users/PasswordResetModal.jsx

@@ -41,12 +41,12 @@ class PasswordResetModal extends React.Component {
 
 
     return (
     return (
       <div>
       <div>
-        <p className="alert alert-danger">{ t('user_management.password_reset_message') }</p>
+        <p className="alert alert-danger">{t('user_management:reset_password_modal.password_reset_message')}</p>
         <p>
         <p>
-          { t('user_management.target_user') }: <code>{ user.email }</code>
+          {t('user_management:reset_password_modal.target_user')}: <code>{user.email}</code>
         </p>
         </p>
         <p>
         <p>
-          { t('user_management.new_password') }: <code>{ this.state.temporaryPassword }</code>
+          {t('user_management:reset_password_modal.new_password')}: <code>{this.state.temporaryPassword}</code>
         </p>
         </p>
       </div>
       </div>
     );
     );
@@ -59,14 +59,14 @@ class PasswordResetModal extends React.Component {
     return (
     return (
       <div>
       <div>
         <p>
         <p>
-          { t('user_management.password_never_seen') }<br />
-          <span className="text-danger">{ t('user_management.send_new_password') }</span>
+          {t('user_management:reset_password_modal.password_never_seen')}<br />
+          <span className="text-danger">{t('user_management:reset_password_modal.send_new_password')}</span>
         </p>
         </p>
         <p>
         <p>
-          { t('user_management.target_user') }: <code>{ user.email }</code>
+          {t('user_management:reset_password_modal.target_user')}: <code>{user.email}</code>
         </p>
         </p>
         <button type="submit" className="btn btn-primary" onClick={this.resetPassword}>
         <button type="submit" className="btn btn-primary" onClick={this.resetPassword}>
-          { t('user_management.reset_password')}
+          {t('user_management:reset_password')}
         </button>
         </button>
       </div>
       </div>
     );
     );
@@ -88,7 +88,7 @@ class PasswordResetModal extends React.Component {
       <Modal show={adminUsersContainer.state.isPasswordResetModalShown} onHide={adminUsersContainer.hidePasswordResetModal}>
       <Modal show={adminUsersContainer.state.isPasswordResetModalShown} onHide={adminUsersContainer.hidePasswordResetModal}>
         <Modal.Header className="modal-header" closeButton>
         <Modal.Header className="modal-header" closeButton>
           <Modal.Title>
           <Modal.Title>
-            { t('user_management.reset_password') }
+            {t('user_management:reset_password')}
           </Modal.Title>
           </Modal.Title>
         </Modal.Header>
         </Modal.Header>
         <Modal.Body>
         <Modal.Body>

+ 4 - 4
src/client/js/components/Admin/Users/RemoveAdminButton.jsx

@@ -20,7 +20,7 @@ class RemoveAdminButton extends React.Component {
 
 
     try {
     try {
       const username = await this.props.adminUsersContainer.removeUserAdmin(this.props.user._id);
       const username = await this.props.adminUsersContainer.removeUserAdmin(this.props.user._id);
-      toastSuccess(t('user_management.remove_user_admin', { username }));
+      toastSuccess(t('toaster:remove_user_admin', { username }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -33,7 +33,7 @@ class RemoveAdminButton extends React.Component {
 
 
     return (
     return (
       <a className="px-4" onClick={() => { this.onClickRemoveAdminBtn() }}>
       <a className="px-4" onClick={() => { this.onClickRemoveAdminBtn() }}>
-        <i className="icon-fw icon-user-unfollow"></i> { t('user_management.remove_admin_access') }
+        <i className="icon-fw icon-user-unfollow"></i> {t('user_management:user_table.remove_admin_access')}
       </a>
       </a>
     );
     );
   }
   }
@@ -43,8 +43,8 @@ class RemoveAdminButton extends React.Component {
 
 
     return (
     return (
       <div className="px-4">
       <div className="px-4">
-        <i className="icon-fw icon-user-unfollow mb-2"></i>{ t('user_management.remove_admin_access') }
-        <p className="alert alert-danger">{ t('user_management.cannot_remove') }</p>
+        <i className="icon-fw icon-user-unfollow mb-2"></i>{t('user_management:user_table.remove_admin_access')}
+        <p className="alert alert-danger">{t('user_management:user_table.cannot_remove')}</p>
       </div>
       </div>
     );
     );
   }
   }

+ 2 - 2
src/client/js/components/Admin/Users/StatusActivateButton.jsx

@@ -20,7 +20,7 @@ class StatusActivateButton extends React.Component {
 
 
     try {
     try {
       const username = await this.props.adminUsersContainer.activateUser(this.props.user._id);
       const username = await this.props.adminUsersContainer.activateUser(this.props.user._id);
-      toastSuccess(t('user_management.activate_user_success', { username }));
+      toastSuccess(t('toaster:activate_user_success', { username }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -32,7 +32,7 @@ class StatusActivateButton extends React.Component {
 
 
     return (
     return (
       <a className="px-4" onClick={() => { this.onClickAcceptBtn() }}>
       <a className="px-4" onClick={() => { this.onClickAcceptBtn() }}>
-        <i className="icon-fw icon-user-following"></i> { t('user_management.accept') }
+        <i className="icon-fw icon-user-following"></i> {t('user_management:user_table.accept')}
       </a>
       </a>
     );
     );
   }
   }

+ 4 - 4
src/client/js/components/Admin/Users/StatusSuspendedButton.jsx

@@ -20,7 +20,7 @@ class StatusSuspendedButton extends React.Component {
 
 
     try {
     try {
       const username = await this.props.adminUsersContainer.deactivateUser(this.props.user._id);
       const username = await this.props.adminUsersContainer.deactivateUser(this.props.user._id);
-      toastSuccess(t('user_management.deactivate_user_success', { username }));
+      toastSuccess(t('toaster:deactivate_user_success', { username }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -32,7 +32,7 @@ class StatusSuspendedButton extends React.Component {
 
 
     return (
     return (
       <a className="px-4" onClick={() => { this.onClickDeactiveBtn() }}>
       <a className="px-4" onClick={() => { this.onClickDeactiveBtn() }}>
-        <i className="icon-fw icon-ban"></i> { t('user_management.deactivate_account') }
+        <i className="icon-fw icon-ban"></i> {t('user_management:user_table.deactivate_account')}
       </a>
       </a>
     );
     );
   }
   }
@@ -42,8 +42,8 @@ class StatusSuspendedButton extends React.Component {
 
 
     return (
     return (
       <div className="px-4">
       <div className="px-4">
-        <i className="icon-fw icon-ban mb-2"></i>{ t('user_management.deactivate_account') }
-        <p className="alert alert-danger">{ t('user_management.your_own') }</p>
+        <i className="icon-fw icon-ban mb-2"></i>{t('user_management:user_table.deactivate_account')}
+        <p className="alert alert-danger">{t('user_management:user_table.your_own')}</p>
       </div>
       </div>
     );
     );
   }
   }

+ 12 - 12
src/client/js/components/Admin/Users/UserInviteModal.jsx

@@ -44,7 +44,7 @@ class UserInviteModal extends React.Component {
 
 
     return (
     return (
       <>
       <>
-        <label> { t('user_management.emails') }</label>
+        <label> {t('user_management:invite_modal.emails')}</label>
         <textarea
         <textarea
           className="form-control"
           className="form-control"
           placeholder="e.g. user@growi.org"
           placeholder="e.g. user@growi.org"
@@ -52,7 +52,7 @@ class UserInviteModal extends React.Component {
           value={this.state.emailInputValue}
           value={this.state.emailInputValue}
           onChange={this.handleInput}
           onChange={this.handleInput}
         />
         />
-        {!this.validEmail() && <p className="m-2 text-danger">{ t('user_management.valid_email') }</p>}
+        {!this.validEmail() && <p className="m-2 text-danger">{t('user_management:invite_modal.valid_email')}</p>}
       </>
       </>
     );
     );
   }
   }
@@ -63,8 +63,8 @@ class UserInviteModal extends React.Component {
 
 
     return (
     return (
       <>
       <>
-        <p>{t('user_management.temporary_password')}</p>
-        <p>{t('user_management.send_new_password')}</p>
+        <p>{t('user_management:invite_modal.temporary_password')}</p>
+        <p>{t('user_management:invite_modal.send_new_password')}</p>
         {invitedEmailList.createdUserList.length > 0 && this.renderCreatedEmail(invitedEmailList.createdUserList)}
         {invitedEmailList.createdUserList.length > 0 && this.renderCreatedEmail(invitedEmailList.createdUserList)}
         {invitedEmailList.existingEmailList.length > 0 && this.renderExistingEmail(invitedEmailList.existingEmailList)}
         {invitedEmailList.existingEmailList.length > 0 && this.renderExistingEmail(invitedEmailList.existingEmailList)}
       </>
       </>
@@ -79,12 +79,12 @@ class UserInviteModal extends React.Component {
         <div className="checkbox checkbox-success text-left" onChange={this.handleCheckBox} style={{ flex: 1 }}>
         <div className="checkbox checkbox-success text-left" onChange={this.handleCheckBox} style={{ flex: 1 }}>
           <input type="checkbox" id="sendEmail" className="form-check-input" name="sendEmail" defaultChecked={this.state.sendEmail} />
           <input type="checkbox" id="sendEmail" className="form-check-input" name="sendEmail" defaultChecked={this.state.sendEmail} />
           <label htmlFor="sendEmail">
           <label htmlFor="sendEmail">
-            { t('user_management.invite_thru_email') }
+            {t('user_management:invite_modal.invite_thru_email')}
           </label>
           </label>
         </div>
         </div>
         <div>
         <div>
           <Button bsStyle="danger" className="fcbtn btn btn-xs btn-danger btn-outline btn-rounded" onClick={this.onToggleModal}>
           <Button bsStyle="danger" className="fcbtn btn btn-xs btn-danger btn-outline btn-rounded" onClick={this.onToggleModal}>
-          Cancel
+            Cancel
           </Button>
           </Button>
           <Button
           <Button
             bsStyle="primary"
             bsStyle="primary"
@@ -92,7 +92,7 @@ class UserInviteModal extends React.Component {
             onClick={this.handleSubmit}
             onClick={this.handleSubmit}
             disabled={!this.validEmail()}
             disabled={!this.validEmail()}
           >
           >
-          Done
+            Done
           </Button>
           </Button>
         </div>
         </div>
       </>
       </>
@@ -105,7 +105,7 @@ class UserInviteModal extends React.Component {
     return (
     return (
       <>
       <>
         <label className="mr-3 text-left text-danger" style={{ flex: 1 }}>
         <label className="mr-3 text-left text-danger" style={{ flex: 1 }}>
-          {t('user_management.send_temporary_password')}
+          {t('user_management:invite_modal.send_temporary_password')}
         </label>
         </label>
         <Button
         <Button
           bsStyle="primary"
           bsStyle="primary"
@@ -138,7 +138,7 @@ class UserInviteModal extends React.Component {
 
 
     return (
     return (
       <>
       <>
-        <p className="text-warning">{ t('user_management.existing_email') }</p>
+        <p className="text-warning">{t('user_management:existing_email')}</p>
         <ul>
         <ul>
           {emailList.map((user) => {
           {emailList.map((user) => {
             return (
             return (
@@ -188,16 +188,16 @@ class UserInviteModal extends React.Component {
       <Modal show={adminUsersContainer.state.isUserInviteModalShown} onHide={this.onToggleModal}>
       <Modal show={adminUsersContainer.state.isUserInviteModalShown} onHide={this.onToggleModal}>
         <Modal.Header className="modal-header" closeButton>
         <Modal.Header className="modal-header" closeButton>
           <Modal.Title>
           <Modal.Title>
-            { t('user_management.invite_users') }
+            {t('user_management:invite_users')}
           </Modal.Title>
           </Modal.Title>
         </Modal.Header>
         </Modal.Header>
         <Modal.Body>
         <Modal.Body>
           {invitedEmailList == null ? this.renderModalBody()
           {invitedEmailList == null ? this.renderModalBody()
-           : this.renderCreatedModalBody()}
+            : this.renderCreatedModalBody()}
         </Modal.Body>
         </Modal.Body>
         <Modal.Footer className="d-flex">
         <Modal.Footer className="d-flex">
           {invitedEmailList == null ? this.renderModalFooter()
           {invitedEmailList == null ? this.renderModalFooter()
-           : this.renderCreatedModalFooter()}
+            : this.renderCreatedModalFooter()}
         </Modal.Footer>
         </Modal.Footer>
       </Modal>
       </Modal>
     );
     );

+ 4 - 4
src/client/js/components/Admin/Users/UserMenu.jsx

@@ -33,10 +33,10 @@ class UserMenu extends React.Component {
 
 
     return (
     return (
       <Fragment>
       <Fragment>
-        <li className="dropdown-header">{ t('user_management.edit_menu') }</li>
+        <li className="dropdown-header">{t('user_management:user_table.edit_menu')}</li>
         <li onClick={this.onPasswordResetClicked}>
         <li onClick={this.onPasswordResetClicked}>
           <a>
           <a>
-            <i className="icon-fw icon-key"></i>{ t('user_management.reset_password') }
+            <i className="icon-fw icon-key"></i>{t('user_management:user_table.reset_password')}
           </a>
           </a>
         </li>
         </li>
       </Fragment>
       </Fragment>
@@ -49,7 +49,7 @@ class UserMenu extends React.Component {
     return (
     return (
       <Fragment>
       <Fragment>
         <li className="divider"></li>
         <li className="divider"></li>
-        <li className="dropdown-header">{ t('status') }</li>
+        <li className="dropdown-header">{t('status')}</li>
         <li>
         <li>
           {(user.status === 1 || user.status === 3) && <StatusActivateButton user={user} />}
           {(user.status === 1 || user.status === 3) && <StatusActivateButton user={user} />}
           {user.status === 2 && <StatusSuspendedButton user={user} />}
           {user.status === 2 && <StatusSuspendedButton user={user} />}
@@ -65,7 +65,7 @@ class UserMenu extends React.Component {
     return (
     return (
       <Fragment>
       <Fragment>
         <li className="divider pl-0"></li>
         <li className="divider pl-0"></li>
-        <li className="dropdown-header">{ t('user_management.administrator_menu') }</li>
+        <li className="dropdown-header">{t('user_management:user_table.administrator_menu')}</li>
         <li>
         <li>
           {user.admin === true && <RemoveAdminButton user={user} />}
           {user.admin === true && <RemoveAdminButton user={user} />}
           {user.admin === false && <GiveAdminButton user={user} />}
           {user.admin === false && <GiveAdminButton user={user} />}

+ 2 - 2
src/client/js/components/Admin/Users/UserRemoveButton.jsx

@@ -21,7 +21,7 @@ class UserRemoveButton extends React.Component {
     try {
     try {
       await this.props.adminUsersContainer.removeUser(this.props.user._id);
       await this.props.adminUsersContainer.removeUser(this.props.user._id);
       const { username } = this.props.user;
       const { username } = this.props.user;
-      toastSuccess(t('user_management.remove_user_success', { username }));
+      toastSuccess(t('toaster:remove_user_success', { username }));
     }
     }
     catch (err) {
     catch (err) {
       toastError(err);
       toastError(err);
@@ -33,7 +33,7 @@ class UserRemoveButton extends React.Component {
 
 
     return (
     return (
       <a className="px-4" onClick={() => { this.onClickDeleteBtn() }}>
       <a className="px-4" onClick={() => { this.onClickDeleteBtn() }}>
-        <i className="icon-fw icon-fire text-danger"></i> { t('Delete') }
+        <i className="icon-fw icon-fire text-danger"></i> {t('Delete')}
       </a>
       </a>
     );
     );
   }
   }

+ 7 - 7
src/client/js/components/Admin/Users/UserTable.jsx

@@ -70,12 +70,12 @@ class UserTable extends React.Component {
           <thead>
           <thead>
             <tr>
             <tr>
               <th width="100px">#</th>
               <th width="100px">#</th>
-              <th>{ t('status') }</th>
+              <th>{t('status')}</th>
               <th><code>username</code></th>
               <th><code>username</code></th>
-              <th>{ t('Name') }</th>
-              <th>{ t('Email') }</th>
-              <th width="100px">{ t('Created') }</th>
-              <th width="150px">{ t('Last_Login') }</th>
+              <th>{t('Name')}</th>
+              <th>{t('Email')}</th>
+              <th width="100px">{t('Created')}</th>
+              <th width="150px">{t('Last_Login')}</th>
               <th width="70px"></th>
               <th width="70px"></th>
             </tr>
             </tr>
           </thead>
           </thead>
@@ -85,7 +85,7 @@ class UserTable extends React.Component {
                 <tr key={user._id}>
                 <tr key={user._id}>
                   <td>
                   <td>
                     <UserPicture user={user} className="picture img-circle" />
                     <UserPicture user={user} className="picture img-circle" />
-                    {user.admin && <span className="label label-inverse label-admin ml-2">{ t('administrator') }</span>}
+                    {user.admin && <span className="label label-inverse label-admin ml-2">{t('user_management:user_table.administrator')}</span>}
                   </td>
                   </td>
                   <td>{this.getUserStatusLabel(user.status)}</td>
                   <td>{this.getUserStatusLabel(user.status)}</td>
                   <td>
                   <td>
@@ -95,7 +95,7 @@ class UserTable extends React.Component {
                   <td>{user.email}</td>
                   <td>{user.email}</td>
                   <td>{dateFnsFormat(new Date(user.createdAt), 'yyyy-MM-dd')}</td>
                   <td>{dateFnsFormat(new Date(user.createdAt), 'yyyy-MM-dd')}</td>
                   <td>
                   <td>
-                    { user.lastLoginAt && <span>{dateFnsFormat(new Date(user.lastLoginAt), 'yyyy-MM-dd HH:mm')}</span> }
+                    {user.lastLoginAt && <span>{dateFnsFormat(new Date(user.lastLoginAt), 'yyyy-MM-dd HH:mm')}</span>}
                   </td>
                   </td>
                   <td>
                   <td>
                     <UserMenu user={user} />
                     <UserMenu user={user} />

+ 2 - 3
src/server/views/admin/index.html

@@ -1,11 +1,11 @@
 {% extends '../layout/admin.html' %}
 {% extends '../layout/admin.html' %}
 
 
-{% block html_title %}{{ customizeService.generateCustomTitle(t('admin_top.Management Wiki')) }}{% endblock %}
+{% block html_title %}{{ customizeService.generateCustomTitle(t('Management Wiki Home')) }}{% endblock %}
 
 
 {% block content_header %}
 {% block content_header %}
 <div class="header-wrap">
 <div class="header-wrap">
   <header id="page-header">
   <header id="page-header">
-    <h1 id="admin-title" class="title"> {{ t('admin_top.Management Wiki') }}</h1>
+    <h1 id="admin-title" class="title"> {{ t('Management Wiki Home') }}</h1>
   </header>
   </header>
 </div>
 </div>
 {% endblock %}
 {% endblock %}
@@ -34,4 +34,3 @@
 
 
 {% block content_footer %}
 {% block content_footer %}
 {% endblock content_footer %}
 {% endblock content_footer %}
-