mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-10 04:22:27 +10:00
Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5fa45ef5bd | |||
| 9e6dafc8ca | |||
| a02b85b4bb | |||
| b3ff7805cd | |||
| 7f0ee40af4 | |||
| 39fa6da5dd | |||
| 7fd96a4540 | |||
| 8f5832b2ca | |||
| 58ce09ee06 | |||
| 3f5323d5a3 | |||
| d62482b280 | |||
| a609ea551a | |||
| 1f8e3647d3 | |||
| 76975ddc6c | |||
| 6ed0bb62b4 | |||
| 11d15d8dbb | |||
| 7cf92ddb81 | |||
| d907b36d59 | |||
| 307b626189 | |||
| f573e60079 | |||
| d3c52476f7 | |||
| 4f9d2ea846 | |||
| ec617d682e | |||
| 72d3d46e88 | |||
| 110797da9d | |||
| ab90a2e1dd | |||
| 1a3c950847 | |||
| 7fcc792255 | |||
| 97a13f9f41 | |||
| 29f1afac9a | |||
| c5d0abdc79 | |||
| 5a60c99df9 | |||
| c46b8fc162 |
10
.env.example
10
.env.example
@ -1,6 +1,6 @@
|
|||||||
# App
|
# App
|
||||||
TZ=UTC
|
TZ=UTC
|
||||||
SECRET_KEY=change-me
|
SECRET_KEY=
|
||||||
|
|
||||||
# URLs
|
# URLs
|
||||||
PUBLIC_URL=http://<SERVER-IP>
|
PUBLIC_URL=http://<SERVER-IP>
|
||||||
@ -15,13 +15,13 @@ POSTGRES_DATABASE=postgres
|
|||||||
POSTGRES_SSL_CERT=
|
POSTGRES_SSL_CERT=
|
||||||
|
|
||||||
# Auth
|
# Auth
|
||||||
JWT_SECRET=change-me
|
JWT_SECRET=
|
||||||
JWT_EXPIRY_TIME=604800
|
JWT_EXPIRY_TIME=604800
|
||||||
|
|
||||||
# Google
|
# Google
|
||||||
PUBLIC_GOOGLE_CLIENT_ID=change-me
|
PUBLIC_GOOGLE_CLIENT_ID=
|
||||||
GOOGLE_CLIENT_SECRET=change-me
|
GOOGLE_CLIENT_SECRET=
|
||||||
GOOGLE_API_KEY=change-me
|
GOOGLE_API_KEY=
|
||||||
|
|
||||||
# SendGrid (Optional)
|
# SendGrid (Optional)
|
||||||
SENDGRID_API_KEY=
|
SENDGRID_API_KEY=
|
||||||
|
|||||||
10
.github/ISSUE_TEMPLATE/bug-report.md
vendored
10
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@ -10,6 +10,10 @@ assignees: ''
|
|||||||
**Describe the bug**
|
**Describe the bug**
|
||||||
A clear and concise description of what the bug is.
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**Product Flavor**
|
||||||
|
- [ ] Managed (https://rxresu.me)
|
||||||
|
- [ ] Self Hosted
|
||||||
|
|
||||||
**To Reproduce**
|
**To Reproduce**
|
||||||
Steps to reproduce the behavior:
|
Steps to reproduce the behavior:
|
||||||
1. Go to '...'
|
1. Go to '...'
|
||||||
@ -28,11 +32,5 @@ If applicable, add screenshots to help explain your problem.
|
|||||||
- Browser [e.g. chrome, safari]
|
- Browser [e.g. chrome, safari]
|
||||||
- Version [e.g. 22]
|
- Version [e.g. 22]
|
||||||
|
|
||||||
**Smartphone (please complete the following information):**
|
|
||||||
- Device: [e.g. iPhone6]
|
|
||||||
- OS: [e.g. iOS8.1]
|
|
||||||
- Browser [e.g. stock browser, safari]
|
|
||||||
- Version [e.g. 22]
|
|
||||||
|
|
||||||
**Additional context**
|
**Additional context**
|
||||||
Add any other context about the problem here.
|
Add any other context about the problem here.
|
||||||
|
|||||||
15
CHANGELOG.md
15
CHANGELOG.md
@ -2,6 +2,21 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||||
|
|
||||||
|
### [3.2.6](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.2.5...v3.2.6) (2022-03-17)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **client/auth/google:** disable google login/registration if GOOGLE_CLIENT_ID is not in ENV ([7f0ee40](https://github.com/AmruthPillai/Reactive-Resume/commit/7f0ee40af4acc7eb41514406ecee3218ace9e891)), closes [#724](https://github.com/AmruthPillai/Reactive-Resume/issues/724)
|
||||||
|
* **i18n:** add arabic language to i18n locale ([39fa6da](https://github.com/AmruthPillai/Reactive-Resume/commit/39fa6da5dd77ce2e12e81530fa18c2eac722c1f2))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **i18n:** add missing languages to dayjs date wrapper locales ([9e6dafc](https://github.com/AmruthPillai/Reactive-Resume/commit/9e6dafc8cada5c01559894905996b81004bedaec)), closes [#719](https://github.com/AmruthPillai/Reactive-Resume/issues/719)
|
||||||
|
* **json-export:** add mimeType and charset to JSON export ([b3ff780](https://github.com/AmruthPillai/Reactive-Resume/commit/b3ff7805cd856a52900d9acef0554867d8ce0b01)), closes [#726](https://github.com/AmruthPillai/Reactive-Resume/issues/726)
|
||||||
|
* **linkedin:** fix skill modal crashing when importing from linkedin ([a02b85b](https://github.com/AmruthPillai/Reactive-Resume/commit/a02b85b4bb1c4a1499aacddeac7bc59bcb1f7adb)), closes [#718](https://github.com/AmruthPillai/Reactive-Resume/issues/718)
|
||||||
|
|
||||||
### [3.2.5](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.2.4...v3.2.5) (2022-03-16)
|
### [3.2.5](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.2.4...v3.2.5) (2022-03-16)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -36,6 +36,7 @@ You have complete control over what goes into your resume, how it looks, what co
|
|||||||
|
|
||||||
## Languages
|
## Languages
|
||||||
|
|
||||||
|
- Arabic (اَلْعَرَبِيَّةُ)
|
||||||
- Bengali (বাংলা)
|
- Bengali (বাংলা)
|
||||||
- Chinese (中文)
|
- Chinese (中文)
|
||||||
- Danish (Dansk)
|
- Danish (Dansk)
|
||||||
@ -96,6 +97,14 @@ Reactive Resume would be nothing without the folks who supported me and kept the
|
|||||||
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_blue.svg" width="200px" />
|
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_blue.svg" width="200px" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
## Contributors Wall
|
||||||
|
<a href="https://github.com/AmruthPillai/Reactive-Resume/graphs/contributors">
|
||||||
|
<img src="https://contrib.rocks/image?repo=AmruthPillai/Reactive-Resume" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
_Note: It may take up to 24h for the [contrib.rocks](https://contrib.rocks/image?repo=AmruthPillai/Reactive-Resume) plugin to update because it's refreshed once a day._
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Reactive Resume is packaged and distributed using the [MIT License](https://choosealicense.com/licenses/mit/) which allows for commercial use, distribution, modification and private use provided that all copies of the software contain the same license and copyright.
|
Reactive Resume is packaged and distributed using the [MIT License](https://choosealicense.com/licenses/mit/) which allows for commercial use, distribution, modification and private use provided that all copies of the software contain the same license and copyright.
|
||||||
|
|||||||
@ -34,9 +34,10 @@ const Export = () => {
|
|||||||
|
|
||||||
const redactedResume = pick(resume, ['basics', 'sections', 'metadata', 'public']);
|
const redactedResume = pick(resume, ['basics', 'sections', 'metadata', 'public']);
|
||||||
const jsonString = JSON.stringify(redactedResume, null, 4);
|
const jsonString = JSON.stringify(redactedResume, null, 4);
|
||||||
|
const jsonBlob = new Blob([jsonString], { type: 'application/json;charset=utf-8' });
|
||||||
const filename = `RxResume_JSONExport_${nanoid()}.json`;
|
const filename = `RxResume_JSONExport_${nanoid()}.json`;
|
||||||
|
|
||||||
download(jsonString, filename, 'application/json');
|
download(jsonBlob, filename);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleExportPDF = async () => {
|
const handleExportPDF = async () => {
|
||||||
|
|||||||
@ -8,14 +8,14 @@ import styles from './ArrayInput.module.scss';
|
|||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
label: string;
|
label: string;
|
||||||
value: string[];
|
value?: string[];
|
||||||
className?: string;
|
className?: string;
|
||||||
onChange: (event: any) => void;
|
onChange: (event: any) => void;
|
||||||
errors?: FieldError | FieldError[];
|
errors?: FieldError | FieldError[];
|
||||||
};
|
};
|
||||||
|
|
||||||
const ArrayInput: React.FC<Props> = ({ value, label, onChange, errors, className }) => {
|
const ArrayInput: React.FC<Props> = ({ value, label, onChange, errors, className }) => {
|
||||||
const [items, setItems] = useState<string[]>(value);
|
const [items, setItems] = useState<string[]>(value || []);
|
||||||
|
|
||||||
const onAdd = () => setItems([...items, '']);
|
const onAdd = () => setItems([...items, '']);
|
||||||
|
|
||||||
|
|||||||
@ -5,6 +5,7 @@ export type Language = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const languages: Language[] = [
|
export const languages: Language[] = [
|
||||||
|
{ code: 'ar', name: 'Arabic', localName: 'اَلْعَرَبِيَّةُ' },
|
||||||
{ code: 'bn', name: 'Bengali', localName: 'বাংলা' },
|
{ code: 'bn', name: 'Bengali', localName: 'বাংলা' },
|
||||||
{ code: 'da', name: 'Danish', localName: 'Dansk' },
|
{ code: 'da', name: 'Danish', localName: 'Dansk' },
|
||||||
{ code: 'de', name: 'German', localName: 'Deutsch' },
|
{ code: 'de', name: 'German', localName: 'Deutsch' },
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import { joiResolver } from '@hookform/resolvers/joi';
|
|||||||
import { Google, Login, Visibility, VisibilityOff } from '@mui/icons-material';
|
import { Google, Login, Visibility, VisibilityOff } from '@mui/icons-material';
|
||||||
import { Button, IconButton, InputAdornment, TextField } from '@mui/material';
|
import { Button, IconButton, InputAdornment, TextField } from '@mui/material';
|
||||||
import Joi from 'joi';
|
import Joi from 'joi';
|
||||||
|
import { isEmpty } from 'lodash';
|
||||||
import { Trans, useTranslation } from 'next-i18next';
|
import { Trans, useTranslation } from 'next-i18next';
|
||||||
import { useMemo, useState } from 'react';
|
import { useMemo, useState } from 'react';
|
||||||
import { GoogleLoginResponse, GoogleLoginResponseOffline, useGoogleLogin } from 'react-google-login';
|
import { GoogleLoginResponse, GoogleLoginResponseOffline, useGoogleLogin } from 'react-google-login';
|
||||||
@ -115,15 +116,17 @@ const LoginModal: React.FC = () => {
|
|||||||
handleClose={handleClose}
|
handleClose={handleClose}
|
||||||
footerChildren={
|
footerChildren={
|
||||||
<div className="flex gap-4">
|
<div className="flex gap-4">
|
||||||
<Button
|
{!isEmpty(env('GOOGLE_CLIENT_ID')) && (
|
||||||
type="submit"
|
<Button
|
||||||
variant="outlined"
|
type="submit"
|
||||||
disabled={isLoading}
|
variant="outlined"
|
||||||
startIcon={<Google />}
|
disabled={isLoading}
|
||||||
onClick={handleLoginWithGoogle}
|
startIcon={<Google />}
|
||||||
>
|
onClick={handleLoginWithGoogle}
|
||||||
{t('modals.auth.login.actions.google')}
|
>
|
||||||
</Button>
|
{t('modals.auth.login.actions.google')}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
|
||||||
<Button type="submit" onClick={handleSubmit(onSubmit)} disabled={isLoading}>
|
<Button type="submit" onClick={handleSubmit(onSubmit)} disabled={isLoading}>
|
||||||
{t('modals.auth.login.actions.login')}
|
{t('modals.auth.login.actions.login')}
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import { joiResolver } from '@hookform/resolvers/joi';
|
|||||||
import { Google, HowToReg } from '@mui/icons-material';
|
import { Google, HowToReg } from '@mui/icons-material';
|
||||||
import { Button, TextField } from '@mui/material';
|
import { Button, TextField } from '@mui/material';
|
||||||
import Joi from 'joi';
|
import Joi from 'joi';
|
||||||
|
import { isEmpty } from 'lodash';
|
||||||
import { Trans, useTranslation } from 'next-i18next';
|
import { Trans, useTranslation } from 'next-i18next';
|
||||||
import { GoogleLoginResponse, GoogleLoginResponseOffline, useGoogleLogin } from 'react-google-login';
|
import { GoogleLoginResponse, GoogleLoginResponseOffline, useGoogleLogin } from 'react-google-login';
|
||||||
import { Controller, useForm } from 'react-hook-form';
|
import { Controller, useForm } from 'react-hook-form';
|
||||||
@ -97,21 +98,23 @@ const RegisterModal: React.FC = () => {
|
|||||||
heading={t('modals.auth.register.heading')}
|
heading={t('modals.auth.register.heading')}
|
||||||
handleClose={handleClose}
|
handleClose={handleClose}
|
||||||
footerChildren={
|
footerChildren={
|
||||||
<>
|
<div className="flex gap-4">
|
||||||
<Button
|
{!isEmpty(env('GOOGLE_CLIENT_ID')) && (
|
||||||
type="submit"
|
<Button
|
||||||
variant="outlined"
|
type="submit"
|
||||||
disabled={isLoading}
|
variant="outlined"
|
||||||
startIcon={<Google />}
|
disabled={isLoading}
|
||||||
onClick={handleLoginWithGoogle}
|
startIcon={<Google />}
|
||||||
>
|
onClick={handleLoginWithGoogle}
|
||||||
{t('modals.auth.register.actions.google')}
|
>
|
||||||
</Button>
|
{t('modals.auth.register.actions.google')}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
|
||||||
<Button type="submit" onClick={handleSubmit(onSubmit)} disabled={isLoading}>
|
<Button type="submit" onClick={handleSubmit(onSubmit)} disabled={isLoading}>
|
||||||
{t('modals.auth.register.actions.register')}
|
{t('modals.auth.register.actions.register')}
|
||||||
</Button>
|
</Button>
|
||||||
</>
|
</div>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<p>{t('modals.auth.register.body')}</p>
|
<p>{t('modals.auth.register.body')}</p>
|
||||||
|
|||||||
@ -115,7 +115,7 @@ const PublicationModal: React.FC = () => {
|
|||||||
render={({ field, fieldState }) => (
|
render={({ field, fieldState }) => (
|
||||||
<TextField
|
<TextField
|
||||||
required
|
required
|
||||||
label="{t('builder.leftSidebar.sections.publications.form.publisher.label')}"
|
label={t('builder.leftSidebar.sections.publications.form.publisher.label')}
|
||||||
error={!!fieldState.error}
|
error={!!fieldState.error}
|
||||||
helperText={fieldState.error?.message}
|
helperText={fieldState.error?.message}
|
||||||
{...field}
|
{...field}
|
||||||
|
|||||||
@ -159,7 +159,7 @@ const SkillModal: React.FC = () => {
|
|||||||
render={({ field, fieldState }) => (
|
render={({ field, fieldState }) => (
|
||||||
<ArrayInput
|
<ArrayInput
|
||||||
label={t('builder.common.form.keywords.label')}
|
label={t('builder.common.form.keywords.label')}
|
||||||
value={field.value as string[]}
|
value={field.value}
|
||||||
onChange={field.onChange}
|
onChange={field.onChange}
|
||||||
errors={fieldState.error}
|
errors={fieldState.error}
|
||||||
className="col-span-2"
|
className="col-span-2"
|
||||||
|
|||||||
@ -3,7 +3,7 @@ const path = require('path');
|
|||||||
const i18nConfig = {
|
const i18nConfig = {
|
||||||
i18n: {
|
i18n: {
|
||||||
defaultLocale: 'en',
|
defaultLocale: 'en',
|
||||||
locales: ['bn', 'da', 'de', 'en', 'es', 'fr', 'hi', 'it', 'kn', 'pl', 'ta', 'tr', 'zh'],
|
locales: ['ar', 'bn', 'da', 'de', 'en', 'es', 'fr', 'hi', 'it', 'kn', 'pl', 'ta', 'tr', 'zh'],
|
||||||
},
|
},
|
||||||
nsSeparator: '.',
|
nsSeparator: '.',
|
||||||
localePath: path.resolve('./public/locales'),
|
localePath: path.resolve('./public/locales'),
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import NextDocument, { DocumentContext, Head, Html, Main, NextScript } from 'nex
|
|||||||
const Document: NextPage = () => (
|
const Document: NextPage = () => (
|
||||||
<Html>
|
<Html>
|
||||||
<Head />
|
<Head />
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<Main />
|
<Main />
|
||||||
<NextScript />
|
<NextScript />
|
||||||
|
|||||||
358
client/public/locales/ar/builder.json
Normal file
358
client/public/locales/ar/builder.json
Normal file
@ -0,0 +1,358 @@
|
|||||||
|
{
|
||||||
|
"common": {
|
||||||
|
"actions": {
|
||||||
|
"add": "إضافة {{فقرة}} جديدة",
|
||||||
|
"delete": "حذة {{الفقرة}}",
|
||||||
|
"edit": "تحرير {{الفقرة}}"
|
||||||
|
},
|
||||||
|
"columns": {
|
||||||
|
"heading": "الأعمدة",
|
||||||
|
"tooltip": "تغيير عدد الأعمدة"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"date": {
|
||||||
|
"label": "التاريخ"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"label": "التفاصيل"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"label": "البريد الإلكتروني"
|
||||||
|
},
|
||||||
|
"end-date": {
|
||||||
|
"help-text": "اترك هذا الحقل فارغًا ، إذا كان لا يزال موجودًا",
|
||||||
|
"label": "تاريخ الانتهاء"
|
||||||
|
},
|
||||||
|
"keywords": {
|
||||||
|
"label": "الكلمات الرئيسية"
|
||||||
|
},
|
||||||
|
"level": {
|
||||||
|
"label": "مستوى"
|
||||||
|
},
|
||||||
|
"levelNum": {
|
||||||
|
"label": "المستوى (Number)"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"label": "الاسم"
|
||||||
|
},
|
||||||
|
"phone": {
|
||||||
|
"label": "رقم الهاتف"
|
||||||
|
},
|
||||||
|
"position": {
|
||||||
|
"label": "المنصب"
|
||||||
|
},
|
||||||
|
"start-date": {
|
||||||
|
"label": "تاريخ البداية"
|
||||||
|
},
|
||||||
|
"subtitle": {
|
||||||
|
"label": "العنوان الفرعي"
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"label": "الملخص"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"label": "العنوان"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"label": "موقع الويب"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"glossary": {
|
||||||
|
"page": "الصفحة"
|
||||||
|
},
|
||||||
|
"list": {
|
||||||
|
"actions": {
|
||||||
|
"delete": "حذف",
|
||||||
|
"duplicate": "نسخه مطابقه",
|
||||||
|
"edit": "تعديل"
|
||||||
|
},
|
||||||
|
"empty-text": "هذه القائمة فارغة."
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"delete-item": "هل أنت متأكد أنك تريد حذف هذا العنصر؟ لا يمكن التراجع عن هذا الإجراء.",
|
||||||
|
"delete-section": "حذف القسم",
|
||||||
|
"rename-section": "إعادة تسمية القسم",
|
||||||
|
"toggle-visibility": "تبديل الرؤية"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"controller": {
|
||||||
|
"tooltip": {
|
||||||
|
"center-artboard": "لوحة الوسط",
|
||||||
|
"copy-link": "انسخ الرابط للسيرة الذاتية",
|
||||||
|
"export-pdf": "تصدير PDF",
|
||||||
|
"toggle-orientation": "تبديل اتجاه الصفحة",
|
||||||
|
"toggle-page-break-line": "تبديل سطر الصفحة",
|
||||||
|
"toggle-sidebars": "تبديل الشريط الجانبي",
|
||||||
|
"zoom-in": "تكبير",
|
||||||
|
"zoom-out": "تصغير"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"header": {
|
||||||
|
"menu": {
|
||||||
|
"delete": "حذف",
|
||||||
|
"duplicate": "تكرار",
|
||||||
|
"rename": "إعادة تسمية",
|
||||||
|
"share-link": "مشاركة الرّابط",
|
||||||
|
"tooltips": {
|
||||||
|
"delete": "هل أنت متأكد أنك تريد حذف هذا العنصر؟ لا يمكن التراجع عن هذا الإجراء.",
|
||||||
|
"share-link": "أنت بحاجة إلى تغيير رؤية سيرتك الذاتية للعامة لجعلها مرئية للآخرين."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"leftSidebar": {
|
||||||
|
"sections": {
|
||||||
|
"awards": {
|
||||||
|
"form": {
|
||||||
|
"awarder": {
|
||||||
|
"label": "جائزة"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"basics": {
|
||||||
|
"actions": {
|
||||||
|
"photo-filters": "فلاتر الصور"
|
||||||
|
},
|
||||||
|
"heading": "الأساسيات",
|
||||||
|
"headline": {
|
||||||
|
"label": "العنوان الرئيسي"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"label": "الاسم الكامل"
|
||||||
|
},
|
||||||
|
"photo-filters": {
|
||||||
|
"effects": {
|
||||||
|
"border": {
|
||||||
|
"label": "الحدود"
|
||||||
|
},
|
||||||
|
"grayscale": {
|
||||||
|
"label": "رمادي"
|
||||||
|
},
|
||||||
|
"heading": "مؤثرات"
|
||||||
|
},
|
||||||
|
"shape": {
|
||||||
|
"heading": "الشكل"
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"heading": "الحجم (بالبكسل)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"photo-upload": {
|
||||||
|
"tooltip": {
|
||||||
|
"remove": "إزالة صورة",
|
||||||
|
"upload": "رفع صورة"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"certifications": {
|
||||||
|
"form": {
|
||||||
|
"issuer": {
|
||||||
|
"label": "جهة الإصدار"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"education": {
|
||||||
|
"form": {
|
||||||
|
"area-study": {
|
||||||
|
"label": "مجال الدراسة"
|
||||||
|
},
|
||||||
|
"courses": {
|
||||||
|
"label": "دورات"
|
||||||
|
},
|
||||||
|
"degree": {
|
||||||
|
"label": "الدرجة العلمية"
|
||||||
|
},
|
||||||
|
"grade": {
|
||||||
|
"label": "الدرجة / التقييم"
|
||||||
|
},
|
||||||
|
"institution": {
|
||||||
|
"label": "المؤسسة/الجامعة/المعهد"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"location": {
|
||||||
|
"address": {
|
||||||
|
"label": "العنوان"
|
||||||
|
},
|
||||||
|
"city": {
|
||||||
|
"label": "المدينة"
|
||||||
|
},
|
||||||
|
"country": {
|
||||||
|
"label": "البلد/الدولة"
|
||||||
|
},
|
||||||
|
"heading": "المكان",
|
||||||
|
"postal-code": {
|
||||||
|
"label": "الرمز البريدي"
|
||||||
|
},
|
||||||
|
"region": {
|
||||||
|
"label": "المنطقة"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"profiles": {
|
||||||
|
"form": {
|
||||||
|
"network": {
|
||||||
|
"label": "الشبكة"
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"label": "اسم المستخدم"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "الملفات الشخصية",
|
||||||
|
"heading_one": "الملف الشخصي"
|
||||||
|
},
|
||||||
|
"publications": {
|
||||||
|
"form": {
|
||||||
|
"publisher": {
|
||||||
|
"label": "الناشر"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"references": {
|
||||||
|
"form": {
|
||||||
|
"relationship": {
|
||||||
|
"label": "العلاقة"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"section": {
|
||||||
|
"heading": "القسم"
|
||||||
|
},
|
||||||
|
"volunteer": {
|
||||||
|
"form": {
|
||||||
|
"organization": {
|
||||||
|
"label": "المنظمة/المؤسسة"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rightSidebar": {
|
||||||
|
"sections": {
|
||||||
|
"css": {
|
||||||
|
"heading": "تنسيقات CSS مخصصة"
|
||||||
|
},
|
||||||
|
"export": {
|
||||||
|
"heading": "تصدير",
|
||||||
|
"json": {
|
||||||
|
"primary": "JSON",
|
||||||
|
"secondary": "قم بتنزيل نسخة بصيغة JSON من سيرتك الذاتية والتي يمكن استيرادها مرة أخرى إلى Reactive Resume."
|
||||||
|
},
|
||||||
|
"pdf": {
|
||||||
|
"loading": {
|
||||||
|
"primary": "توليد ملف PDF",
|
||||||
|
"secondary": "يرجى الانتظار حتى يتم إنشاء ملف PDF الخاص بك ، فقد يستغرق هذا ما يصل إلى 15 ثانية."
|
||||||
|
},
|
||||||
|
"normal": {
|
||||||
|
"primary": "ملف - PDF",
|
||||||
|
"secondary": "قم بتنزيل ملف PDF لسيرتك الذاتية بحيث يمكنك طباعته وإرساله إلى وظيفة أحلامك. لا يمكن استيراد هذا الملف مرة أخرى لمزيد من التحرير."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"layout": {
|
||||||
|
"heading": "تخطيط",
|
||||||
|
"tooltip": {
|
||||||
|
"reset-layout": "إعادة تعيين التخطيط"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"links": {
|
||||||
|
"bugs-features": {
|
||||||
|
"body": "شيء يمنعك من عمل سيرة ذاتية؟ أو هل لديك فكرة رائعة لتضيفها؟ إطرح المشكلة على GitHub للبدء.",
|
||||||
|
"button": "صفحة المشاكل على \"GitHub\"",
|
||||||
|
"heading": "خلل برمجي؟ طلب وظائف ومميزات مخصصة؟"
|
||||||
|
},
|
||||||
|
"donate": {
|
||||||
|
"body": "إذا أعجبك استخدام Resctive Resume ، فالرجاء التفكير في التبرع بأكبر قدر ممكن من أجل الحفاظ على استمرار التطبيق وتشغيله ، بدون إعلانات وبشكل مجاني إلى الأبد.",
|
||||||
|
"button": "إشتر لي قهوة",
|
||||||
|
"heading": "تبرع الى Reactive Resume"
|
||||||
|
},
|
||||||
|
"github": "الشفرة المصدرية",
|
||||||
|
"heading": "الروابط"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"global": {
|
||||||
|
"date": {
|
||||||
|
"primary": "التاريخ",
|
||||||
|
"secondary": "صيغة التاريخ لاستخدامه عبر التطبيق"
|
||||||
|
},
|
||||||
|
"heading": "عام",
|
||||||
|
"language": {
|
||||||
|
"primary": "اللغة",
|
||||||
|
"secondary": "اعرض اللغة لاستخدامها عبر التطبيق"
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"primary": "التصميم"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "الإعدادات",
|
||||||
|
"page": {
|
||||||
|
"break-line": {
|
||||||
|
"primary": "خط فاصل",
|
||||||
|
"secondary": "اعرض خط في كل الصفحات لتحديد ارتفاع صفحة A4"
|
||||||
|
},
|
||||||
|
"heading": "صفحة",
|
||||||
|
"orientation": {
|
||||||
|
"disabled": "ليس له تأثير عندما تكون هناك صفحة واحدة فقط",
|
||||||
|
"primary": "الإتجاة",
|
||||||
|
"secondary": "ما إذا كان سيتم عرض الصفحات أفقيًا أو رأسيًا"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resume": {
|
||||||
|
"heading": "سيرة ذاتية",
|
||||||
|
"reset": {
|
||||||
|
"primary": "إعادة تعيين كل شيء",
|
||||||
|
"secondary": "أرتكبت الكثير من الأخطاء؟ انقر هنا لإعادة تعيين جميع التغييرات والبدء من نقطة الصفر. كن حذرا ، هذا الإجراء لا يمكن عكسه."
|
||||||
|
},
|
||||||
|
"sample": {
|
||||||
|
"primary": "تحميل نموذج البيانات",
|
||||||
|
"secondary": "لست متأكدا من أين تبدأ؟ انقر هنا لتحميل بعض عينات البيانات لترى كيف تبدو سيرة ذاتية كاملة."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sharing": {
|
||||||
|
"heading": "جاري المشاركة",
|
||||||
|
"short-url": {
|
||||||
|
"label": "تفضل عنوان URL قصير"
|
||||||
|
},
|
||||||
|
"visibility": {
|
||||||
|
"subtitle": "اسمح لأي شخص لديه الرابط لعرض سيرتك الذاتية",
|
||||||
|
"title": "عام"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"heading": "قوالب"
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"form": {
|
||||||
|
"background": {
|
||||||
|
"label": "الخلفية"
|
||||||
|
},
|
||||||
|
"primary": {
|
||||||
|
"label": "اساسي"
|
||||||
|
},
|
||||||
|
"text": {
|
||||||
|
"label": "نص"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "السمة"
|
||||||
|
},
|
||||||
|
"typography": {
|
||||||
|
"form": {
|
||||||
|
"font-family": {
|
||||||
|
"label": "اسم الخط"
|
||||||
|
},
|
||||||
|
"font-size": {
|
||||||
|
"label": "حجم الخط"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "الطباعة والخطوط",
|
||||||
|
"widgets": {
|
||||||
|
"body": {
|
||||||
|
"label": "المتن"
|
||||||
|
},
|
||||||
|
"headings": {
|
||||||
|
"label": "العناوين"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
client/public/locales/ar/dashboard.json
Normal file
25
client/public/locales/ar/dashboard.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"create-resume": {
|
||||||
|
"subtitle": "البدء من الصفر",
|
||||||
|
"title": "إنشاء سيرة ذاتية جديدة"
|
||||||
|
},
|
||||||
|
"import-external": {
|
||||||
|
"subtitle": "LinkedIn ، سيرة ذاتية من ملف JSON ،سيرة ذاتية من Reactive Resume",
|
||||||
|
"title": "استيراد من مصادر خارجية"
|
||||||
|
},
|
||||||
|
"resume": {
|
||||||
|
"menu": {
|
||||||
|
"delete": "حذف",
|
||||||
|
"duplicate": "إنشاء نسخة مطابقة",
|
||||||
|
"open": "فتح",
|
||||||
|
"rename": "إعادة تسمية",
|
||||||
|
"share-link": "مشاركة الرّابط",
|
||||||
|
"tooltips": {
|
||||||
|
"delete": "هل أنت متأكد أنك تريد حذف ملف السيرة الذاتية هذا؟ لا يمكن التراجع عن هذا الإجراء.",
|
||||||
|
"share-link": "أنت بحاجة إلى تغيير خصوصية سيرتك الذاتية إلى عامة لجعلها مرئية للآخرين."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"timestamp": "آخر تحديث تم في {{timestamp}}"
|
||||||
|
},
|
||||||
|
"title": "لوحة التحكم"
|
||||||
|
}
|
||||||
41
client/public/locales/ar/landing.json
Normal file
41
client/public/locales/ar/landing.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"actions": {
|
||||||
|
"app": "انتقل إلى التطبيق",
|
||||||
|
"login": "تسجيل الدخول",
|
||||||
|
"logout": "تسجيل الخروج",
|
||||||
|
"register": "التسجيل"
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"heading": "الخصائص",
|
||||||
|
"list": {
|
||||||
|
"ads": "بدون اعلانات",
|
||||||
|
"export": "قم بتصدير سيرتك الذاتية إلى تنسيق JSON أو PDF",
|
||||||
|
"free": "مجاني، إلى الأبد",
|
||||||
|
"import": "استيراد البيانات من LinkedIn أو ملف JSON",
|
||||||
|
"languages": "متعدد اللغات",
|
||||||
|
"more": "ومميزات مثيرة أكثر، <1>للمزيد إقرأ هنا</1>",
|
||||||
|
"tracking": "لا يوجد تتبع للمستخدم"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"links": {
|
||||||
|
"heading": "الروابط",
|
||||||
|
"links": {
|
||||||
|
"donate": "تبرّع",
|
||||||
|
"github": "الشفرة المصدرية",
|
||||||
|
"privacy": "سياسة الخصوصية",
|
||||||
|
"service": "شروط الإستخدام"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"screenshots": {
|
||||||
|
"heading": "لقطات الشاشة"
|
||||||
|
},
|
||||||
|
"testimonials": {
|
||||||
|
"heading": "الآراء والتقييمات",
|
||||||
|
"body": "سواء أكان ذلك جيدًا أم سيئًا ، أود أن أسمع رأيك في \"السيرة الذاتية التفاعلية\" وكيف كانت التجربة بالنسبة لك.<br/>فيما يلي بعض الرسائل المرسلة بواسطة مستخدمين من جميع أنحاء العالم.",
|
||||||
|
"contact": "يمكنك التواصل معي من خلال <1> بريدي الإلكتروني</1> أو من خلال نموذج الاتصال الموجود على <3> موقع الويب الخاص بي</3>."
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"body": "Reactive Resume هو منشئ سيرة ذاتية مجاني ومفتوح المصدر تم إنشاؤه لجعل المهام الروتينية لإنشاء وتحديث ومشاركة سيرتك الذاتية سهلة مثل 1 و 2 و 3. باستخدام هذا التطبيق ، يمكنك إنشاء سيرة ذاتية متعددة ومشاركتها مع جهات التوظيف أو الأصدقاء من خلال رابط فريد وطباعته كملف PDF ، كل ذلك مجانًا ، بدون إعلانات ، بدون تتبع ، دون فقدان سلامة وخصوصية بياناتك.",
|
||||||
|
"heading": "الملخص"
|
||||||
|
}
|
||||||
|
}
|
||||||
136
client/public/locales/ar/modals.json
Normal file
136
client/public/locales/ar/modals.json
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
{
|
||||||
|
"auth": {
|
||||||
|
"forgot-password": {
|
||||||
|
"actions": {
|
||||||
|
"send-email": "إرسال بريد لإعادة تعيين كلمة المرور"
|
||||||
|
},
|
||||||
|
"body": "يرجى أدخال عنوان البريد الإلكتروني المرتبط بالحساب الذي ترغب في استعادته.",
|
||||||
|
"form": {
|
||||||
|
"email": {
|
||||||
|
"label": "البريد الإلكتروني"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "نسيت كلمة المرور؟",
|
||||||
|
"help-text": "إذا كان حسابك موجود، سوف يصلك بريد يحتوي على رابط إستعادة كلمة المرور."
|
||||||
|
},
|
||||||
|
"login": {
|
||||||
|
"actions": {
|
||||||
|
"login": "تسجيل الدخول",
|
||||||
|
"google": "تسجيل الدخول باستخدام حساب جوجل"
|
||||||
|
},
|
||||||
|
"body": "يرجى إدخال اسم المستخدم وكلمة المرور المرتبطين بحسابك لتسجيل الدخول والوصول إلى السير الذاتية وإدارتها ومشاركتها.",
|
||||||
|
"form": {
|
||||||
|
"password": {
|
||||||
|
"label": "كلمة المرور"
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"help-text": "يمكنك أيضا إدخال عنوان بريدك الألكتروني",
|
||||||
|
"label": "اسم المستخدم"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "تسجيل الدخول إلى حسابك",
|
||||||
|
"recover-text": "في حالة نسيت كلمة المرور الخاصة بك ، يمكنك <1> استعادة حسابك</1> من هنا.",
|
||||||
|
"register-text": "إذا لم يكن لديك حساب ، يمكنك <1> إنشاء حساب</1> من هنا."
|
||||||
|
},
|
||||||
|
"register": {
|
||||||
|
"actions": {
|
||||||
|
"register": "التسجيل",
|
||||||
|
"google": "التسجيل بإستخدام حساب جوجل"
|
||||||
|
},
|
||||||
|
"body": "الرجاء إدخال معلوماتك الشخصية لإنشاء حساب.",
|
||||||
|
"form": {
|
||||||
|
"confirm-password": {
|
||||||
|
"label": "تأكيد كلمة المرور"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"label": "عنوان البريد الالكترونى"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"label": "الاسم الكامل"
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"label": "كلمة المرور"
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"label": "اسم المستخدم"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "انشئ حساب",
|
||||||
|
"loginText": "إذا كان لديك حساب بالفعل ، يمكنك <1> تسجيل الدخول من هنا</1>."
|
||||||
|
},
|
||||||
|
"reset-password": {
|
||||||
|
"actions": {
|
||||||
|
"set-password": "تعيين كلمة سر جديدة"
|
||||||
|
},
|
||||||
|
"body": "أدخل كلمة مرور جديدة لحسابك.",
|
||||||
|
"form": {
|
||||||
|
"confirm-password": {
|
||||||
|
"label": "تأكيد كلمة المرور"
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"label": "كلمة المرور"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "إعادة تعيين كلمة المرور الخاصة بك"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dashboard": {
|
||||||
|
"create-resume": {
|
||||||
|
"actions": {
|
||||||
|
"create-resume": "إنشاء سيرة ذاتية"
|
||||||
|
},
|
||||||
|
"body": "ابدأ في بناء سيرتك الذاتية بإعطائها اسمًا. يمكن أن يكون إشارة إلى الوظيفة الذي تتقدم إليها ، أو اسم وجبتك الخفيفة المفضلة.",
|
||||||
|
"form": {
|
||||||
|
"name": {
|
||||||
|
"label": "الاسم"
|
||||||
|
},
|
||||||
|
"public": {
|
||||||
|
"label": "هل يمكن لأي احد الوصول إليها؟"
|
||||||
|
},
|
||||||
|
"slug": {
|
||||||
|
"label": "الاسم اللطيف"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "أنشئ سيرة ذاتية جديدة"
|
||||||
|
},
|
||||||
|
"import-external": {
|
||||||
|
"heading": "استيراد من مصادر خارجية",
|
||||||
|
"json-resume": {
|
||||||
|
"actions": {
|
||||||
|
"upload-json": "تحميل JSON"
|
||||||
|
},
|
||||||
|
"body": "إذا كان لديك ملف سيرة ذاتية بصيغة JSON تم التحقق من صحته <1></1> جاهز للعمل ، يمكنك استخدامه لتسريع عملية الإنشاء على Resctive Resume. انقر فوق الزر أدناه وقم بتحميل ملف JSON صالح للبدء.",
|
||||||
|
"heading": "استيراد من ملف JSON"
|
||||||
|
},
|
||||||
|
"linkedin": {
|
||||||
|
"actions": {
|
||||||
|
"upload-archive": "تحميل ملف zip مضغوط"
|
||||||
|
},
|
||||||
|
"body": "يمكنك توفير الوقت عن طريق تصدير بياناتك من LinkedIn واستخدامها لملء الحقول تلقائيًا في Reactive Resume. توجه إلى <1> خصوصية البيانات</1> على LinkedIn واطلب تحميل بياناتك بشكل مضغوط ZIP. بمجرد توفره ، قم برفع ملف ZIP أدناه.",
|
||||||
|
"heading": "استيراد من LinkedIn"
|
||||||
|
},
|
||||||
|
"reactive-resume": {
|
||||||
|
"actions": {
|
||||||
|
"upload-json": "رفع JSON",
|
||||||
|
"upload-json-v2": "رفع JSON من v2"
|
||||||
|
},
|
||||||
|
"body": "إذا كان لديك JSON تم تصديره بالإصدار الحالي من Reactive Resume ، فيمكنك استيراده مرة أخرى هنا للحصول على نسخة قابلة للتحرير مرة أخرى.",
|
||||||
|
"heading": "استيراد من Reactive Resume"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rename-resume": {
|
||||||
|
"actions": {
|
||||||
|
"rename-resume": "إعادة تسمية السيرة الذاتية"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"name": {
|
||||||
|
"label": "الاسم"
|
||||||
|
},
|
||||||
|
"slug": {
|
||||||
|
"label": "الاسم اللطيف"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "أعد تسمية سيرتك الذاتية"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
358
client/public/locales/vi/builder.json
Normal file
358
client/public/locales/vi/builder.json
Normal file
@ -0,0 +1,358 @@
|
|||||||
|
{
|
||||||
|
"common": {
|
||||||
|
"actions": {
|
||||||
|
"add": "Thêm {{token}} mới",
|
||||||
|
"delete": "Xoá {{token}}",
|
||||||
|
"edit": "Sửa {{token}}"
|
||||||
|
},
|
||||||
|
"columns": {
|
||||||
|
"heading": "Cột",
|
||||||
|
"tooltip": "Sửa số cột"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"date": {
|
||||||
|
"label": "Ngày"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"label": "Mô tả"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"label": "Địa chỉ Email"
|
||||||
|
},
|
||||||
|
"end-date": {
|
||||||
|
"help-text": "Để trống chỗ này, nếu vẫn còn",
|
||||||
|
"label": "Ngày kết thúc"
|
||||||
|
},
|
||||||
|
"keywords": {
|
||||||
|
"label": "Từ khoá"
|
||||||
|
},
|
||||||
|
"level": {
|
||||||
|
"label": "Cập đọ"
|
||||||
|
},
|
||||||
|
"levelNum": {
|
||||||
|
"label": "Cấp độ (Số)"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"label": "Tên"
|
||||||
|
},
|
||||||
|
"phone": {
|
||||||
|
"label": "Số điện thoại"
|
||||||
|
},
|
||||||
|
"position": {
|
||||||
|
"label": "Chức vụ"
|
||||||
|
},
|
||||||
|
"start-date": {
|
||||||
|
"label": "Ngày bắt đầu"
|
||||||
|
},
|
||||||
|
"subtitle": {
|
||||||
|
"label": "Phụ đề"
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"label": "Tóm tắt"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"label": "Tiêu đề"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"label": "Website"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"glossary": {
|
||||||
|
"page": "Trang"
|
||||||
|
},
|
||||||
|
"list": {
|
||||||
|
"actions": {
|
||||||
|
"delete": "Xóa",
|
||||||
|
"duplicate": "Tạo bản sao",
|
||||||
|
"edit": "Chỉnh sửa"
|
||||||
|
},
|
||||||
|
"empty-text": "Danh sách này trống."
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"delete-item": "Bạn có chắc bạn muốn xóa mục này? Hành động này không thể hoàn tác.",
|
||||||
|
"delete-section": "Xóa phần",
|
||||||
|
"rename-section": "Đổi tên phần",
|
||||||
|
"toggle-visibility": "Bật tắt khả năng hiển thị"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"controller": {
|
||||||
|
"tooltip": {
|
||||||
|
"center-artboard": "Trung tâm Artboard",
|
||||||
|
"copy-link": "Sao chép liên kết để tiếp tục",
|
||||||
|
"export-pdf": "Xuất ra PDF",
|
||||||
|
"toggle-orientation": "Chuyển đổi hướng trang",
|
||||||
|
"toggle-page-break-line": "Chuyển đổi dòng ngắt trang",
|
||||||
|
"toggle-sidebars": "Bật/tắt Sidebar",
|
||||||
|
"zoom-in": "Phóng to",
|
||||||
|
"zoom-out": "Thu nhỏ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"header": {
|
||||||
|
"menu": {
|
||||||
|
"delete": "Xóa",
|
||||||
|
"duplicate": "Tạo bản sao",
|
||||||
|
"rename": "Đổi tên",
|
||||||
|
"share-link": "Chia sẻ Liên kết",
|
||||||
|
"tooltips": {
|
||||||
|
"delete": "Bạn có chắc bạn muốn xóa mục này? Hành động này không thể hoàn tác.",
|
||||||
|
"share-link": "Bạn cần thay đổi chế độ hiển thị sơ yếu lý lịch của bạn thành công khai để những người khác có thể nhìn thấy nó."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"leftSidebar": {
|
||||||
|
"sections": {
|
||||||
|
"awards": {
|
||||||
|
"form": {
|
||||||
|
"awarder": {
|
||||||
|
"label": "Bên trao giải"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"basics": {
|
||||||
|
"actions": {
|
||||||
|
"photo-filters": "Bộ lọc ảnh"
|
||||||
|
},
|
||||||
|
"heading": "Cơ bản",
|
||||||
|
"headline": {
|
||||||
|
"label": "Tiêu đề"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"label": "Họ và tên"
|
||||||
|
},
|
||||||
|
"photo-filters": {
|
||||||
|
"effects": {
|
||||||
|
"border": {
|
||||||
|
"label": "Viền"
|
||||||
|
},
|
||||||
|
"grayscale": {
|
||||||
|
"label": "Thang độ xám"
|
||||||
|
},
|
||||||
|
"heading": "Hiệu ứng"
|
||||||
|
},
|
||||||
|
"shape": {
|
||||||
|
"heading": "Hình dạng"
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"heading": "Kích cỡ (đơn vị: px)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"photo-upload": {
|
||||||
|
"tooltip": {
|
||||||
|
"remove": "Xóa hình ảnh",
|
||||||
|
"upload": "Đăng ảnh lên"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"certifications": {
|
||||||
|
"form": {
|
||||||
|
"issuer": {
|
||||||
|
"label": "Bên cấp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"education": {
|
||||||
|
"form": {
|
||||||
|
"area-study": {
|
||||||
|
"label": "Lĩnh vực đào tạo"
|
||||||
|
},
|
||||||
|
"courses": {
|
||||||
|
"label": "Khóa học"
|
||||||
|
},
|
||||||
|
"degree": {
|
||||||
|
"label": "Bằng cấp"
|
||||||
|
},
|
||||||
|
"grade": {
|
||||||
|
"label": "Lớp"
|
||||||
|
},
|
||||||
|
"institution": {
|
||||||
|
"label": "Trường"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"location": {
|
||||||
|
"address": {
|
||||||
|
"label": "Địa chỉ"
|
||||||
|
},
|
||||||
|
"city": {
|
||||||
|
"label": "Thành phố"
|
||||||
|
},
|
||||||
|
"country": {
|
||||||
|
"label": "Quốc gia"
|
||||||
|
},
|
||||||
|
"heading": "Địa điểm",
|
||||||
|
"postal-code": {
|
||||||
|
"label": "Mã bưu chính"
|
||||||
|
},
|
||||||
|
"region": {
|
||||||
|
"label": "Khu vực"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"profiles": {
|
||||||
|
"form": {
|
||||||
|
"network": {
|
||||||
|
"label": "Mạng lưới"
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"label": "Tên đăng nhập"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "Hồ sơ cá nhân",
|
||||||
|
"heading_one": "Hồ sơ cá nhân"
|
||||||
|
},
|
||||||
|
"publications": {
|
||||||
|
"form": {
|
||||||
|
"publisher": {
|
||||||
|
"label": "Nhà xuất bản"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"references": {
|
||||||
|
"form": {
|
||||||
|
"relationship": {
|
||||||
|
"label": "Mối quan hệ"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"section": {
|
||||||
|
"heading": "Đề mục"
|
||||||
|
},
|
||||||
|
"volunteer": {
|
||||||
|
"form": {
|
||||||
|
"organization": {
|
||||||
|
"label": "Tổ chức"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rightSidebar": {
|
||||||
|
"sections": {
|
||||||
|
"css": {
|
||||||
|
"heading": "Tùy chỉnh CSS"
|
||||||
|
},
|
||||||
|
"export": {
|
||||||
|
"heading": "Xuất ra",
|
||||||
|
"json": {
|
||||||
|
"primary": "JSON",
|
||||||
|
"secondary": "Tải sơ yếu lý lịch của bạn dưới dạng JSON, với định dạng này bạn có thể nhập lại vào Reactive Resume."
|
||||||
|
},
|
||||||
|
"pdf": {
|
||||||
|
"loading": {
|
||||||
|
"primary": "Đang tạo PDF",
|
||||||
|
"secondary": "Vui lòng đợi khi tệp PDF của bạn được tạo, quá trình này có thể mất tới 15 giây."
|
||||||
|
},
|
||||||
|
"normal": {
|
||||||
|
"primary": "PDF",
|
||||||
|
"secondary": "Tải sơ yếu lý lịch của bạn dưới dạng PDF, với định dạng này bạn có thể in và gửi đi để xin việc. Không thể nhập lại tệp này vào ứng dụng để chỉnh sửa."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"layout": {
|
||||||
|
"heading": "Bố cục",
|
||||||
|
"tooltip": {
|
||||||
|
"reset-layout": "Đặt lại bố cục"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"links": {
|
||||||
|
"bugs-features": {
|
||||||
|
"body": "Điều gì ngăn cản bạn làm một bản sơ yếu lý lịch? Hoặc bạn có một ý tưởng tuyệt vời để đề xuất? Hãy nêu ý kiến của mình trên GitHub.",
|
||||||
|
"button": "Vấn đề Github",
|
||||||
|
"heading": "Lỗi? Yêu cầu tính năng?"
|
||||||
|
},
|
||||||
|
"donate": {
|
||||||
|
"body": "Nếu bạn thích sử dụng Reactive Resume, vui lòng cân nhắc quyên góp nhiều nhất có thể cho mục đích duy trì ứng dụng luôn hoạt động, không có quảng cáo và miễn phí vĩnh viễn.",
|
||||||
|
"button": "Mua cho tôi một ly cà phê",
|
||||||
|
"heading": "Quyên góp cho Reactive Resume"
|
||||||
|
},
|
||||||
|
"github": "Mã nguồn",
|
||||||
|
"heading": "Liên kết"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"global": {
|
||||||
|
"date": {
|
||||||
|
"primary": "Ngày tháng",
|
||||||
|
"secondary": "Định dạng ngày tháng để sử dụng trên ứng dụng"
|
||||||
|
},
|
||||||
|
"heading": "Chung",
|
||||||
|
"language": {
|
||||||
|
"primary": "Ngôn ngữ",
|
||||||
|
"secondary": "Ngôn ngữ hiển thị để sử dụng trên ứng dụng"
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"primary": "Giao diện"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "Cài đặt",
|
||||||
|
"page": {
|
||||||
|
"break-line": {
|
||||||
|
"primary": "Ngắt dòng",
|
||||||
|
"secondary": "Hiển thị một dòng chữ trên tất cả các trang để đánh dấu chiều cao của trang A4"
|
||||||
|
},
|
||||||
|
"heading": "Trang",
|
||||||
|
"orientation": {
|
||||||
|
"disabled": "Không có tác dụng khi chỉ có một trang",
|
||||||
|
"primary": "Hướng giấy",
|
||||||
|
"secondary": "Hiển thị các trang theo chiều ngang hay chiều dọc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resume": {
|
||||||
|
"heading": "Sơ yếu lý lịch",
|
||||||
|
"reset": {
|
||||||
|
"primary": "Đặt lại mọi thứ",
|
||||||
|
"secondary": "Bạn đã mắc quá nhiều lỗi? Nhấn vào đây để đặt lại tất cả các thay đổi và bắt đầu lại từ đầu. Hãy cẩn thận, hành động này không thể hoàn lại."
|
||||||
|
},
|
||||||
|
"sample": {
|
||||||
|
"primary": "Thêm dữ liệu mẫu",
|
||||||
|
"secondary": "Không chắc chắn bắt đầu từ đâu? Nhấp vào đây để tải một số dữ liệu mẫu để xem một bản sơ yếu lý lịch hoàn chỉnh trông như thế nào."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sharing": {
|
||||||
|
"heading": "Chia sẻ",
|
||||||
|
"short-url": {
|
||||||
|
"label": "Ưu tiên URL ngắn"
|
||||||
|
},
|
||||||
|
"visibility": {
|
||||||
|
"subtitle": "Cho phép bất kỳ ai có liên kết xem sơ yếu lý lịch của bạn",
|
||||||
|
"title": "Công khai"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"heading": "Mẫu"
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"form": {
|
||||||
|
"background": {
|
||||||
|
"label": "Nền"
|
||||||
|
},
|
||||||
|
"primary": {
|
||||||
|
"label": "Chính"
|
||||||
|
},
|
||||||
|
"text": {
|
||||||
|
"label": "Văn bản"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "Chủ đề"
|
||||||
|
},
|
||||||
|
"typography": {
|
||||||
|
"form": {
|
||||||
|
"font-family": {
|
||||||
|
"label": "Phông chữ"
|
||||||
|
},
|
||||||
|
"font-size": {
|
||||||
|
"label": "Cỡ chữ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "Kiểu Chữ",
|
||||||
|
"widgets": {
|
||||||
|
"body": {
|
||||||
|
"label": "Nội dung"
|
||||||
|
},
|
||||||
|
"headings": {
|
||||||
|
"label": "Tiêu đề"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -8,12 +8,12 @@
|
|||||||
"footer": {
|
"footer": {
|
||||||
"credit": "Một dự án làm với đam mê của <1> Amruth Pillai</1>",
|
"credit": "Một dự án làm với đam mê của <1> Amruth Pillai</1>",
|
||||||
"language": {
|
"language": {
|
||||||
"missing": "Không có ngôn ngữ của bạn?"
|
"missing": "Thiếu ngôn ngữ của bạn?"
|
||||||
},
|
},
|
||||||
"license": "Vì cộng đồng, cho cộng đồng."
|
"license": "Vì cộng đồng, cho cộng đồng."
|
||||||
},
|
},
|
||||||
"markdown": {
|
"markdown": {
|
||||||
"help-text": "Phần này hỗ trợ định dạng <1> markdown </1>."
|
"help-text": "Phần này hỗ trợ định dạng <1>markdown</1>."
|
||||||
},
|
},
|
||||||
"date": {
|
"date": {
|
||||||
"present": "Hiện tại"
|
"present": "Hiện tại"
|
||||||
|
|||||||
25
client/public/locales/vi/dashboard.json
Normal file
25
client/public/locales/vi/dashboard.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"create-resume": {
|
||||||
|
"subtitle": "Bắt đầu từ đầu",
|
||||||
|
"title": "Tạo sơ yếu lý lịch mới"
|
||||||
|
},
|
||||||
|
"import-external": {
|
||||||
|
"subtitle": "LinkedIn, JSON Resume, Reactive Resume",
|
||||||
|
"title": "Kết nhập dữ liệu từ nguồn ngoài"
|
||||||
|
},
|
||||||
|
"resume": {
|
||||||
|
"menu": {
|
||||||
|
"delete": "Xóa",
|
||||||
|
"duplicate": "Nhân bản",
|
||||||
|
"open": "Mở",
|
||||||
|
"rename": "Đổi tên",
|
||||||
|
"share-link": "Chia sẻ Liên kết",
|
||||||
|
"tooltips": {
|
||||||
|
"delete": "Bạn có chắc muốn xóa bản sơ yếu này? Hành động này không thể hoàn tác.",
|
||||||
|
"share-link": "Bạn cần thay đổi chế độ hiển thị sơ yếu lý lịch của bạn thành công khai để những người khác có thể nhìn thấy nó."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"timestamp": "Lần cập nhật cuối cách đây {{timestamp}}"
|
||||||
|
},
|
||||||
|
"title": "Bảng điều khiển"
|
||||||
|
}
|
||||||
41
client/public/locales/vi/landing.json
Normal file
41
client/public/locales/vi/landing.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"actions": {
|
||||||
|
"app": "Mở ứng dụng",
|
||||||
|
"login": "Đăng nhập",
|
||||||
|
"logout": "Đăng xuất",
|
||||||
|
"register": "Đăng ký"
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"heading": "Các tính năng",
|
||||||
|
"list": {
|
||||||
|
"ads": "Không quảng cáo",
|
||||||
|
"export": "Xuất sơ yếu lý lịch của bạn sang định dạng JSON hoặc PDF",
|
||||||
|
"free": "Miễn phí trọn đời",
|
||||||
|
"import": "Kết nhập dữ liệu từ LinkedIn, JSON Resume",
|
||||||
|
"languages": "Có thể hiển thị bằng nhiều ngôn ngữ",
|
||||||
|
"more": "Và nhiều tính năng thú vị khác, <1>đọc tất cả về ứng dụng ở đây</1>",
|
||||||
|
"tracking": "Không theo dõi người dùng"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"links": {
|
||||||
|
"heading": "Liên kết",
|
||||||
|
"links": {
|
||||||
|
"donate": "Quyên góp",
|
||||||
|
"github": "Mã nguồn",
|
||||||
|
"privacy": "Chính sách bảo mật",
|
||||||
|
"service": "Điều khoản dịch vụ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"screenshots": {
|
||||||
|
"heading": "Ảnh chụp màn hình"
|
||||||
|
},
|
||||||
|
"testimonials": {
|
||||||
|
"heading": "Ý kiến đánh giá",
|
||||||
|
"body": "Dù tốt hay xấu, tôi rất muốn nghe ý kiến của bạn về Reactive Resume và trải nghiệm của bạn như thế nào.<br/>Đây là một số thông điệp được gửi bởi người dùng trên khắp thế giới.",
|
||||||
|
"contact": "Bạn có thể liên hệ với tôi qua <1>email của tôi</1> hoặc thông qua biểu mẫu liên hệ trên <3>trang web của tôi</3>."
|
||||||
|
},
|
||||||
|
"summary": {
|
||||||
|
"body": "Reactive Resume là một trình tạo sơ yếu lý lịch mã nguồn mở và miễn phí được xây dựng để thực hiện các tác vụ thông thường như tạo, cập nhật và chia sẻ sơ yếu lý lịch của bạn dễ dàng như 1, 2, 3. Với ứng dụng này, bạn có thể tạo nhiều sơ yếu lý lịch, chia sẻ chúng với nhà tuyển dụng hoặc bạn bè thông qua một liên kết duy nhất và in nó dưới dạng PDF, tất cả đều miễn phí, không có quảng cáo, không theo dõi, mà không làm mất tính toàn vẹn và quyền riêng tư của dữ liệu của bạn.",
|
||||||
|
"heading": "Tổng kết"
|
||||||
|
}
|
||||||
|
}
|
||||||
136
client/public/locales/vi/modals.json
Normal file
136
client/public/locales/vi/modals.json
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
{
|
||||||
|
"auth": {
|
||||||
|
"forgot-password": {
|
||||||
|
"actions": {
|
||||||
|
"send-email": "Gửi email đặt lại mật khẩu"
|
||||||
|
},
|
||||||
|
"body": "Chỉ cần nhập địa chỉ email được liên kết với tài khoản bạn muốn khôi phục.",
|
||||||
|
"form": {
|
||||||
|
"email": {
|
||||||
|
"label": "Địa chỉ email"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "Quên mật khẩu?",
|
||||||
|
"help-text": "Nếu tài khoản tồn tại, bạn sẽ nhận được email có liên kết để đặt lại mật khẩu của mình."
|
||||||
|
},
|
||||||
|
"login": {
|
||||||
|
"actions": {
|
||||||
|
"login": "Đăng nhập",
|
||||||
|
"google": "Đăng nhập với Google"
|
||||||
|
},
|
||||||
|
"body": "Vui lòng nhập tên người dùng và mật khẩu được liên kết với tài khoản của bạn để đăng nhập và truy cập, quản lý và chia sẻ hồ sơ của bạn.",
|
||||||
|
"form": {
|
||||||
|
"password": {
|
||||||
|
"label": "Mật khẩu"
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"help-text": "Bạn cũng có thể nhập địa chỉ email của mình",
|
||||||
|
"label": "Tên đăng nhập"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "Đăng nhập vào tài khoản của bạn",
|
||||||
|
"recover-text": "Trong trường hợp bạn quên mật khẩu, bạn có thể <1>khôi phục tài khoản của mình</1> tại đây.",
|
||||||
|
"register-text": "Nếu chưa có tài khoản, bạn có thể <1>tạo một tài khoản</1> ở đây."
|
||||||
|
},
|
||||||
|
"register": {
|
||||||
|
"actions": {
|
||||||
|
"register": "Đăng ký",
|
||||||
|
"google": "Đăng ký bằng tài khoản Google"
|
||||||
|
},
|
||||||
|
"body": "Vui lòng nhập thông tin cá nhân của bạn để tạo tài khoản.",
|
||||||
|
"form": {
|
||||||
|
"confirm-password": {
|
||||||
|
"label": "Xác nhận mật khẩu"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"label": "Địa chỉ Email"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"label": "Họ và tên"
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"label": "Mật khẩu"
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"label": "Tên đăng nhập"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "Tạo tài khoản mới",
|
||||||
|
"loginText": "Nếu bạn đã có tài khoản, bạn có thể <1>đăng nhập tại đây</1>."
|
||||||
|
},
|
||||||
|
"reset-password": {
|
||||||
|
"actions": {
|
||||||
|
"set-password": "Đặt mật khẩu mới"
|
||||||
|
},
|
||||||
|
"body": "Nhập mật khẩu mới cho tài khoản của bạn.",
|
||||||
|
"form": {
|
||||||
|
"confirm-password": {
|
||||||
|
"label": "Xác nhận mật khẩu"
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"label": "Mật khẩu"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "Đặt lại mật khẩu của bạn"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dashboard": {
|
||||||
|
"create-resume": {
|
||||||
|
"actions": {
|
||||||
|
"create-resume": "Tạo sơ yếu lý lịch"
|
||||||
|
},
|
||||||
|
"body": "Bắt đầu xây dựng sơ yếu lý lịch của bạn bằng cách đặt tên cho nó. Nó có thể liên quan đến vị trí mà bạn ứng tuyển, hoặc chỉ là món ăn nhẹ yêu thích của bạn.",
|
||||||
|
"form": {
|
||||||
|
"name": {
|
||||||
|
"label": "Tên"
|
||||||
|
},
|
||||||
|
"public": {
|
||||||
|
"label": "Có thể truy cập công khai không?"
|
||||||
|
},
|
||||||
|
"slug": {
|
||||||
|
"label": "Đường dẫn rút gọn"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "Tạo sơ yếu lý lịch mới"
|
||||||
|
},
|
||||||
|
"import-external": {
|
||||||
|
"heading": "Kết nhập dữ liệu từ nguồn ngoài",
|
||||||
|
"json-resume": {
|
||||||
|
"actions": {
|
||||||
|
"upload-json": "Tải lên JSON"
|
||||||
|
},
|
||||||
|
"body": "Nếu bạn có sẵn một <1>bản JSON Resume đã được xác thực</1> để chỉnh sửa, bạn có thể sử dụng nó để theo dõi nhanh sự phát triển của mình trên Reactive Resume. Nhấp vào nút bên dưới và tải lên tệp JSON hợp lệ để bắt đầu.",
|
||||||
|
"heading": "Kết nhập từ JSON Resume"
|
||||||
|
},
|
||||||
|
"linkedin": {
|
||||||
|
"actions": {
|
||||||
|
"upload-archive": "Tải lên bản nén ZIP"
|
||||||
|
},
|
||||||
|
"body": "Bạn có thể tiết kiệm thời gian bằng cách xuất dữ liệu của mình từ LinkedIn và sử dụng dữ liệu đó để tự động điền vào các trường trên Reactive Resume. Đi tới <1>Quyền riêng tư về dữ liệu</1> trên LinkedIn và yêu cầu lưu trữ dữ liệu của bạn. Khi nó có sẵn, hãy tải lên tệp ZIP ở bên dưới.",
|
||||||
|
"heading": "Kết nhập từ LinkedIn"
|
||||||
|
},
|
||||||
|
"reactive-resume": {
|
||||||
|
"actions": {
|
||||||
|
"upload-json": "Tải lên JSON",
|
||||||
|
"upload-json-v2": "Tải lên JSON từ v2"
|
||||||
|
},
|
||||||
|
"body": "Nếu bạn có một bản JSON đã được xuất với phiên bản Reactive Resume hiện tại, bạn có thể nhập lại bản JSON tại đây để tiếp tục chỉnh sửa.",
|
||||||
|
"heading": "Kết nhập từ Reactive Resume"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rename-resume": {
|
||||||
|
"actions": {
|
||||||
|
"rename-resume": "Đổi tên sơ yếu"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"name": {
|
||||||
|
"label": "Tên"
|
||||||
|
},
|
||||||
|
"slug": {
|
||||||
|
"label": "Đường dẫn rút gọn"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heading": "Đổi tên sơ yếu lý lịch của bạn"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,9 +1,9 @@
|
|||||||
.container {
|
.container {
|
||||||
@apply my-8 flex flex-col items-center;
|
@apply m-8 flex flex-col items-start lg:items-center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.download {
|
.download {
|
||||||
@apply fixed bottom-6 right-6;
|
@apply fixed bottom-6 right-6 z-50;
|
||||||
|
|
||||||
button {
|
button {
|
||||||
@apply flex gap-2 px-4 py-3 shadow dark:bg-neutral-600/25;
|
@apply flex gap-2 px-4 py-3 shadow dark:bg-neutral-600/25;
|
||||||
|
|||||||
@ -10,7 +10,9 @@ const DateWrapper: React.FC = ({ children }) => {
|
|||||||
dayjs.extend(relativeTime);
|
dayjs.extend(relativeTime);
|
||||||
|
|
||||||
// Locales
|
// Locales
|
||||||
|
require('dayjs/locale/ar');
|
||||||
require('dayjs/locale/bn');
|
require('dayjs/locale/bn');
|
||||||
|
require('dayjs/locale/da');
|
||||||
require('dayjs/locale/de');
|
require('dayjs/locale/de');
|
||||||
require('dayjs/locale/en');
|
require('dayjs/locale/en');
|
||||||
require('dayjs/locale/es');
|
require('dayjs/locale/es');
|
||||||
@ -18,7 +20,9 @@ const DateWrapper: React.FC = ({ children }) => {
|
|||||||
require('dayjs/locale/hi');
|
require('dayjs/locale/hi');
|
||||||
require('dayjs/locale/it');
|
require('dayjs/locale/it');
|
||||||
require('dayjs/locale/kn');
|
require('dayjs/locale/kn');
|
||||||
|
require('dayjs/locale/pl');
|
||||||
require('dayjs/locale/ta');
|
require('dayjs/locale/ta');
|
||||||
|
require('dayjs/locale/tr');
|
||||||
require('dayjs/locale/zh');
|
require('dayjs/locale/zh');
|
||||||
|
|
||||||
locale && dayjs.locale(locale);
|
locale && dayjs.locale(locale);
|
||||||
|
|||||||
@ -44,6 +44,7 @@ You have complete control over what goes into your resume, how it looks, what co
|
|||||||
|
|
||||||
## Languages
|
## Languages
|
||||||
|
|
||||||
|
- Arabic (اَلْعَرَبِيَّةُ)
|
||||||
- Bengali (বাংলা)
|
- Bengali (বাংলা)
|
||||||
- Chinese (中文)
|
- Chinese (中文)
|
||||||
- Danish (Dansk)
|
- Danish (Dansk)
|
||||||
@ -70,6 +71,14 @@ Reactive Resume would be nothing without the folks who supported me and kept the
|
|||||||
|
|
||||||
#### [💸 PayPal](https://paypal.me/RajaRajanA)
|
#### [💸 PayPal](https://paypal.me/RajaRajanA)
|
||||||
|
|
||||||
|
## Contributors Wall
|
||||||
|
|
||||||
|
<a href="https://github.com/AmruthPillai/Reactive-Resume/graphs/contributors">
|
||||||
|
<img src="https://contrib.rocks/image?repo=AmruthPillai/Reactive-Resume" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
_Note: It may take up to 24h for the [contrib.rocks](https://contrib.rocks/image?repo=AmruthPillai/Reactive-Resume) plugin to update because it's refreshed once a day._
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Reactive Resume is packaged and distributed using the [MIT License](https://choosealicense.com/licenses/mit/) which allows for commercial use, distribution, modification and private use provided that all copies of the software contain the same license and copyright.
|
Reactive Resume is packaged and distributed using the [MIT License](https://choosealicense.com/licenses/mit/) which allows for commercial use, distribution, modification and private use provided that all copies of the software contain the same license and copyright.
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "reactive-resume",
|
"name": "reactive-resume",
|
||||||
"version": "3.2.5",
|
"version": "3.2.6",
|
||||||
"private": true,
|
"private": true,
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"schema",
|
"schema",
|
||||||
|
|||||||
@ -105,8 +105,8 @@ export class IntegrationsService {
|
|||||||
institution: get(school, 'School Name'),
|
institution: get(school, 'School Name'),
|
||||||
degree: get(school, 'Degree Name'),
|
degree: get(school, 'Degree Name'),
|
||||||
date: {
|
date: {
|
||||||
start: dayjs(get(school, 'Start Date')).toISOString(),
|
start: this.parseDate(get(school, 'Start Date')),
|
||||||
end: dayjs(get(school, 'End Date')).toISOString(),
|
end: this.parseDate(get(school, 'End Date')),
|
||||||
},
|
},
|
||||||
} as Education,
|
} as Education,
|
||||||
],
|
],
|
||||||
@ -134,8 +134,8 @@ export class IntegrationsService {
|
|||||||
position: get(position, 'Title'),
|
position: get(position, 'Title'),
|
||||||
summary: get(position, 'Description'),
|
summary: get(position, 'Description'),
|
||||||
date: {
|
date: {
|
||||||
start: dayjs(get(position, 'Started On')).toISOString(),
|
start: this.parseDate(get(position, 'Started On')),
|
||||||
end: dayjs(get(position, 'Finished On')).toISOString(),
|
end: this.parseDate(get(position, 'Finished On')),
|
||||||
},
|
},
|
||||||
} as WorkExperience,
|
} as WorkExperience,
|
||||||
],
|
],
|
||||||
@ -162,7 +162,7 @@ export class IntegrationsService {
|
|||||||
name: get(certification, 'Name'),
|
name: get(certification, 'Name'),
|
||||||
issuer: get(certification, 'Authority'),
|
issuer: get(certification, 'Authority'),
|
||||||
url: get(certification, 'Url'),
|
url: get(certification, 'Url'),
|
||||||
date: dayjs(get(certification, 'Started On')).toISOString(),
|
date: this.parseDate(get(certification, 'Started On')),
|
||||||
} as Certificate,
|
} as Certificate,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@ -214,8 +214,8 @@ export class IntegrationsService {
|
|||||||
description: get(project, 'Description'),
|
description: get(project, 'Description'),
|
||||||
url: get(project, 'Url'),
|
url: get(project, 'Url'),
|
||||||
date: {
|
date: {
|
||||||
start: dayjs(get(project, 'Started On')).toISOString(),
|
start: this.parseDate(get(project, 'Started On')),
|
||||||
end: dayjs(get(project, 'Finished On')).toISOString(),
|
end: this.parseDate(get(project, 'Finished On')),
|
||||||
},
|
},
|
||||||
} as Project,
|
} as Project,
|
||||||
],
|
],
|
||||||
@ -242,6 +242,7 @@ export class IntegrationsService {
|
|||||||
name: get(skill, 'Name'),
|
name: get(skill, 'Name'),
|
||||||
level: 'Beginner',
|
level: 'Beginner',
|
||||||
levelNum: 5,
|
levelNum: 5,
|
||||||
|
keywords: [],
|
||||||
} as Skill,
|
} as Skill,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@ -338,8 +339,8 @@ export class IntegrationsService {
|
|||||||
summary: get(item, 'summary'),
|
summary: get(item, 'summary'),
|
||||||
url: get(item, 'url'),
|
url: get(item, 'url'),
|
||||||
date: {
|
date: {
|
||||||
start: dayjs(get(item, 'startDate')).toISOString(),
|
start: this.parseDate(get(item, 'startDate')),
|
||||||
end: dayjs(get(item, 'endDate')).toISOString(),
|
end: this.parseDate(get(item, 'endDate')),
|
||||||
},
|
},
|
||||||
} as WorkExperience,
|
} as WorkExperience,
|
||||||
],
|
],
|
||||||
@ -367,8 +368,8 @@ export class IntegrationsService {
|
|||||||
summary: get(item, 'summary'),
|
summary: get(item, 'summary'),
|
||||||
url: get(item, 'url'),
|
url: get(item, 'url'),
|
||||||
date: {
|
date: {
|
||||||
start: dayjs(get(item, 'startDate')).toISOString(),
|
start: this.parseDate(get(item, 'startDate')),
|
||||||
end: dayjs(get(item, 'endDate')).toISOString(),
|
end: this.parseDate(get(item, 'endDate')),
|
||||||
},
|
},
|
||||||
} as Volunteer,
|
} as Volunteer,
|
||||||
],
|
],
|
||||||
@ -398,8 +399,8 @@ export class IntegrationsService {
|
|||||||
url: get(item, 'url'),
|
url: get(item, 'url'),
|
||||||
courses: get(item, 'courses', []),
|
courses: get(item, 'courses', []),
|
||||||
date: {
|
date: {
|
||||||
start: dayjs(get(item, 'startDate')).toISOString(),
|
start: this.parseDate(get(item, 'startDate')),
|
||||||
end: dayjs(get(item, 'endDate')).toISOString(),
|
end: this.parseDate(get(item, 'endDate')),
|
||||||
},
|
},
|
||||||
} as Education,
|
} as Education,
|
||||||
],
|
],
|
||||||
@ -426,7 +427,7 @@ export class IntegrationsService {
|
|||||||
awarder: get(award, 'awarder'),
|
awarder: get(award, 'awarder'),
|
||||||
summary: get(award, 'summary'),
|
summary: get(award, 'summary'),
|
||||||
url: get(award, 'url'),
|
url: get(award, 'url'),
|
||||||
date: dayjs(get(award, 'date')).toISOString(),
|
date: this.parseDate(get(award, 'date')),
|
||||||
} as Award,
|
} as Award,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@ -452,7 +453,7 @@ export class IntegrationsService {
|
|||||||
publisher: get(publication, 'publisher'),
|
publisher: get(publication, 'publisher'),
|
||||||
summary: get(publication, 'summary'),
|
summary: get(publication, 'summary'),
|
||||||
url: get(publication, 'url'),
|
url: get(publication, 'url'),
|
||||||
date: dayjs(get(publication, 'releaseDate')).toISOString(),
|
date: this.parseDate(get(publication, 'releaseDate')),
|
||||||
} as Publication,
|
} as Publication,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@ -575,8 +576,8 @@ export class IntegrationsService {
|
|||||||
keywords: get(project, 'keywords'),
|
keywords: get(project, 'keywords'),
|
||||||
url: get(project, 'url'),
|
url: get(project, 'url'),
|
||||||
date: {
|
date: {
|
||||||
start: dayjs(get(project, 'startDate')).toISOString(),
|
start: this.parseDate(get(project, 'startDate')),
|
||||||
end: dayjs(get(project, 'endDate')).toISOString(),
|
end: this.parseDate(get(project, 'endDate')),
|
||||||
},
|
},
|
||||||
} as Project,
|
} as Project,
|
||||||
],
|
],
|
||||||
@ -692,8 +693,8 @@ export class IntegrationsService {
|
|||||||
summary: get(item, 'summary'),
|
summary: get(item, 'summary'),
|
||||||
url: get(item, 'website'),
|
url: get(item, 'website'),
|
||||||
date: {
|
date: {
|
||||||
start: dayjs(get(item, 'startDate')).toISOString(),
|
start: this.parseDate(get(item, 'startDate')),
|
||||||
end: dayjs(get(item, 'endDate')).toISOString(),
|
end: this.parseDate(get(item, 'endDate')),
|
||||||
},
|
},
|
||||||
} as WorkExperience,
|
} as WorkExperience,
|
||||||
],
|
],
|
||||||
@ -724,8 +725,8 @@ export class IntegrationsService {
|
|||||||
summary: get(item, 'summary'),
|
summary: get(item, 'summary'),
|
||||||
courses: get(item, 'courses', []),
|
courses: get(item, 'courses', []),
|
||||||
date: {
|
date: {
|
||||||
start: dayjs(get(item, 'startDate')).toISOString(),
|
start: this.parseDate(get(item, 'startDate')),
|
||||||
end: dayjs(get(item, 'endDate')).toISOString(),
|
end: this.parseDate(get(item, 'endDate')),
|
||||||
},
|
},
|
||||||
} as Education,
|
} as Education,
|
||||||
],
|
],
|
||||||
@ -751,7 +752,7 @@ export class IntegrationsService {
|
|||||||
title: get(award, 'title'),
|
title: get(award, 'title'),
|
||||||
awarder: get(award, 'awarder'),
|
awarder: get(award, 'awarder'),
|
||||||
summary: get(award, 'summary'),
|
summary: get(award, 'summary'),
|
||||||
date: dayjs(get(award, 'date')).toISOString(),
|
date: this.parseDate(get(award, 'date')),
|
||||||
} as Award,
|
} as Award,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@ -776,7 +777,7 @@ export class IntegrationsService {
|
|||||||
name: get(certificate, 'title'),
|
name: get(certificate, 'title'),
|
||||||
issuer: get(certificate, 'issuer'),
|
issuer: get(certificate, 'issuer'),
|
||||||
summary: get(certificate, 'summary'),
|
summary: get(certificate, 'summary'),
|
||||||
date: dayjs(get(certificate, 'date')).toISOString(),
|
date: this.parseDate(get(certificate, 'date')),
|
||||||
} as Certificate,
|
} as Certificate,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@ -900,7 +901,7 @@ export class IntegrationsService {
|
|||||||
keywords: get(project, 'keywords'),
|
keywords: get(project, 'keywords'),
|
||||||
url: get(project, 'link'),
|
url: get(project, 'link'),
|
||||||
date: {
|
date: {
|
||||||
start: dayjs(get(project, 'date')).toISOString(),
|
start: this.parseDate(get(project, 'startDate')),
|
||||||
},
|
},
|
||||||
} as Project,
|
} as Project,
|
||||||
],
|
],
|
||||||
@ -945,4 +946,8 @@ export class IntegrationsService {
|
|||||||
await unlink(path);
|
await unlink(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private parseDate = (date: string): string => {
|
||||||
|
return isEmpty(date) ? '' : dayjs(date).toISOString();
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user