-
-
Get Education Verified
-
You are now eligible for Education Verified status. Please enter your education information below to complete the process and receive an exclusive 50% coupon for the Dify Professional Plan.
+
+
+
{t('education.toVerified')}
+
+ {t('education.toVerifiedTip.front')}
+ {t('education.toVerifiedTip.coupon')}
+ {t('education.toVerifiedTip.end')}
+
- Your School Name
+ {t('education.form.schoolName.title')}
- Your School Role
+ {t('education.form.schoolRole.title')}
-
- Student
- Teacher
- School Administrator
-
+
{}}
+ />
- Terms & Agreements
+ {t('education.form.terms.title')}
- I confirm I am at least 18 years old
+ {t('education.form.terms.option.age')}
- I confirm I am enrolled or employed at the institution provided. Dify may request proof of enrollment/employment. If I misrepresent my eligibility, I agree to pay any fees initially waived based on my education status.
+ {t('education.form.terms.option.inSchool')}
@@ -69,7 +80,7 @@ const EducationApplyAge = () => {
variant='primary'
disabled={false}
>
- Send request
+ {t('education.submit')}
diff --git a/web/app/education-apply/components/role-selector.tsx b/web/app/education-apply/components/role-selector.tsx
new file mode 100644
index 0000000000..685ed0cc79
--- /dev/null
+++ b/web/app/education-apply/components/role-selector.tsx
@@ -0,0 +1,53 @@
+import { useTranslation } from 'react-i18next'
+import cn from '@/utils/classnames'
+
+type RoleSelectorProps = {
+ onChange: (value: string) => void
+ value: string
+}
+
+const RoleSelector = ({
+ onChange,
+ value,
+}: RoleSelectorProps) => {
+ const { t } = useTranslation()
+ const options = [
+ {
+ key: 'student',
+ value: t('education.form.schoolRole.option.student'),
+ },
+ {
+ key: 'teacher',
+ value: t('education.form.schoolRole.option.teacher'),
+ },
+ {
+ key: 'school-administrator',
+ value: t('education.form.schoolRole.option.administrator'),
+ },
+ ]
+
+ return (
+
+ {
+ options.map(option => (
+
onChange(option.key)}
+ >
+
+
+ {option.value}
+
+ ))
+ }
+
+ )
+}
+
+export default RoleSelector
diff --git a/web/app/education-apply/components/search-input.tsx b/web/app/education-apply/components/search-input.tsx
index 80051318b2..cf7619f42a 100644
--- a/web/app/education-apply/components/search-input.tsx
+++ b/web/app/education-apply/components/search-input.tsx
@@ -1,3 +1,4 @@
+import { useTranslation } from 'react-i18next'
import Input from '@/app/components/base/input'
import {
PortalToFollowElem,
@@ -6,12 +7,14 @@ import {
} from '@/app/components/base/portal-to-follow-elem'
const SearchInput = () => {
+ const { t } = useTranslation()
+
return (
diff --git a/web/app/education-apply/components/user-info.tsx b/web/app/education-apply/components/user-info.tsx
index 0678fd1045..2bb23d74d0 100644
--- a/web/app/education-apply/components/user-info.tsx
+++ b/web/app/education-apply/components/user-info.tsx
@@ -4,6 +4,7 @@ import Button from '@/app/components/base/button'
import { useAppContext } from '@/context/app-context'
import { logout } from '@/service/common'
import Avatar from '@/app/components/base/avatar'
+import { Triangle } from '@/app/components/base/icons/src/public/education'
const UserInfo = () => {
const router = useRouter()
@@ -24,7 +25,13 @@ const UserInfo = () => {
}
return (
-
+
+
+
+ {t('education.currentSigned')}
+
+
+
{
+ let res
+ try {
+ res = require(`./${lang}/education`).default
+ }
+ catch {
+ res = require('./en-US/education').default
+ }
+
+ return res
+}
+
const loadLangResources = (lang: string) => ({
translation: {
common: require(`./${lang}/common`).default,
@@ -31,6 +43,7 @@ const loadLangResources = (lang: string) => ({
plugin: require(`./${lang}/plugin`).default,
pluginTags: require(`./${lang}/plugin-tags`).default,
time: require(`./${lang}/time`).default,
+ education: requireSilent(lang),
},
})
diff --git a/web/i18n/ja-JP/education.ts b/web/i18n/ja-JP/education.ts
new file mode 100644
index 0000000000..2e5ad73860
--- /dev/null
+++ b/web/i18n/ja-JP/education.ts
@@ -0,0 +1,41 @@
+const translation = {
+ toVerified: '教育認証を取得',
+ toVerifiedTip: {
+ front: '現在、教育認証ステータスを取得する資格があります。以下に教育情報を入力し、認証プロセスを完了すると、Difyプロフェッショナルプランの',
+ coupon: '50%割引クーポン',
+ end: 'を受け取ることができます。',
+ },
+ currentSigned: '現在ログイン中のアカウントは',
+ form: {
+ schoolName: {
+ title: '学校名',
+ placeholder: '学校の正式名称(省略不可)を入力してください。',
+ },
+ schoolRole: {
+ title: '学校での役割',
+ option: {
+ student: '学生',
+ teacher: '教師',
+ administrator: '学校管理者',
+ },
+ },
+ terms: {
+ title: '利用規約と同意事項',
+ desc: {
+ front: 'お客様の情報および 教育認証ステータス の利用は、当社の ',
+ and: 'および',
+ end: 'に従うものとします。送信することで以下を確認します:',
+ termsOfService: '利用規約',
+ privacyPolicy: 'プライバシーポリシー',
+ },
+ option: {
+ age: '18歳以上であることを確認します。',
+ inSchool: '提供した教育機関に在籍または勤務している ことを確認します。Difyは在籍/雇用証明の提出を求める場合があります。不正な情報を申告した場合、教育認証に基づき免除された費用を支払うことに同意します。',
+ },
+ },
+ },
+ submit: '送信',
+ learn: '教育認証の取得方法はこちら',
+}
+
+export default translation
diff --git a/web/i18n/zh-Hans/education.ts b/web/i18n/zh-Hans/education.ts
index e69de29bb2..df361367e7 100644
--- a/web/i18n/zh-Hans/education.ts
+++ b/web/i18n/zh-Hans/education.ts
@@ -0,0 +1,41 @@
+const translation = {
+ toVerified: '获取教育版认证',
+ toVerifiedTip: {
+ front: '您现在符合教育版认证的资格。请在下方输入您的教育信息,以完成认证流程,并领取 Dify Professional 版 的',
+ coupon: '50% 独家优惠券',
+ end: '。',
+ },
+ currentSigned: '您当前登录的账户是',
+ form: {
+ schoolName: {
+ title: '您的学校名称',
+ placeholder: '请输入您的学校的官方全称(不得缩写)',
+ },
+ schoolRole: {
+ title: '您在学校的身份',
+ option: {
+ student: '学生',
+ teacher: '教师',
+ administrator: '学校管理员',
+ },
+ },
+ terms: {
+ title: '条款与协议',
+ desc: {
+ front: '您的信息和教育版认证资格的使用需遵守我们的',
+ and: '和',
+ end: '。提交即表示:',
+ termsOfService: '服务条款',
+ privacyPolicy: '隐私政策',
+ },
+ option: {
+ age: '我确认我已年满 18 周岁。',
+ inSchool: '我确认我目前已在提供的学校入学或受雇。Dify 可能会要求提供入学/雇佣证明。如我虚报资格,我同意支付因教育版认证而被减免的费用。',
+ },
+ },
+ },
+ submit: '提交',
+ learn: '了解如何获取教育版认证',
+}
+
+export default translation
diff --git a/web/public/education/bg.png b/web/public/education/bg.png
index 917b0764f7..0c2e503f5f 100644
Binary files a/web/public/education/bg.png and b/web/public/education/bg.png differ