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

Merge branch 'feat/questionnaire' into merge-master-to-questionnaire-branch

Futa Arai 3 лет назад
Родитель
Сommit
b95acdb8f8

+ 11 - 1
packages/app/public/static/locales/en_US/admin.json

@@ -388,7 +388,17 @@
     "enable": "Enable",
     "disable": "Disable",
     "use_env_var_if_empty": "If the value in the database is empty, the value of the environment variable <code>{{variable}}</code> is used.",
-    "note_for_the_only_env_option": "The GCS Settings is limited by the value of environment variable.<br>To change this setting, please change to false or delete the value of the environment variable <code>{{env}}</code> ."
+    "note_for_the_only_env_option": "The GCS Settings is limited by the value of environment variable.<br>To change this setting, please change to false or delete the value of the environment variable <code>{{env}}</code> .",
+    "questionnaire_settings": "Questionnaire settings",
+    "questionnaire_settings_explanation": "This will enable/disable questionnaires on the whole system. When enabled, users can also enable/disable questionnaires individually from \"Other Settings\" in the personal settings page.",
+    "about_data_sent": "About information sent",
+    "docs_link": "https://docs.growi.org/en/admin-guide/management-cookbook/app-settings.html#questionnaire-settings",
+    "learn_more": "Learn more",
+    "other_info_will_be_sent": "Along with the questionnaire answer, information necessary to improve GROWI will be sent. Personal user info will not be included in the data sent.",
+    "we_will_use_the_data_to_improve_growi": "We will use the data to improve GROWI experience as much as possible.",
+    "anonymize_app_site_url": "Anonymize app site URL in data sent",
+    "url_anonymization_explanation": "The app site URL included in the questionnaire answer will be anonymized. By enabling this, the GROWI application that sends the questionnaire answer will not be identified.",
+    "enable_questionnaire": "Enable questionnaire"
   },
   "markdown_settings": {
     "markdown_settings": "Markdown Settings",

+ 24 - 1
packages/app/public/static/locales/en_US/commons.json

@@ -59,7 +59,8 @@
     "color_mode": "Color mode",
     "sidebar_mode": "Sidebar mode",
     "sidebar_mode_editor": "Sidebar mode on editor",
-    "use_os_settings": "Use OS settings"
+    "use_os_settings": "Use OS settings",
+    "feedback": "Feedback"
   },
 
   "copy_to_clipboard": {
@@ -94,6 +95,28 @@
     }
   },
 
+  "questionnaire_modal": {
+    "required": "Required",
+    "submit": "Submit",
+    "close": "Close",
+    "title": "GROWI questionnaire for service improvement",
+    "more_satisfied_services": "We hope that GROWI customers will be even more satisfied",
+    "strive_to_improve_services": "once we improve our services based on your feedback.",
+    "length_of_experience": {
+      "more_than_two_years": "More than 2 years",
+      "one_to_two_years": "More than 1 year but less than 2 years",
+      "six_months_to_one_year": "More than 6 months but less than 1 year",
+      "three_months_to_six_months": "More than 3 months but less than 6 months",
+      "one_month_to_three_months": "More than 1 month but less than 3 months",
+      "less_than_one_month": "Less than 1 month"
+    },
+    "satisfaction_with_growi": "Satisfaction with GROWI",
+    "history_of_growi_usage": "History of GROWI usage",
+    "occupation": "Occupation",
+    "position": "Position",
+    "comment_on_growi": "Comment on GROWI"
+  },
+
   "not_found_page": {
     "page_not_exist": "This page does not exist."
   },

+ 7 - 20
packages/app/public/static/locales/en_US/translation.json

@@ -812,9 +812,9 @@
   "questionnaire": {
     "give_us_feedback": "Give us feedback for improvements",
     "thank_you_for_answering": "Thank you for answering",
-    "additional_feedback": "Send us additional feedback from here.",
+    "additional_feedback": "Send us additional feedback from the user icon dropdown.",
     "dont_show_again": "Don`t show again",
-    "deny": "No answer",
+    "deny": "Don't answer",
     "agree": "Agree",
     "disagree": "Disagree",
     "answer": "Answer",
@@ -822,24 +822,11 @@
     "settings": "Questionnaire settings",
     "failed_to_send": "Failed to send feedback",
     "denied": "The questionnaire won't be shown again",
-    "title": "GROWI questionnaire for service improvement",
-    "successfully_submit": "Your survey has been submitted.",
-    "thanks_for_answer": "Thank you very much for taking the time to complete the survey.",
-    "more_satisfied_services": "We hope that GROWI customers will be even more satisfied with our services,",
-    "strive_to_improve_services": "we will strive to improve our services based on your feedback.",
-    "satisfaction_with_growi": "Satisfaction with GROWI",
-    "history_of_growi_use": "History of GROWI use",
-    "position": "Position",
-    "occupation": "Occupation",
-    "comment_on_growi": "Comment on GROWI",
-    "length_of_experience": {
-      "more_than_two_years": "More than 2 years",
-      "one_to_two_years": "More than 1 year but less than 2 years",
-      "six_months_to_one_year": "More than 6 months but less than 1 year",
-      "three_months_to_six_months": "More than 3 months but less than 6 months",
-      "one_month_to_three_months": "More than 1 month but less than 3 months",
-      "less_than_one_month": "Less than 1 month"
-    }
+    "successfully_submitted": "Your survey has been submitted.",
+    "thanks_for_answering": "Thank you very much for taking the time to complete the survey.",
+    "personal_settings_explanation": "Questionnaires for improving GROWI will be shown. If you have other feedbacks, you can send them from the user icon dropdown.",
+    "enable_questionnaire": "Enable questionnaire",
+    "disabled_by_admin": "Questionnaire is disabled by admin"
   },
   "tag_edit_modal": {
     "edit_tags": "Edit Tags",

+ 11 - 1
packages/app/public/static/locales/ja_JP/admin.json

@@ -396,7 +396,17 @@
     "enable": "有効",
     "disable": "無効",
     "use_env_var_if_empty": "データベース側の値が空の場合、環境変数 <code>{{variable}}</code> の値を利用します",
-    "note_for_the_only_env_option": "現在GCS設定は環境変数の値によって制限されています<br>この設定を変更する場合は環境変数 <code>{{env}}</code> の値をfalseに変更もしくは削除してください"
+    "note_for_the_only_env_option": "現在GCS設定は環境変数の値によって制限されています<br>この設定を変更する場合は環境変数 <code>{{env}}</code> の値をfalseに変更もしくは削除してください",
+    "questionnaire_settings": "アンケート設定",
+    "questionnaire_settings_explanation": "システム全体でアンケート機能を有効/無効にします。有効の場合、各ユーザーはユーザー設定ページの「その他の設定」から個別にアンケート機能を有効/無効にできます。",
+    "about_data_sent": "送信される情報について",
+    "docs_link": "https://docs.growi.org/ja/admin-guide/management-cookbook/app-settings.html#%E3%82%A2%E3%83%B3%E3%82%B1%E3%83%BC%E3%83%88%E8%A8%AD%E5%AE%9A",
+    "learn_more": "詳細",
+    "other_info_will_be_sent": "アンケートの回答と合わせて、GROWI の改善に必要な情報を送信します。送信されるデータにユーザーの個人情報は含まれません。",
+    "we_will_use_the_data_to_improve_growi": "私たちはそれらを活用し、最大限ユーザーの体験を向上させるよう努めます。",
+    "anonymize_app_site_url": "サイト URL を匿名化して送信する",
+    "url_anonymization_explanation": "アンケート回答データに含まれるサイト URL が匿名化されます。この設定を有効にすることで、アンケート回答データの送信元である GROWI アプリケーションが特定されなくなります。",
+    "enable_questionnaire": "アンケートを有効にする"
   },
   "markdown_settings": {
     "markdown_settings": "マークダウン設定",

+ 24 - 2
packages/app/public/static/locales/ja_JP/commons.json

@@ -5,7 +5,6 @@
   "Reset": "リセット",
   "Sign out": "ログアウト",
   "New": "作成",
-
   "meta": {
     "display_name": "日本語"
   },
@@ -59,7 +58,8 @@
     "color_mode": "カラーモード",
     "sidebar_mode": "サイドバーモード",
     "sidebar_mode_editor": "サイドバーモード(編集時)",
-    "use_os_settings": "OS設定を利用する"
+    "use_os_settings": "OS設定を利用する",
+    "feedback": "ご意見・ご要望"
   },
 
   "copy_to_clipboard": {
@@ -94,6 +94,28 @@
     }
   },
 
+  "questionnaire_modal": {
+    "required": "必須",
+    "submit": "送信",
+    "close": "閉じる",
+    "title": "GROWI サービス改善のためのアンケート",
+    "more_satisfied_services": "GROWI をご利用の皆さまに更にご満足いただけるよう",
+    "strive_to_improve_services": "皆さまからのご意見を参考にサービス改善に努めてまいります。",
+    "length_of_experience": {
+      "more_than_two_years": "2年以上",
+      "one_to_two_years": "1年以上2年未満",
+      "six_months_to_one_year": "6ヶ月以上1年未満",
+      "three_months_to_six_months": "3ヶ月以上6ヶ月未満",
+      "one_month_to_three_months": "1ヶ月以上3ヶ月未満",
+      "less_than_one_month": "1ヶ月未満"
+    },
+    "satisfaction_with_growi": "GROWI の満足度",
+    "history_of_growi_usage": "GROWI の利用歴",
+    "occupation": "職種",
+    "position": "役職",
+    "comment_on_growi": "GROWI へのコメント"
+  },
+
   "not_found_page": {
     "page_not_exist": "このページは存在しません。"
   },

+ 6 - 20
packages/app/public/static/locales/ja_JP/translation.json

@@ -136,7 +136,6 @@
   "edited this page": "さんがこのページを編集しました。",
   "List Drafts": "下書き一覧",
   "Deleted Pages": "削除済みページ",
-  "Questionnaire": "アンケート",
   "Disassociate": "連携解除",
   "Color mode": "カラーモード",
   "Sidebar mode": "サイドバーモード",
@@ -811,7 +810,7 @@
   "questionnaire": {
     "give_us_feedback": "GROWI の改善のために、アンケートにご協力ください",
     "thank_you_for_answering": "ご回答ありがとうございます",
-    "additional_feedback": "その他ご意見ご要望はこちらからお願い致します。",
+    "additional_feedback": "その他ご意見ご要望はユーザーアイコンのドロップダウンからお願い致します。",
     "dont_show_again": "今後このアンケートを表示しない",
     "deny": "回答しない",
     "agree": "そう思う",
@@ -821,24 +820,11 @@
     "settings": "アンケート設定",
     "failed_to_send": "回答送信に失敗しました",
     "denied": "このアンケートは今後表示されません",
-    "title": "GROWI サービス改善のためのアンケート",
-    "successfully_submit": "アンケートの送信が完了しました。",
-    "thanks_for_answer": "アンケートのご回答誠にありがとうございました。",
-    "more_satisfied_services": "GROWI をご利用の皆さまに更にご満足いただけるよう",
-    "strive_to_improve_services": "皆さまからのご意見を参考にサービス改善に務めてまいります。",
-    "satisfaction_with_growi": "GROWI の満足度",
-    "history_of_growi_use": "GROWI の利用歴",
-    "position": "職種",
-    "occupation": "役職",
-    "comment_on_growi": "GROWI へのコメント",
-    "length_of_experience": {
-      "more_than_two_years": "2年以上",
-      "one_to_two_years": "1年以上2年未満",
-      "six_months_to_one_year": "6ヶ月以上1年未満",
-      "three_months_to_six_months": "3ヶ月以上6ヶ月未満",
-      "one_month_to_three_months": "1ヶ月以上3ヶ月未満",
-      "less_than_one_month": "1ヶ月未満"
-    }
+    "successfully_submitted": "アンケートの送信が完了しました。",
+    "thanks_for_answering": "アンケートのご回答誠にありがとうございました。",
+    "personal_settings_explanation": "GROWI 改善のためのアンケートが表示されるようになります。ご意見ご要望はユーザーアイコンのドロップダウンからお願いいたします。",
+    "enable_questionnaire": "アンケートを有効にする",
+    "disabled_by_admin": "管理者によってアンケートは無効化されています"
   },
   "tag_edit_modal": {
     "edit_tags": "タグの編集",

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

@@ -396,7 +396,17 @@
     "enable": "启用",
     "disable": "停用",
     "use_env_var_if_empty": "如果数据库中的值为空,则环境变量的值 <cod>{{variable}}</code> 启用。",
-    "note_for_the_only_env_option": "The GCS settings is limited by the value of environment variable.<br>To change this setting, please change to false or delete the value of the environment variable <code>{{env}}</code> ."
+    "note_for_the_only_env_option": "The GCS settings is limited by the value of environment variable.<br>To change this setting, please change to false or delete the value of the environment variable <code>{{env}}</code> .",
+    "questionnaire_settings": "问卷设置",
+    "questionnaire_settings_explanation": "这将在整个系统上启用/禁用问卷。 启用后,用户还可以在个人设置页面的“其他设置”中单独启用/禁用问卷调查。",
+    "about_data_sent": "关于发送的信息",
+    "docs_link": "https://docs.growi.org/en/admin-guide/management-cookbook/app-settings.html#questionnaire-settings",
+    "learn_more": "细节",
+    "other_info_will_be_sent": "与问卷回答一起,将发送改进 GROWI 所需的信息。个人用户信息将不包含在发送的数据中。",
+    "we_will_use_the_data_to_improve_growi": "我们将使用这些数据尽可能地改善 GROWI 体验。",
+    "anonymize_app_site_url": "在发送的数据中匿名应用程序站点 URL",
+    "url_anonymization_explanation": "问卷答案中包含的应用站点URL将被匿名化,启用后将不会识别发送问卷答案的GROWI应用。",
+    "enable_questionnaire": "启用问卷"
   },
   "markdown_settings": {
     "markdown_settings": "Markdown设置",

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

@@ -59,7 +59,8 @@
 		"color_mode": "颜色模式",
 		"sidebar_mode": "边栏模式",
 		"sidebar_mode_editor": "编辑器上的边栏模式",
-		"use_os_settings": "使用操作系统设置"
+		"use_os_settings": "使用操作系统设置",
+    "feedback": "意见和要求"
   },
 
 	"copy_to_clipboard": {
@@ -94,6 +95,28 @@
     }
   },
 
+  "questionnaire_modal": {
+    "required": "必需的",
+    "submit": "发送",
+    "close": "Close",
+    "title": "改善服务的GROWI调查表",
+    "more_satisfied_services": "我们希望让使用GROWI的人更加满意",
+    "strive_to_improve_services": "我们将利用你的反馈来改善我们的服务。",
+    "length_of_experience": {
+      "more_than_two_years": "2年以上",
+      "one_to_two_years": "超过1年但少于2年",
+      "six_months_to_one_year": "超过6个月但少于1年",
+      "three_months_to_six_months": "超过3个月但少于6个月",
+      "one_month_to_three_months": "超过1个月但少于3个月",
+      "less_than_one_month": "不到1个月"
+    },
+    "satisfaction_with_growi": "对GROWI的满意程度",
+    "history_of_growi_usage": "GROWI的使用历史",
+    "occupation": "职位",
+    "position": "职业类型",
+    "comment_on_growi": "关于GROWI的评论"
+  },
+
   "not_found_page": {
     "page_not_exist": "该页面不存在"
   },

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

@@ -144,7 +144,6 @@
 	"edited this page": "edited this page.",
 	"List Drafts": "草稿",
 	"Deleted Pages": "已删除页",
-  "Questionnaire": "调查",
   "Disassociate": "解除关联",
   "No bookmarks yet": "暂无书签",
   "add_bookmark": "添加到书签",
@@ -810,25 +809,23 @@
     "recently_created": "最近创建页面"
   },
   "questionnaire": {
-    "title": "改善服务的GROWI调查表",
-    "successfully_submit": "问卷已经发出。",
-    "thanks_for_answer": "非常感谢您完成问卷调查。",
-    "more_satisfied_services": "我们希望让使用GROWI的人更加满意",
-    "strive_to_improve_services": "我们将利用你的反馈来改善我们的服务。",
-    "satisfaction_with_growi": "对GROWI的满意程度",
-    "history_of_growi_use": "GROWI的使用历史",
-    "position": "职业类型",
-    "occupation": "职位",
-    "comment_on_growi": "关于GROWI的评论",
+    "give_us_feedback": "向我们提供反馈以进行改进",
+    "thank_you_for_answering": "谢谢你的回答",
+    "additional_feedback": "从用户图标下拉菜单向我们发送更多反馈。",
+    "dont_show_again": "不再显示",
+    "deny": "不要回答",
+    "agree": "同意",
+    "disagree": "不同意",
     "answer": "答案是",
-    "length_of_experience": {
-      "more_than_two_years": "2年以上",
-      "one_to_two_years": "超过1年但少于2年",
-      "six_months_to_one_year": "超过6个月但少于1年",
-      "three_months_to_six_months": "超过3个月但少于6个月",
-      "one_month_to_three_months": "超过1个月但少于3个月",
-      "less_than_one_month": "不到1个月"
-    }
+    "no_answer": "没有答案",
+    "settings": "问卷设置",
+    "failed_to_send": "无法发送反馈",
+    "denied": "问卷不会再显示",
+    "successfully_submitted": "问卷已经发出。",
+    "thanks_for_answering": "非常感谢您完成问卷调查。",
+    "personal_settings_explanation": "将展示改进 GROWI 的问卷。 如果您有其他反馈,可以从用户图标下拉菜单中发送。",
+    "enable_questionnaire": "启用问卷",
+    "disabled_by_admin": "问卷已被管理员禁用"
   },
   "v5_page_migration": {
     "page_tree_not_avaliable": "Page Tree 功能不可用",

+ 2 - 2
packages/app/src/components/Admin/App/AppSettingsPageContents.tsx

@@ -14,9 +14,9 @@ import AppSetting from './AppSetting';
 import FileUploadSetting from './FileUploadSetting';
 import MailSetting from './MailSetting';
 import { MaintenanceMode } from './MaintenanceMode';
+import QuestionnaireSettings from './QuestionnaireSettings';
 import SiteUrlSetting from './SiteUrlSetting';
 import V5PageMigration from './V5PageMigration';
-import QuestionnaireSettings from './QuestionnaireSettings';
 
 
 const logger = loggerFactory('growi:appSettings');
@@ -110,7 +110,7 @@ const AppSettingsPageContents = (props: Props) => {
 
       <div className="row mt-5">
         <div className="col-lg-12">
-          <h2 className="admin-setting-header">アンケート設定</h2>
+          <h2 className="admin-setting-header">{t('admin:app_setting.questionnaire_settings')}</h2>
           <QuestionnaireSettings />
         </div>
       </div>

+ 16 - 17
packages/app/src/components/Admin/App/QuestionnaireSettings.tsx

@@ -7,15 +7,11 @@ import { useTranslation } from 'next-i18next';
 import { toastSuccess, toastError } from '~/client/util/apiNotification';
 import { apiv3Put } from '~/client/util/apiv3-client';
 import { useSWRxAppSettings } from '~/stores/admin/app-settings';
-import loggerFactory from '~/utils/logger';
 
 import AdminUpdateButtonRow from '../Common/AdminUpdateButtonRow';
 
-const logger = loggerFactory('growi:questionnaireSettings');
-
 const QuestionnaireSettings = (): JSX.Element => {
-  // TODO: i18n
-  const { t } = useTranslation();
+  const { t } = useTranslation(['admin', 'commons']);
 
   const { data, error, mutate } = useSWRxAppSettings();
 
@@ -35,7 +31,7 @@ const QuestionnaireSettings = (): JSX.Element => {
         isQuestionnaireEnabled,
         isAppSiteUrlHashed,
       });
-      toastSuccess(t('toaster.update_successed', { target: 'アンケート設定', ns: 'commons' }));
+      toastSuccess(t('commons:toaster.update_successed', { target: t('app_setting.questionnaire_settings') }));
     }
     catch (err) {
       toastError(err);
@@ -54,14 +50,17 @@ const QuestionnaireSettings = (): JSX.Element => {
   return (
     <div id="questionnaire-settings" className="mb-5">
       <p className="card well">
-        システム全体でアンケート機能を有効/無効にします。また、ユーザーは設定画面から個別にアンケート機能を有効/無効にできます。<br />
-        送信されるデータにユーザーの個人情報は一切含まれません。
-        <div>
-          {/* eslint-disable-next-line max-len */}
-          詳しくは<a href="https://docs.growi.org/ja/admin-guide/management-cookbook/app-settings.html" rel="noreferrer" target="_blank" className="d-inline"> GROWI Docs &quot;アンケート設定&quot; <i className="icon-share-alt"></i></a>を参照ください。
-        </div>
-        <br />
-        GROWI の改善にご協力お願いします。
+        <div className="mb-4">{t('app_setting.questionnaire_settings_explanation')}</div>
+        <span>
+          <div className="mb-2">
+            <span className="text-info mr-2"><i className="icon-info icon-fw"></i>{t('app_setting.about_data_sent')}</span>
+            <a href={t('app_setting.docs_link')} rel="noreferrer" target="_blank" className="d-inline">
+              {t('app_setting.learn_more')} <i className="icon-share-alt"></i>
+            </a>
+          </div>
+          {t('app_setting.other_info_will_be_sent')}<br />
+          {t('app_setting.we_will_use_the_data_to_improve_growi')}
+        </span>
       </p>
 
       {isLoading && <div className="text-muted text-center mb-5">
@@ -80,7 +79,7 @@ const QuestionnaireSettings = (): JSX.Element => {
                 onChange={onChangeIsQuestionnaireEnabledHandler}
               />
               <label className="custom-control-label" htmlFor="isQuestionnaireEnabled">
-                アンケートを有効にする
+                {t('app_setting.enable_questionnaire')}
               </label>
             </div>
           </div>
@@ -96,10 +95,10 @@ const QuestionnaireSettings = (): JSX.Element => {
                 disabled={!isQuestionnaireEnabled}
               />
               <label className="custom-control-label" htmlFor="isAppSiteUrlHashed">
-                サイト URL を匿名化して送信する
+                {t('app_setting.anonymize_app_site_url')}
               </label>
               <p className="form-text text-muted small">
-                アンケート回答データに含まれるサイト URL が匿名化されます。この設定を有効にすることで、アンケート回答データの送信元である GROWI アプリケーションが特定されなくなります。
+                {t('app_setting.url_anonymization_explanation')}
               </p>
             </div>
           </div>

+ 5 - 5
packages/app/src/components/Me/OtherSettings.tsx

@@ -42,7 +42,7 @@ const OtherSettings = (): JSX.Element => {
 
   return (
     <>
-      <h2 className="border-bottom my-4">アンケート設定</h2>
+      <h2 className="border-bottom my-4">{t('questionnaire.settings')}</h2>
 
       {isLoadingCurrentUser && <div className="text-muted text-center mb-5">
         <i className="fa fa-2x fa-spinner fa-pulse mr-1" />
@@ -62,14 +62,14 @@ const OtherSettings = (): JSX.Element => {
                   disabled={!growiIsQuestionnaireEnabled}
                 />
                 <label className="custom-control-label" htmlFor="isQuestionnaireEnabled">
-                アンケートを有効にする
+                  {t('questionnaire.enable_questionnaire')}
                 </label>
               </span>
               <p className="form-text text-muted small">
-                GROWI 改善のためのアンケートが表示されるようになります。ご意見ご要望はユーザーアイコンのドロップダウンからお願いいたします。
+                {t('questionnaire.personal_settings_explanation')}
               </p>
               {!growiIsQuestionnaireEnabled && <UncontrolledTooltip placement="bottom" target="personal-questionnaire-settings-toggle">
-                管理者によってアンケートは無効化されています
+                {t('questionnaire.disabled_by_admin')}
               </UncontrolledTooltip> }
             </div>
           )}
@@ -90,7 +90,7 @@ const OtherSettings = (): JSX.Element => {
             </button>
           </span>
           {!growiIsQuestionnaireEnabled && <UncontrolledTooltip placement="bottom" target="personal-questionnaire-settings-btn">
-            管理者によってアンケートは無効化されています
+            {t('questionnaire.disabled_by_admin')}
           </UncontrolledTooltip>}
         </div>
       </div>

+ 4 - 2
packages/app/src/components/Navbar/PersonalDropdown.tsx

@@ -78,12 +78,14 @@ const PersonalDropdown = (): JSX.Element => {
         <div className="dropdown-divider"></div>
 
         <button type="button" className="dropdown-item" onClick={() => setQuestionnaireModalOpen(true)}>
-          <i className="icon-fw icon-pencil"></i>{ t('Questionnaire') }
+          <i className="icon-fw icon-pencil"></i>{t('personal_dropdown.feedback')}
         </button>
 
         <div className="dropdown-divider"></div>
 
-        <button type="button" className="dropdown-item" onClick={logoutHandler}><i className="icon-fw icon-power"></i>{t('Sign out')}</button>
+        <button type="button" className="dropdown-item" onClick={logoutHandler}>
+          <i className="icon-fw icon-power"></i>{t('Sign out')}
+        </button>
       </div>
 
       <ProactiveQuestionnaireModal isOpen={isQuestionnaireModalOpen} onClose={() => setQuestionnaireModalOpen(false)} />

+ 28 - 26
packages/app/src/components/Questionnaire/ProactiveQuestionnaireModal.tsx

@@ -13,7 +13,7 @@ type ModalProps = {
 };
 
 const QuestionnaireCompletionModal = (props: ModalProps): JSX.Element => {
-  const { t } = useTranslation();
+  const { t } = useTranslation('commons');
 
   const { isOpen, onClose } = props;
 
@@ -27,9 +27,9 @@ const QuestionnaireCompletionModal = (props: ModalProps): JSX.Element => {
       <ModalBody className="bg-primary overflow-hidden p-0" style={{ borderRadius: 8 }}>
         <div className="bg-white m-2 p-4" style={{ borderRadius: 8 }}>
           <div className="text-center">
-            <h2 className="my-4">{t('questionnaire.title')}</h2>
-            <p className="mb-1">{t('questionnaire.successfully_submit')}</p>
-            <p>{t('questionnaire.thanks_for_answer')}</p>
+            <h2 className="my-4">{t('questionnaire_modal.title')}</h2>
+            <p className="mb-1">{t('questionnaire_modal.successfully_submitted')}</p>
+            <p>{t('questionnaire_modal.thanks_for_answering')}</p>
           </div>
           <div className="text-center my-3">
             <span style={{ cursor: 'pointer', textDecoration: 'underline' }} onClick={onClose}>{t('Close')}</span>
@@ -41,7 +41,7 @@ const QuestionnaireCompletionModal = (props: ModalProps): JSX.Element => {
 };
 
 const ProactiveQuestionnaireModal = (props: ModalProps): JSX.Element => {
-  const { t } = useTranslation();
+  const { t } = useTranslation('commons');
 
   const { isOpen, onClose } = props;
 
@@ -55,16 +55,16 @@ const ProactiveQuestionnaireModal = (props: ModalProps): JSX.Element => {
     const {
       satisfaction: { value: satisfaction },
       lengthOfExperience: { value: lengthOfExperience },
-      position: { value: position },
       occupation: { value: occupation },
+      position: { value: position },
       commentText: { value: commentText },
     } = formData;
 
     const sendValues = {
       satisfaction: Number(satisfaction),
       lengthOfExperience,
-      position,
       occupation,
+      position,
       commentText,
     };
 
@@ -85,14 +85,14 @@ const ProactiveQuestionnaireModal = (props: ModalProps): JSX.Element => {
         <ModalBody className="bg-primary overflow-hidden p-0" style={{ borderRadius: 8 }}>
           <div className="bg-white m-2 p-4" style={{ borderRadius: 8 }}>
             <div className="text-center">
-              <h2 className="my-4">{t('questionnaire.title')}</h2>
-              <p className="mb-1">{t('questionnaire.more_satisfied_services')}</p>
-              <p>{t('questionnaire.strive_to_improve_services')}</p>
+              <h2 className="my-4">{t('questionnaire_modal.title')}</h2>
+              <p className="mb-1">{t('questionnaire_modal.more_satisfied_services')}</p>
+              <p>{t('questionnaire_modal.strive_to_improve_services')}</p>
             </div>
             <form className="px-5" onSubmit={submitHandler}>
               <div className="form-group row mt-5">
                 <label className="col-sm-5 col-form-label" htmlFor="satisfaction">
-                  <span className="badge badge-primary mr-2">{t('Required')}</span>{t('questionnaire.satisfaction_with_growi')}
+                  <span className="badge badge-primary mr-2">{t('questionnaire_modal.required')}</span>{t('questionnaire_modal.satisfaction_with_growi')}
                 </label>
                 <select className="col-sm-7 form-control" name="satisfaction" id="satisfaction" required>
                   <option value="">▼ {t('Select')}</option>
@@ -104,38 +104,40 @@ const ProactiveQuestionnaireModal = (props: ModalProps): JSX.Element => {
                 </select>
               </div>
               <div className="form-group row mt-3">
-                <label className="col-sm-5 col-form-label" htmlFor="lengthOfExperience">{t('questionnaire.history_of_growi_use')}</label>
+                <label className="col-sm-5 col-form-label" htmlFor="lengthOfExperience">{t('questionnaire_modal.history_of_growi_usage')}</label>
                 <select
                   name="lengthOfExperience"
                   id="lengthOfExperience"
                   className="col-sm-7 form-control"
                 >
                   <option value="">▼ {t('Select')}</option>
-                  <option>{t('questionnaire.length_of_experience.more_than_two_years')}</option>
-                  <option>{t('questionnaire.length_of_experience.one_to_two_years')}</option>
-                  <option>{t('questionnaire.length_of_experience.six_months_to_one_year')}</option>
-                  <option>{t('questionnaire.length_of_experience.three_months_to_six_months')}</option>
-                  <option>{t('questionnaire.length_of_experience.one_month_to_three_months')}</option>
-                  <option>{t('questionnaire.length_of_experience.less_than_one_month')}</option>
+                  <option>{t('questionnaire_modal.length_of_experience.more_than_two_years')}</option>
+                  <option>{t('questionnaire_modal.length_of_experience.one_to_two_years')}</option>
+                  <option>{t('questionnaire_modal.length_of_experience.six_months_to_one_year')}</option>
+                  <option>{t('questionnaire_modal.length_of_experience.three_months_to_six_months')}</option>
+                  <option>{t('questionnaire_modal.length_of_experience.one_month_to_three_months')}</option>
+                  <option>{t('questionnaire_modal.length_of_experience.less_than_one_month')}</option>
                 </select>
               </div>
               <div className="form-group row mt-3">
-                <label className="col-sm-5 col-form-label" htmlFor="position">{t('questionnaire.position')}</label>
-                <input className="col-sm-7 form-control" type="text" name="position" id="position" />
+                <label className="col-sm-5 col-form-label" htmlFor="occupation">{t('questionnaire_modal.occupation')}</label>
+                <input className="col-sm-7 form-control" type="text" name="occupation" id="occupation" />
               </div>
               <div className="form-group row mt-3">
-                <label className="col-sm-5 col-form-label" htmlFor="occupation">{t('questionnaire.occupation')}</label>
-                <input className="col-sm-7 form-control" type="text" name="occupation" id="occupation" />
+                <label className="col-sm-5 col-form-label" htmlFor="position">{t('questionnaire_modal.position')}</label>
+                <input className="col-sm-7 form-control" type="text" name="position" id="position" />
               </div>
               <div className="form-group row mt-3">
-                <label className="col-sm-5 col-form-label" htmlFor="commentText">{t('questionnaire.comment_on_growi')}</label>
-                <textarea className="col-sm-7 form-control" name="commentText" id="commentText" rows={5} />
+                <label className="col-sm-5 col-form-label" htmlFor="commentText">
+                  <span className="badge badge-primary mr-2">{t('questionnaire_modal.required')}</span>{t('questionnaire_modal.comment_on_growi')}
+                </label>
+                <textarea className="col-sm-7 form-control" name="commentText" id="commentText" rows={5} required/>
               </div>
               <div className="text-center mt-5">
-                <button type="submit" className="btn btn-primary">{t('questionnaire.answer')}</button>
+                <button type="submit" className="btn btn-primary">{t('questionnaire_modal.submit')}</button>
               </div>
               <div className="text-center my-3">
-                <span style={{ cursor: 'pointer', textDecoration: 'underline' }} onClick={onClose}>{t('Close')}</span>
+                <span style={{ cursor: 'pointer', textDecoration: 'underline' }} onClick={onClose}>{t('questionnaire_modal.close')}</span>
               </div>
             </form>
           </div>

+ 3 - 3
packages/app/src/components/Questionnaire/QuestionnaireModal.tsx

@@ -28,7 +28,7 @@ const QuestionnaireModal = ({ questionnaireOrder }: QuestionnaireModalProps): JS
 
   const inputNamePrefix = 'question-';
 
-  const { t } = useTranslation();
+  const { t } = useTranslation(['translation', 'commons']);
 
   const sendAnswer = useCallback(async(answers: IAnswer[]) => {
     try {
@@ -112,8 +112,8 @@ const QuestionnaireModal = ({ questionnaireOrder }: QuestionnaireModalProps): JS
         <div className="bg-white m-2 p-4" style={{ borderRadius: 8 }}>
           <div className="text-center mb-2">
             <h2 className="my-4">{questionnaireOrderTitle}</h2>
-            <p className="mb-1">{t('questionnaire.more_satisfied_services')}</p>
-            <p>{t('questionnaire.strive_to_improve_services')}</p>
+            <p className="mb-1">{t('commons:questionnaire_modal.more_satisfied_services')}</p>
+            <p>{t('commons:questionnaire_modal.strive_to_improve_services')}</p>
           </div>
           <div className="container">
             <div className="row mt-4">

+ 4 - 1
packages/app/src/components/Questionnaire/QuestionnaireModalManager.module.scss

@@ -1,6 +1,9 @@
+@use '~/styles/bootstrap/init' as bs;
+
 .grw-questionnaire-toasts :global {
   position: fixed;
   right: 20px;
-  bottom: 20px;
+  bottom: 52px;
+  z-index: bs.$zindex-fixed + 1;
   width: 230px;
 }