mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-10 04:22:27 +10:00
Compare commits
84 Commits
v3.0.0-bet
...
v3.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| d7268423df | |||
| bf167f81a3 | |||
| 9e2f22d878 | |||
| 084b909152 | |||
| 3955afee8d | |||
| f2dd2b5fcf | |||
| 305561955a | |||
| cadbd3dfe8 | |||
| b5cd6c412b | |||
| 799f20823e | |||
| dda42b4c6b | |||
| f1c260736a | |||
| b5a9b26f34 | |||
| 918bd555c1 | |||
| 9ea2775790 | |||
| 9d83b997f5 | |||
| 228fb42ba5 | |||
| 01da1a06b8 | |||
| 82bf44daa2 | |||
| 2cbc582a12 | |||
| 2b9f016b95 | |||
| 358c97eb71 | |||
| 76ef513b46 | |||
| 497c6e01f1 | |||
| e78c4a9adb | |||
| 30d0151bdb | |||
| 4dd94c3363 | |||
| f711b089bc | |||
| 01c1125153 | |||
| fa42d82416 | |||
| 6322d4d105 | |||
| 77467929c7 | |||
| 3a524f9c9c | |||
| 63f900870b | |||
| 32f78e85f7 | |||
| 1cc2232730 | |||
| 2ff6761630 | |||
| 5836e55a36 | |||
| ec98c14fbd | |||
| 78c1f5a380 | |||
| 808fa45124 | |||
| 2625ed4f3d | |||
| 40085f8d78 | |||
| f4e3be178c | |||
| 601f61c59a | |||
| 59049e8f77 | |||
| 798e77f693 | |||
| 78565079e7 | |||
| 0bec4cff05 | |||
| 26dc0069f9 | |||
| 90bb80b1e2 | |||
| 61ed3ff018 | |||
| 36a12e82a2 | |||
| a3cf1752cc | |||
| 5b79e23564 | |||
| 300e4a790d | |||
| ba4666b767 | |||
| b283c6ee8f | |||
| 316eca35ef | |||
| 16c18de964 | |||
| 0c23af4be8 | |||
| fe1b325fdf | |||
| 9395a4d578 | |||
| c11f92841b | |||
| 2654cba039 | |||
| 7d8828a358 | |||
| 8bc7d2599e | |||
| 036adbfc96 | |||
| 4b7e43424c | |||
| 0f1c3a8142 | |||
| 8dc27ecf07 | |||
| a05917b00d | |||
| d5f2eea34c | |||
| 29bc3f33a6 | |||
| b332b77eff | |||
| 8e09db276e | |||
| 2f7cfd2add | |||
| 6a4464b239 | |||
| 972e8b1bcf | |||
| ad916c5b07 | |||
| eca80a1663 | |||
| ef3b2c5638 | |||
| 6c671f2dba | |||
| dc4aa0b496 |
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -1,38 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help improve
|
||||
title: "[BUG] "
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- 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**
|
||||
Add any other context about the problem here.
|
||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -1,20 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: "[FEATURE] "
|
||||
labels: enhancement
|
||||
assignees: AmruthPillai
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
16
.github/workflows/close-stale.yml
vendored
Normal file
16
.github/workflows/close-stale.yml
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
name: 'Close stale issues and PRs'
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v5.0.0
|
||||
with:
|
||||
stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity. Remove the stale label or comment on this PR, otherwise it would be closed in 5 days.'
|
||||
stale-issue-message: 'This issue is stale because it has been open for 30 days with no activity. Remove the stale label or comment on this issue, otherwise it would be closed in 5 days.'
|
||||
days-before-stale: 30
|
||||
days-before-close: 5
|
||||
@ -1,11 +1,18 @@
|
||||
# Build Artifacts
|
||||
dist
|
||||
.next
|
||||
# Schema
|
||||
schema/dist
|
||||
|
||||
# Server
|
||||
server/dist
|
||||
|
||||
# Client
|
||||
client/.next
|
||||
client/public/__ENV.js
|
||||
|
||||
# IDEs
|
||||
.vscode
|
||||
|
||||
# Project Metadata
|
||||
LICENSE
|
||||
README.md
|
||||
CHANGELOG.md
|
||||
|
||||
@ -18,4 +25,8 @@ Dockerfile
|
||||
docker-compose.yml
|
||||
|
||||
# Android App
|
||||
/app
|
||||
/app
|
||||
|
||||
# Docs
|
||||
docs/build
|
||||
docs/.docusaurus
|
||||
24
.vscode/settings.json
vendored
24
.vscode/settings.json
vendored
@ -1,15 +1,25 @@
|
||||
{
|
||||
"css.validate": false,
|
||||
"scss.validate": false,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.eslint": true
|
||||
},
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.wordWrap": "on",
|
||||
"eslint.workingDirectories": ["schema", "client", "server"],
|
||||
"i18n-ally.enabledFrameworks": ["i18next"],
|
||||
"i18n-ally.localesPaths": ["client/public/locales"],
|
||||
"i18n-ally.sourceLanguage": "en",
|
||||
"i18n-ally.keystyle": "nested"
|
||||
}
|
||||
"eslint.workingDirectories": [
|
||||
"schema",
|
||||
"client",
|
||||
"server"
|
||||
],
|
||||
"i18n-ally.enabledFrameworks": [
|
||||
"react"
|
||||
],
|
||||
"i18n-ally.keystyle": "nested",
|
||||
"i18n-ally.localesPaths": [
|
||||
"client/public/locales"
|
||||
],
|
||||
"i18n-ally.namespace": true,
|
||||
"i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
|
||||
"i18n-ally.sortKeys": true,
|
||||
"scss.validate": false
|
||||
}
|
||||
45
CHANGELOG.md
Normal file
45
CHANGELOG.md
Normal file
@ -0,0 +1,45 @@
|
||||
# Changelog
|
||||
|
||||
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.1.0](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.0.0...v3.1.0) (2022-03-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **client:** add "spanish (es)" language to i18n locales ([bf167f8](https://github.com/AmruthPillai/Reactive-Resume/commit/bf167f81a3659677dada55856f5eaf0fc469e697))
|
||||
* **client:** add mm/yyyy date option to date format options ([82bf44d](https://github.com/AmruthPillai/Reactive-Resume/commit/82bf44daa24422156779e9b38d3dc695176eaa09)), closes [#656](https://github.com/AmruthPillai/Reactive-Resume/issues/656)
|
||||
* **client:** add sitemap generation to next app ([2cbc582](https://github.com/AmruthPillai/Reactive-Resume/commit/2cbc582a12b72b3012246022d4b518ed657d4c08))
|
||||
* **client:** disable "Toggle Page Orientation" when there's only one page on the artboard ([01da1a0](https://github.com/AmruthPillai/Reactive-Resume/commit/01da1a06b802f1063a41d7a9a682e76b1daf9461)), closes [#655](https://github.com/AmruthPillai/Reactive-Resume/issues/655)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **client:** remove hard-coded "keywords:" in certain templates ([dda42b4](https://github.com/AmruthPillai/Reactive-Resume/commit/dda42b4c6b3bc359ac4f2bb91ca8118ddc84ec07)), closes [#650](https://github.com/AmruthPillai/Reactive-Resume/issues/650)
|
||||
* **client:** show "present" string if end date is not entered, also add to i18n locales ([b5cd6c4](https://github.com/AmruthPillai/Reactive-Resume/commit/b5cd6c412b5b6b6ca7bb43c3801762de451f06b4)), closes [#653](https://github.com/AmruthPillai/Reactive-Resume/issues/653)
|
||||
* **server:** photo uploads not working, fix save location and returned url ([799f208](https://github.com/AmruthPillai/Reactive-Resume/commit/799f20823e6d97a1ff0ba2c45c61d56304d0fa58)), closes [#658](https://github.com/AmruthPillai/Reactive-Resume/issues/658)
|
||||
|
||||
## [3.0.0](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.0.0-beta.6...v3.0.0) (2022-03-11)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **lang**: add German, Kannada and Tamil languages to the app ([3a524f9](https://github.com/AmruthPillai/Reactive-Resume/commit/3a524f9c9c7a0e446491265b2242ad3dfeae188c))
|
||||
* **docs:** add docusaurus workspace, initial setup of docs ([dc4aa0b](https://github.com/AmruthPillai/Reactive-Resume/commit/dc4aa0b496096bd59c45426bfcea6ba7db5f5c01))
|
||||
|
||||
## [3.0.0-beta.6](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2022-03-11)
|
||||
|
||||
### Features
|
||||
|
||||
* **lang:** add language switcher on the landing page, in the footer ([8bc7d25](https://github.com/AmruthPillai/Reactive-Resume/commit/8bc7d2599ef6af7a07bfbe886c43844152b0d9f7))
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **i18n:** add missing translation keys, update lang/locale logic ([7d8828a](https://github.com/AmruthPillai/Reactive-Resume/commit/7d8828a358d653bb162877a64c75028eb82678cd))
|
||||
* **webkit:** fix issue with webkit not supporting .at() ([2654cba](https://github.com/AmruthPillai/Reactive-Resume/commit/2654cba039eb73d33257c36fa90a52cabc9fda96))
|
||||
|
||||
## [3.0.0-beta.5](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.0.0-beta.4...v3.0.0-beta.5) (2022-03-10)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **app:** fix issue with using swipelayout ([972e8b1](https://github.com/AmruthPillai/Reactive-Resume/commit/972e8b1bcf9ad44d8915bf23d189711672937bc0))
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 Amruth Pillai
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
82
README.md
82
README.md
@ -2,10 +2,12 @@
|
||||
|
||||
# Reactive Resume
|
||||
|
||||

|
||||

|
||||
[](https://hub.docker.com/r/amruthpillai/reactive-resume)
|
||||
[](https://app.fossa.com/projects/git%2Bgithub.com%2FAmruthPillai%2FReactive-Resume?ref=badge_shield)
|
||||
|
||||
## [Go to App](https://beta.rxresu.me/)
|
||||
## [Go to App](https://rxresu.me) | [Docs](https://docs.rxresu.me)
|
||||
|
||||
Reactive Resume is a free and open source resume builder that’s built to make the mundane tasks of creating, updating and sharing your resume as easy as 1, 2, 3. With this app, you can create multiple resumes, share them with recruiters through a unique link and print as PDF, all for free, no advertisements, without losing the integrity and privacy of your data.
|
||||
|
||||
@ -15,13 +17,13 @@ You have complete control over what goes into your resume, how it looks, what co
|
||||
|
||||
- Free, forever
|
||||
- No Advertising
|
||||
- No Tracking (no 🍪s too)
|
||||
- No User Tracking
|
||||
- Sync your data across devices
|
||||
- Accessible in multiple languages
|
||||
- Import data from [LinkedIn](https://www.linkedin.com/), [JSON Resume](https://jsonresume.org/)
|
||||
- Manage multiple resumes with one account
|
||||
- Open Source (with large community support)
|
||||
- Send your resume to others with a unique sharable link
|
||||
- Accessible in multiple languages, [help translate here](https://translate.rxresu.me/)
|
||||
- Pick any font from [Google Fonts](https://fonts.google.com/) to use on your resume
|
||||
- Choose from 6 vibrant templates and more coming soon
|
||||
- Export your resume to JSON or PDF format with just one click
|
||||
@ -31,64 +33,28 @@ You have complete control over what goes into your resume, how it looks, what co
|
||||
- Tailor-made Backend and Database, isolated from Google, Amazon etc.
|
||||
- **Oh, and did I mention that it's free?**
|
||||
|
||||
## Docker Setup
|
||||
## Languages
|
||||
|
||||
You can pull the prebuilt docker images right off the shelf from either [Docker Hub](https://hub.docker.com/repository/docker/amruthpillai/reactive-resume) or [GitHub Container Registry](https://ghcr.io/amruthpillai/reactive-resume). Keep in mind, you would also need a database for this to work as intended.
|
||||
- English
|
||||
- German (Deutsch)
|
||||
- Hindi (हिन्दी)
|
||||
- Kannada (ಕನ್ನಡ) (@aksh1251)
|
||||
- Spanish (Español) (@seba11998)
|
||||
- Tamil (தமிழ்)
|
||||
|
||||
```sh
|
||||
# Server
|
||||
docker run -p 3100:3100 --env-file .env amruthpillai/reactive-resume:server-latest
|
||||
Help by [translating Reactive Resume](https://translate.rxresu.me) to your language!
|
||||
|
||||
# Client
|
||||
docker run -p 3000:3000 --env-file .env amruthpillai/reactive-resume:client-latest
|
||||
```
|
||||
## Tutorial
|
||||
|
||||
Or, to make your life easier there's a simple `docker-compose.yml` included to help you get set up for success.
|
||||
|
||||
```sh
|
||||
docker compose up
|
||||
```
|
||||
The docs include an extensive [Tutorial](https://docs.rxresu.me/tutorial) section which outline the features of Reactive Resume and help you through building your first resume on the app.
|
||||
|
||||
## Build from Source
|
||||
|
||||
If you don't want to use Docker, I understand. There's an old-school way to build the app too. This project, and these instructions rely heavily on [pnpm](https://pnpm.io/) so you might want to have that installed on your system before you continue.
|
||||
|
||||
1. Clone the repository locally, or use GitHub Codespaces or CodeSandbox
|
||||
|
||||
```
|
||||
git clone https://github.com/AmruthPillai/Reactive-Resume.git
|
||||
cd Reactive-Resume
|
||||
```
|
||||
|
||||
2. Install dependencies using `pnpm`, but feel free to use any other package manager that supports npm workspaces.
|
||||
|
||||
```
|
||||
pnpm install
|
||||
```
|
||||
|
||||
3. Copy the `.env.example` file to `.env` in the project root and fill it with values according to your setup. You can skip the SendGrid variables if you don't want to set up mail right away.
|
||||
|
||||
```
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
1. Use Docker Compose to create a PostgreSQL instance and a `reactive_resume` database, or feel free to use your own and modify the variables used in `.env`
|
||||
|
||||
```
|
||||
docker-compose up -d postgres
|
||||
```
|
||||
|
||||
5. Run the project and start building!
|
||||
|
||||
```
|
||||
pnpm dev
|
||||
```
|
||||
For extensive information on how to build the app on your local machine, head over to the docs's [Source Code](https://docs.rxresu.me/source-code) section.
|
||||
|
||||
## Contributing
|
||||
|
||||
Please refer to the project's style and contribution guidelines for submitting pull requests.
|
||||
|
||||
In general, this project follows the "fork-and-pull" Git workflow.
|
||||
This project makes use of [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) style and workflow for commit messages to ensure that the CHANGELOG is auto-generated. In general, this project follows the "fork-and-pull" Git workflow.
|
||||
|
||||
1. **Fork** the repo on GitHub
|
||||
2. **Clone** the project to your own machine
|
||||
@ -106,15 +72,17 @@ Use the [GitHub Issues](https://github.com/AmruthPillai/Reactive-Resume/issues/n
|
||||
|
||||
Reactive Resume would be nothing without the folks who supported me and kept the project alive in the beginning, and your cotinued support is what keeps me going. If you found Reactive Resume to be useful, helpful or just insightful and appreciate the effort I took to make the project, please consider donating as little or as much as your can.
|
||||
|
||||
[☕️ Buy me a coffee](https://www.buymeacoffee.com/AmruthPillai)
|
||||
### [☕️ Buy me a coffee](https://www.buymeacoffee.com/AmruthPillai) | [💸 PayPal](https://paypal.me/RajaRajanA)
|
||||
|
||||
## Infrastructure
|
||||
|
||||
- Next.js, frontend
|
||||
- NestJS, backend
|
||||
- PostgreSQL, database
|
||||
- DigitalOcean, infrastructure provider
|
||||
- Crowdin, translation management platform
|
||||
- [Next.js](https://nextjs.org/), frontend
|
||||
- [NestJS](https://nestjs.com/), backend
|
||||
- [PostgreSQL](https://www.postgresql.org/), database
|
||||
- [DigitalOcean](https://www.digitalocean.com/), infrastructure provider
|
||||
- [Crowdin](https://translate.rxresu.me/), translation management platform
|
||||
|
||||
|
||||
|
||||
<a href="https://pillai.xyz/digitalocean">
|
||||
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_blue.svg" width="200px" />
|
||||
|
||||
@ -6,31 +6,35 @@ plugins {
|
||||
android {
|
||||
compileSdk 32
|
||||
|
||||
def appVersionCode = Integer.valueOf(System.env.BUILD_NUMBER ?: 0)
|
||||
|
||||
defaultConfig {
|
||||
applicationId "me.rxresu.app"
|
||||
minSdk 21
|
||||
targetSdk 32
|
||||
versionCode 2
|
||||
versionName "1.0"
|
||||
versionCode appVersionCode
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
resConfigs "en"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
minifyEnabled true
|
||||
shrinkResources true
|
||||
zipAlignEnabled true
|
||||
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = '1.8'
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
viewBinding true
|
||||
}
|
||||
@ -39,8 +43,4 @@ android {
|
||||
dependencies {
|
||||
implementation 'androidx.core:core-ktx:1.7.0'
|
||||
implementation 'com.google.android.material:material:1.5.0'
|
||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
}
|
||||
|
||||
@ -9,15 +9,13 @@ import android.webkit.WebResourceRequest
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebViewClient
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var webView: WebView
|
||||
private lateinit var swipeLayout: SwipeRefreshLayout
|
||||
|
||||
private var isLoaded: Boolean = false
|
||||
private var webURL = "https://beta.rxresu.me"
|
||||
private var webURL = "https://rxresu.me"
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
@ -25,18 +23,9 @@ class MainActivity : AppCompatActivity() {
|
||||
setContentView(R.layout.activity_main)
|
||||
|
||||
webView = findViewById(R.id.webview)
|
||||
swipeLayout = findViewById(R.id.swipelayout)
|
||||
|
||||
webView.settings.javaScriptEnabled = true
|
||||
webView.settings.userAgentString = "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Mobile Safari/537.36"
|
||||
|
||||
WebView.setWebContentsDebuggingEnabled(true)
|
||||
|
||||
swipeLayout.setOnRefreshListener {
|
||||
webView.reload()
|
||||
|
||||
swipeLayout.isRefreshing = false
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/swipelayout"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
@ -10,10 +10,9 @@
|
||||
android:id="@+id/webview"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
@ -33,6 +33,7 @@ const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, c
|
||||
|
||||
const resume = useAppSelector((state) => state.resume);
|
||||
const isDesktop = useMediaQuery(theme.breakpoints.up('sm'));
|
||||
const pages = useAppSelector((state) => state.resume.metadata.layout);
|
||||
const { left, right } = useAppSelector((state) => state.build.sidebar);
|
||||
const orientation = useAppSelector((state) => state.build.page.orientation);
|
||||
|
||||
@ -74,19 +75,19 @@ const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, c
|
||||
})}
|
||||
>
|
||||
<div className={styles.controller}>
|
||||
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.zoom-in')}>
|
||||
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.zoom-in') as string}>
|
||||
<ButtonBase onClick={() => zoomIn(0.25)}>
|
||||
<ZoomIn fontSize="medium" />
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.zoom-out')}>
|
||||
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.zoom-out') as string}>
|
||||
<ButtonBase onClick={() => zoomOut(0.25)}>
|
||||
<ZoomOut fontSize="medium" />
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.center-artboard')}>
|
||||
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.center-artboard') as string}>
|
||||
<ButtonBase onClick={() => centerView(0.95)}>
|
||||
<FilterCenterFocus fontSize="medium" />
|
||||
</ButtonBase>
|
||||
@ -96,23 +97,25 @@ const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, c
|
||||
|
||||
{isDesktop && (
|
||||
<>
|
||||
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.toggle-orientation')}>
|
||||
<ButtonBase onClick={handleTogglePageOrientation}>
|
||||
{orientation === 'vertical' ? (
|
||||
<AlignHorizontalCenter fontSize="medium" />
|
||||
) : (
|
||||
<AlignVerticalCenter fontSize="medium" />
|
||||
)}
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
{pages.length > 1 && (
|
||||
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.toggle-orientation') as string}>
|
||||
<ButtonBase onClick={handleTogglePageOrientation}>
|
||||
{orientation === 'vertical' ? (
|
||||
<AlignHorizontalCenter fontSize="medium" />
|
||||
) : (
|
||||
<AlignVerticalCenter fontSize="medium" />
|
||||
)}
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
)}
|
||||
|
||||
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.toggle-page-break-line')}>
|
||||
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.toggle-page-break-line') as string}>
|
||||
<ButtonBase onClick={handleTogglePageBreakLine}>
|
||||
<InsertPageBreak fontSize="medium" />
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.toggle-sidebars')}>
|
||||
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.toggle-sidebars') as string}>
|
||||
<ButtonBase onClick={handleToggleSidebar}>
|
||||
<ViewSidebar fontSize="medium" />
|
||||
</ButtonBase>
|
||||
@ -122,13 +125,13 @@ const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, c
|
||||
</>
|
||||
)}
|
||||
|
||||
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.copy-link')}>
|
||||
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.copy-link') as string}>
|
||||
<ButtonBase onClick={handleCopyLink}>
|
||||
<Link fontSize="medium" />
|
||||
</ButtonBase>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.export-pdf')}>
|
||||
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.export-pdf') as string}>
|
||||
<ButtonBase onClick={handleExportPDF} disabled={isLoading}>
|
||||
<Download fontSize="medium" />
|
||||
</ButtonBase>
|
||||
|
||||
@ -184,7 +184,7 @@ const Header = () => {
|
||||
<ListItemText>{t('builder.header.menu.share-link')}</ListItemText>
|
||||
</MenuItem>
|
||||
) : (
|
||||
<Tooltip arrow placement="right" title={t<string>('builder.header.menu.tooltips.share-link')}>
|
||||
<Tooltip arrow placement="right" title={t('builder.header.menu.tooltips.share-link') as string}>
|
||||
<div>
|
||||
<MenuItem>
|
||||
<ListItemIcon>
|
||||
@ -196,7 +196,7 @@ const Header = () => {
|
||||
</Tooltip>
|
||||
)}
|
||||
|
||||
<Tooltip arrow placement="right" title={t<string>('builder.header.menu.tooltips.delete')}>
|
||||
<Tooltip arrow placement="right" title={t('builder.header.menu.tooltips.delete') as string}>
|
||||
<MenuItem onClick={handleDelete}>
|
||||
<ListItemIcon>
|
||||
<Delete className="scale-90" />
|
||||
|
||||
@ -58,14 +58,14 @@ const PhotoFilters = () => {
|
||||
|
||||
<div className="flex items-center">
|
||||
<FormControlLabel
|
||||
label={t<string>('builder.leftSidebar.sections.basics.photo-filters.effects.grayscale.label')}
|
||||
label={t('builder.leftSidebar.sections.basics.photo-filters.effects.grayscale.label') as string}
|
||||
control={
|
||||
<Checkbox color="secondary" checked={grayscale} onChange={(_, value) => handleSetGrayscale(value)} />
|
||||
}
|
||||
/>
|
||||
|
||||
<FormControlLabel
|
||||
label={t<string>('builder.leftSidebar.sections.basics.photo-filters.effects.border.label')}
|
||||
label={t('builder.leftSidebar.sections.basics.photo-filters.effects.border.label') as string}
|
||||
control={<Checkbox color="secondary" checked={border} onChange={(_, value) => handleSetBorder(value)} />}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@ -67,8 +67,8 @@ const PhotoUpload: React.FC = () => {
|
||||
<Tooltip
|
||||
title={
|
||||
isEmpty(photo.url)
|
||||
? t<string>('builder.leftSidebar.sections.basics.photo-upload.tooltip.upload')
|
||||
: t<string>('builder.leftSidebar.sections.basics.photo-upload.tooltip.remove')
|
||||
? (t('builder.leftSidebar.sections.basics.photo-upload.tooltip.upload') as string)
|
||||
: (t('builder.leftSidebar.sections.basics.photo-upload.tooltip.remove') as string)
|
||||
}
|
||||
>
|
||||
<Avatar sx={{ width: 96, height: 96 }} src={photo.url} />
|
||||
|
||||
@ -41,7 +41,7 @@ const Profiles = () => {
|
||||
<footer className="flex justify-end">
|
||||
<Button variant="outlined" startIcon={<Add />} onClick={handleAdd}>
|
||||
{t('builder.common.actions.add', {
|
||||
section: t('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
|
||||
token: t('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
|
||||
})}
|
||||
</Button>
|
||||
</footer>
|
||||
|
||||
@ -41,14 +41,14 @@ const Section: React.FC<Props> = ({
|
||||
const visibility = useAppSelector<boolean>((state) => get(state.resume, `${path}.visible`, true));
|
||||
|
||||
const handleAdd = () => {
|
||||
const id = path ? (path.split('.').at(-1) as string) : '';
|
||||
const id = path.split('.')[1];
|
||||
const modal: ModalName = validate(id) ? 'builder.sections.custom' : `builder.${path}`;
|
||||
|
||||
dispatch(setModalState({ modal, state: { open: true, payload: { path } } }));
|
||||
};
|
||||
|
||||
const handleEdit = (item: ListItem) => {
|
||||
const id = path ? (path.split('.').at(-1) as string) : '';
|
||||
const id = path.split('.')[1];
|
||||
const modal: ModalName = validate(id) ? 'builder.sections.custom' : `builder.${path}`;
|
||||
const payload = validate(id) ? { path, item } : { item };
|
||||
|
||||
|
||||
@ -32,7 +32,7 @@ const SectionSettings: React.FC<Props> = ({ path }) => {
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Tooltip title={t<string>('builder.common.columns.tooltip')}>
|
||||
<Tooltip title={t('builder.common.columns.tooltip') as string}>
|
||||
<ButtonBase onClick={handleClick} sx={{ padding: 1, borderRadius: 1 }} className="opacity-50 hover:opacity-75">
|
||||
<ViewWeek /> <span className="ml-1.5 text-xs">{columns}</span>
|
||||
</ButtonBase>
|
||||
|
||||
@ -62,7 +62,7 @@ const Layout = () => {
|
||||
path="metadata.layout"
|
||||
name={t('builder.rightSidebar.sections.layout.heading')}
|
||||
action={
|
||||
<Tooltip title={t<string>('builder.rightSidebar.sections.layout.tooltip.reset-layout')}>
|
||||
<Tooltip title={t('builder.rightSidebar.sections.layout.tooltip.reset-layout') as string}>
|
||||
<IconButton onClick={handleResetLayout}>
|
||||
<Restore />
|
||||
</IconButton>
|
||||
@ -81,7 +81,7 @@ const Layout = () => {
|
||||
|
||||
<div className={clsx(styles.delete, { hidden: pageIndex === 0 })}>
|
||||
<Tooltip
|
||||
title={t<string>('builder.common.actions.delete', { token: t('builder.common.glossary.page') })}
|
||||
title={t('builder.common.actions.delete', { token: t('builder.common.glossary.page') }) as string}
|
||||
>
|
||||
<IconButton size="small" onClick={() => handleDeletePage(pageIndex)}>
|
||||
<Close fontSize="small" />
|
||||
|
||||
@ -13,17 +13,18 @@ import {
|
||||
import { DateConfig, Resume } from '@reactive-resume/schema';
|
||||
import dayjs from 'dayjs';
|
||||
import get from 'lodash/get';
|
||||
import { useRouter } from 'next/router';
|
||||
import { useTranslation } from 'next-i18next';
|
||||
import { useMemo } from 'react';
|
||||
import { useMutation } from 'react-query';
|
||||
|
||||
import Heading from '@/components/shared/Heading';
|
||||
import ThemeSwitch from '@/components/shared/ThemeSwitch';
|
||||
import { Language, languages } from '@/config/languages';
|
||||
import { Language, languageMap, languages } from '@/config/languages';
|
||||
import { ServerError } from '@/services/axios';
|
||||
import queryClient from '@/services/react-query';
|
||||
import { loadSampleData, LoadSampleDataParams, resetResume, ResetResumeParams } from '@/services/resume';
|
||||
import { setLanguage, setTheme, togglePageBreakLine, togglePageOrientation } from '@/store/build/buildSlice';
|
||||
import { setTheme, togglePageBreakLine, togglePageOrientation } from '@/store/build/buildSlice';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setResumeState } from '@/store/resume/resumeSlice';
|
||||
import { dateFormatOptions } from '@/utils/date';
|
||||
@ -33,9 +34,11 @@ const Settings = () => {
|
||||
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const { locale, ...router } = useRouter();
|
||||
|
||||
const resume = useAppSelector((state) => state.resume);
|
||||
const theme = useAppSelector((state) => state.build.theme);
|
||||
const language = useAppSelector((state) => state.build.language);
|
||||
const pages = useAppSelector((state) => state.resume.metadata.layout);
|
||||
const breakLine = useAppSelector((state) => state.build.page.breakLine);
|
||||
const orientation = useAppSelector((state) => state.build.page.orientation);
|
||||
|
||||
@ -59,7 +62,12 @@ const Settings = () => {
|
||||
dispatch(setResumeState({ path: 'metadata.date.format', value }));
|
||||
|
||||
const handleChangeLanguage = (value: Language | null) => {
|
||||
dispatch(setLanguage({ language: value?.code || 'en' }));
|
||||
const { pathname, asPath, query, push } = router;
|
||||
const code = value?.code || 'en';
|
||||
|
||||
document.cookie = `NEXT_LOCALE=${code}; path=/; expires=2147483647`;
|
||||
|
||||
push({ pathname, query }, asPath, { locale: code });
|
||||
};
|
||||
|
||||
const handleLoadSampleData = async () => {
|
||||
@ -122,7 +130,7 @@ const Settings = () => {
|
||||
disableClearable
|
||||
className="my-2 w-full"
|
||||
options={languages}
|
||||
value={language}
|
||||
value={languageMap[locale ?? 'en']}
|
||||
isOptionEqualToValue={(a, b) => a.code === b.code}
|
||||
onChange={(_, value) => handleChangeLanguage(value)}
|
||||
renderInput={(params) => <TextField {...params} />}
|
||||
@ -144,10 +152,15 @@ const Settings = () => {
|
||||
<ListItem>
|
||||
<ListItemText
|
||||
primary={t('builder.rightSidebar.sections.settings.page.orientation.primary')}
|
||||
secondary={t('builder.rightSidebar.sections.settings.page.orientation.secondary')}
|
||||
secondary={
|
||||
pages.length === 1
|
||||
? t('builder.rightSidebar.sections.settings.page.orientation.disabled')
|
||||
: t('builder.rightSidebar.sections.settings.page.orientation.secondary')
|
||||
}
|
||||
/>
|
||||
<Switch
|
||||
color="secondary"
|
||||
disabled={pages.length === 1}
|
||||
checked={orientation === 'horizontal'}
|
||||
onChange={() => dispatch(togglePageOrientation())}
|
||||
/>
|
||||
|
||||
@ -63,7 +63,7 @@ const Sharing = () => {
|
||||
|
||||
<div className="mt-1 flex w-full">
|
||||
<FormControlLabel
|
||||
label={t<string>('builder.rightSidebar.sections.sharing.short-url.label')}
|
||||
label={t('builder.rightSidebar.sections.sharing.short-url.label') as string}
|
||||
control={
|
||||
<Checkbox className="mr-1" checked={showShortUrl} onChange={(_, value) => setShowShortUrl(value)} />
|
||||
}
|
||||
|
||||
@ -161,7 +161,7 @@ const ResumePreview: React.FC<Props> = ({ resume }) => {
|
||||
<ListItemText>{t('dashboard.resume.menu.share-link')}</ListItemText>
|
||||
</MenuItem>
|
||||
) : (
|
||||
<Tooltip arrow placement="right" title={t<string>('dashboard.resume.menu.tooltips.share-link')}>
|
||||
<Tooltip arrow placement="right" title={t('dashboard.resume.menu.tooltips.share-link') as string}>
|
||||
<div>
|
||||
<MenuItem>
|
||||
<ListItemIcon>
|
||||
@ -173,7 +173,7 @@ const ResumePreview: React.FC<Props> = ({ resume }) => {
|
||||
</Tooltip>
|
||||
)}
|
||||
|
||||
<Tooltip arrow placement="right" title={t<string>('dashboard.resume.menu.tooltips.delete')}>
|
||||
<Tooltip arrow placement="right" title={t('dashboard.resume.menu.tooltips.delete') as string}>
|
||||
<MenuItem onClick={handleDelete}>
|
||||
<ListItemIcon>
|
||||
<DeleteOutline className="scale-90" />
|
||||
|
||||
@ -12,7 +12,7 @@ const ColorAvatar: React.FC<Props> = ({ color, size = 20, onClick }) => {
|
||||
|
||||
return (
|
||||
<IconButton onClick={handleClick}>
|
||||
<Avatar sx={{ bgcolor: color, width: size, height: size }}> </Avatar>
|
||||
<Avatar sx={{ bgcolor: color, width: size, height: size }}> </Avatar>
|
||||
</IconButton>
|
||||
);
|
||||
};
|
||||
|
||||
@ -9,7 +9,7 @@ const Footer: React.FC<Props> = ({ className }) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<footer className={clsx('text-xs', className)}>
|
||||
<div className={clsx('text-xs', className)}>
|
||||
<p>{t('common.footer.license')}</p>
|
||||
|
||||
<p>
|
||||
@ -20,7 +20,7 @@ const Footer: React.FC<Props> = ({ className }) => {
|
||||
</a>
|
||||
</Trans>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@ -37,7 +37,7 @@ const Heading: React.FC<Props> = ({
|
||||
|
||||
const [editMode, setEditMode] = useState(false);
|
||||
|
||||
const id = useMemo(() => (path ? path.split('.').at(-1) : ''), [path]);
|
||||
const id = useMemo(() => path.split('.')[1], [path]);
|
||||
|
||||
const icon = sections.find((x) => x.id === id)?.icon || <Grade />;
|
||||
|
||||
@ -72,19 +72,19 @@ const Heading: React.FC<Props> = ({
|
||||
})}
|
||||
>
|
||||
{isEditable && (
|
||||
<Tooltip title={t<string>('builder.common.tooltip.rename-section')}>
|
||||
<Tooltip title={t('builder.common.tooltip.rename-section') as string}>
|
||||
<IconButton onClick={toggleEditMode}>{editMode ? <Check /> : <DriveFileRenameOutline />}</IconButton>
|
||||
</Tooltip>
|
||||
)}
|
||||
|
||||
{isHideable && (
|
||||
<Tooltip title={t<string>('builder.common.tooltip.toggle-visibility')}>
|
||||
<Tooltip title={t('builder.common.tooltip.toggle-visibility') as string}>
|
||||
<IconButton onClick={toggleVisibility}>{visibility ? <Visibility /> : <VisibilityOff />}</IconButton>
|
||||
</Tooltip>
|
||||
)}
|
||||
|
||||
{isDeletable && (
|
||||
<Tooltip title={t<string>('builder.common.tooltip.delete-section')}>
|
||||
<Tooltip title={t('builder.common.tooltip.delete-section') as string}>
|
||||
<IconButton onClick={handleDelete}>
|
||||
<Delete />
|
||||
</IconButton>
|
||||
|
||||
13
client/components/shared/LanguageSwitcher.module.scss
Normal file
13
client/components/shared/LanguageSwitcher.module.scss
Normal file
@ -0,0 +1,13 @@
|
||||
.popover {
|
||||
width: 460px;
|
||||
|
||||
@apply px-4 py-2;
|
||||
}
|
||||
|
||||
.container {
|
||||
@apply grid grid-cols-3 items-center justify-center gap-x-2;
|
||||
}
|
||||
|
||||
.language {
|
||||
@apply py-2 px-4 cursor-pointer text-center hover:underline;
|
||||
}
|
||||
66
client/components/shared/LanguageSwitcher.tsx
Normal file
66
client/components/shared/LanguageSwitcher.tsx
Normal file
@ -0,0 +1,66 @@
|
||||
import { Language } from '@mui/icons-material';
|
||||
import { IconButton, Popover } from '@mui/material';
|
||||
import { useRouter } from 'next/router';
|
||||
import { useTranslation } from 'next-i18next';
|
||||
import { MouseEvent, useState } from 'react';
|
||||
|
||||
import { languages } from '@/config/languages';
|
||||
|
||||
import styles from './LanguageSwitcher.module.scss';
|
||||
|
||||
const LanguageSwitcher = () => {
|
||||
const router = useRouter();
|
||||
|
||||
const { t } = useTranslation();
|
||||
|
||||
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
|
||||
|
||||
const handleClick = (event: MouseEvent<HTMLButtonElement>) => setAnchorEl(event.currentTarget);
|
||||
|
||||
const handleClose = () => setAnchorEl(null);
|
||||
|
||||
const handleChangeLanguage = (locale: string) => {
|
||||
const { pathname, asPath, query } = router;
|
||||
|
||||
document.cookie = `NEXT_LOCALE=${locale}; path=/; expires=2147483647`;
|
||||
router.push({ pathname, query }, asPath, { locale });
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<IconButton onClick={handleClick}>
|
||||
<Language />
|
||||
</IconButton>
|
||||
|
||||
<Popover
|
||||
anchorEl={anchorEl}
|
||||
open={Boolean(anchorEl)}
|
||||
onClose={handleClose}
|
||||
anchorOrigin={{
|
||||
vertical: 'top',
|
||||
horizontal: 'right',
|
||||
}}
|
||||
transformOrigin={{
|
||||
vertical: 'bottom',
|
||||
horizontal: 'right',
|
||||
}}
|
||||
>
|
||||
<div className={styles.popover}>
|
||||
<div className={styles.container}>
|
||||
{languages.map(({ code, name, localName }) => (
|
||||
<p key={code} className={styles.language} onClick={() => handleChangeLanguage(code)}>
|
||||
{name} {localName && `(${localName})`}
|
||||
</p>
|
||||
))}
|
||||
|
||||
<a href="https://translate.rxresu.me" target="_blank" rel="noreferrer" className={styles.language}>
|
||||
{t('common.footer.language.missing')}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</Popover>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default LanguageSwitcher;
|
||||
@ -3,6 +3,7 @@ import { Divider, IconButton, ListItemIcon, ListItemText, Menu, MenuItem, Toolti
|
||||
import { ListItem as ListItemType } from '@reactive-resume/schema';
|
||||
import clsx from 'clsx';
|
||||
import isFunction from 'lodash/isFunction';
|
||||
import { useTranslation } from 'next-i18next';
|
||||
import React, { useRef, useState } from 'react';
|
||||
import { DropTargetMonitor, useDrag, useDrop, XYCoord } from 'react-dnd';
|
||||
|
||||
@ -26,6 +27,8 @@ type Props = {
|
||||
};
|
||||
|
||||
const ListItem: React.FC<Props> = ({ item, index, title, subtitle, onMove, onEdit, onDelete, onDuplicate }) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
const ref = useRef<HTMLDivElement>(null);
|
||||
const [anchorEl, setAnchorEl] = useState<Element | null>(null);
|
||||
|
||||
@ -122,29 +125,25 @@ const ListItem: React.FC<Props> = ({ item, index, title, subtitle, onMove, onEdi
|
||||
<ListItemIcon>
|
||||
<DriveFileRenameOutline className="scale-90" />
|
||||
</ListItemIcon>
|
||||
<ListItemText>Edit</ListItemText>
|
||||
<ListItemText>{t('builder.common.list.actions.edit')}</ListItemText>
|
||||
</MenuItem>
|
||||
|
||||
<MenuItem onClick={() => handleDuplicate(item)}>
|
||||
<ListItemIcon>
|
||||
<FileCopy className="scale-90" />
|
||||
</ListItemIcon>
|
||||
<ListItemText>Duplicate</ListItemText>
|
||||
<ListItemText>{t('builder.common.list.actions.duplicate')}</ListItemText>
|
||||
</MenuItem>
|
||||
|
||||
<Divider />
|
||||
|
||||
<Tooltip
|
||||
arrow
|
||||
placement="right"
|
||||
title="Are you sure you want to delete this item? This is an irreversible action."
|
||||
>
|
||||
<Tooltip arrow placement="right" title={t('builder.common.tooltip.delete-item') as string}>
|
||||
<div>
|
||||
<MenuItem onClick={() => handleDelete(item)}>
|
||||
<ListItemIcon>
|
||||
<DeleteOutline className="scale-90" />
|
||||
</ListItemIcon>
|
||||
<ListItemText>Delete</ListItemText>
|
||||
<ListItemText>{t('builder.common.list.actions.delete')}</ListItemText>
|
||||
</MenuItem>
|
||||
</div>
|
||||
</Tooltip>
|
||||
|
||||
@ -9,7 +9,32 @@ export const languages: Language[] = [
|
||||
code: 'en',
|
||||
name: 'English',
|
||||
},
|
||||
];
|
||||
{
|
||||
code: 'de',
|
||||
name: 'German',
|
||||
localName: 'Deutsch',
|
||||
},
|
||||
{
|
||||
code: 'hi',
|
||||
name: 'Hindi',
|
||||
localName: 'हिन्दी',
|
||||
},
|
||||
{
|
||||
code: 'kn',
|
||||
name: 'Kannada',
|
||||
localName: 'ಕನ್ನಡ',
|
||||
},
|
||||
{
|
||||
code: 'es',
|
||||
name: 'Spanish',
|
||||
localName: 'Español',
|
||||
},
|
||||
{
|
||||
code: 'ta',
|
||||
name: 'Tamil',
|
||||
localName: 'தமிழ்',
|
||||
},
|
||||
].sort((a, b) => a.name.localeCompare(b.name));
|
||||
|
||||
export const languageMap: Record<string, Language> = languages.reduce(
|
||||
(acc, lang) => ({
|
||||
|
||||
@ -2,6 +2,9 @@
|
||||
export const FONTS_QUERY = 'fonts';
|
||||
export const RESUMES_QUERY = 'resumes';
|
||||
|
||||
// Regular Expressions
|
||||
export const VALID_URL_REGEX = /[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;
|
||||
|
||||
// Date Formats
|
||||
export const FILENAME_TIMESTAMP = 'DDMMYYYYHHmmss';
|
||||
|
||||
|
||||
@ -122,7 +122,7 @@ const LoginModal: React.FC = () => {
|
||||
startIcon={<Google />}
|
||||
onClick={handleLoginWithGoogle}
|
||||
>
|
||||
{t('modals.auth.login.actions.login-google')}
|
||||
{t('modals.auth.login.actions.google')}
|
||||
</Button>
|
||||
|
||||
<Button type="submit" onClick={handleSubmit(onSubmit)} disabled={isLoading}>
|
||||
|
||||
@ -1,13 +1,15 @@
|
||||
import env from '@beam-australia/react-env';
|
||||
import { joiResolver } from '@hookform/resolvers/joi';
|
||||
import { HowToReg } from '@mui/icons-material';
|
||||
import { Google, HowToReg } from '@mui/icons-material';
|
||||
import { Button, TextField } from '@mui/material';
|
||||
import Joi from 'joi';
|
||||
import { Trans, useTranslation } from 'next-i18next';
|
||||
import { GoogleLoginResponse, GoogleLoginResponseOffline, useGoogleLogin } from 'react-google-login';
|
||||
import { Controller, useForm } from 'react-hook-form';
|
||||
import { useMutation } from 'react-query';
|
||||
|
||||
import BaseModal from '@/components/shared/BaseModal';
|
||||
import { register as registerUser, RegisterParams } from '@/services/auth';
|
||||
import { loginWithGoogle, LoginWithGoogleParams, register as registerUser, RegisterParams } from '@/services/auth';
|
||||
import { ServerError } from '@/services/axios';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setModalState } from '@/store/modal/modalSlice';
|
||||
@ -56,6 +58,19 @@ const RegisterModal: React.FC = () => {
|
||||
|
||||
const { mutateAsync, isLoading } = useMutation<void, ServerError, RegisterParams>(registerUser);
|
||||
|
||||
const { mutateAsync: loginWithGoogleMutation } = useMutation<void, ServerError, LoginWithGoogleParams>(
|
||||
loginWithGoogle
|
||||
);
|
||||
|
||||
const { signIn } = useGoogleLogin({
|
||||
clientId: env('GOOGLE_CLIENT_ID'),
|
||||
onSuccess: async (response: GoogleLoginResponse | GoogleLoginResponseOffline) => {
|
||||
await loginWithGoogleMutation({ accessToken: (response as GoogleLoginResponse).accessToken });
|
||||
|
||||
handleClose();
|
||||
},
|
||||
});
|
||||
|
||||
const handleClose = () => {
|
||||
dispatch(setModalState({ modal: 'auth.register', state: { open: false } }));
|
||||
reset();
|
||||
@ -63,7 +78,6 @@ const RegisterModal: React.FC = () => {
|
||||
|
||||
const onSubmit = async ({ name, username, email, password }: FormData) => {
|
||||
await mutateAsync({ name, username, email, password });
|
||||
|
||||
handleClose();
|
||||
};
|
||||
|
||||
@ -72,6 +86,10 @@ const RegisterModal: React.FC = () => {
|
||||
dispatch(setModalState({ modal: 'auth.login', state: { open: true } }));
|
||||
};
|
||||
|
||||
const handleLoginWithGoogle = () => {
|
||||
signIn();
|
||||
};
|
||||
|
||||
return (
|
||||
<BaseModal
|
||||
icon={<HowToReg />}
|
||||
@ -79,9 +97,21 @@ const RegisterModal: React.FC = () => {
|
||||
heading={t('modals.auth.register.heading')}
|
||||
handleClose={handleClose}
|
||||
footerChildren={
|
||||
<Button type="submit" onClick={handleSubmit(onSubmit)} disabled={isLoading}>
|
||||
{t('modals.auth.register.actions.register')}
|
||||
</Button>
|
||||
<>
|
||||
<Button
|
||||
type="submit"
|
||||
variant="outlined"
|
||||
disabled={isLoading}
|
||||
startIcon={<Google />}
|
||||
onClick={handleLoginWithGoogle}
|
||||
>
|
||||
{t('modals.auth.register.actions.google')}
|
||||
</Button>
|
||||
|
||||
<Button type="submit" onClick={handleSubmit(onSubmit)} disabled={isLoading}>
|
||||
{t('modals.auth.register.actions.register')}
|
||||
</Button>
|
||||
</>
|
||||
}
|
||||
>
|
||||
<p>{t('modals.auth.register.body')}</p>
|
||||
|
||||
@ -13,6 +13,7 @@ import { Controller, useForm } from 'react-hook-form';
|
||||
|
||||
import BaseModal from '@/components/shared/BaseModal';
|
||||
import MarkdownSupported from '@/components/shared/MarkdownSupported';
|
||||
import { VALID_URL_REGEX } from '@/constants/index';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setModalState } from '@/store/modal/modalSlice';
|
||||
import { addItem, editItem } from '@/store/resume/resumeSlice';
|
||||
@ -34,9 +35,7 @@ const schema = Joi.object<FormData>().keys({
|
||||
title: Joi.string().required(),
|
||||
awarder: Joi.string().required(),
|
||||
date: Joi.string().allow(''),
|
||||
url: Joi.string()
|
||||
.pattern(/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/, { name: 'valid URL' })
|
||||
.allow(''),
|
||||
url: Joi.string().pattern(VALID_URL_REGEX, { name: 'valid URL' }).allow(''),
|
||||
summary: Joi.string().allow(''),
|
||||
});
|
||||
|
||||
@ -154,6 +153,7 @@ const AwardModal: React.FC = () => {
|
||||
render={({ field, fieldState }) => (
|
||||
<TextField
|
||||
label={t('builder.common.form.url.label')}
|
||||
placeholder="https://"
|
||||
error={!!fieldState.error}
|
||||
helperText={fieldState.error?.message}
|
||||
{...field}
|
||||
|
||||
@ -13,6 +13,7 @@ import { Controller, useForm } from 'react-hook-form';
|
||||
|
||||
import BaseModal from '@/components/shared/BaseModal';
|
||||
import MarkdownSupported from '@/components/shared/MarkdownSupported';
|
||||
import { VALID_URL_REGEX } from '@/constants/index';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setModalState } from '@/store/modal/modalSlice';
|
||||
import { addItem, editItem } from '@/store/resume/resumeSlice';
|
||||
@ -34,9 +35,7 @@ const schema = Joi.object<FormData>().keys({
|
||||
name: Joi.string().required(),
|
||||
issuer: Joi.string().required(),
|
||||
date: Joi.string().allow(''),
|
||||
url: Joi.string()
|
||||
.pattern(/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/, { name: 'valid URL' })
|
||||
.allow(''),
|
||||
url: Joi.string().pattern(VALID_URL_REGEX, { name: 'valid URL' }).allow(''),
|
||||
summary: Joi.string().allow(''),
|
||||
});
|
||||
|
||||
@ -154,6 +153,7 @@ const CertificateModal: React.FC = () => {
|
||||
render={({ field, fieldState }) => (
|
||||
<TextField
|
||||
label={t('builder.common.form.url.label')}
|
||||
placeholder="https://"
|
||||
error={!!fieldState.error}
|
||||
helperText={fieldState.error?.message}
|
||||
{...field}
|
||||
|
||||
@ -14,6 +14,7 @@ import { Controller, useForm } from 'react-hook-form';
|
||||
import ArrayInput from '@/components/shared/ArrayInput';
|
||||
import BaseModal from '@/components/shared/BaseModal';
|
||||
import MarkdownSupported from '@/components/shared/MarkdownSupported';
|
||||
import { VALID_URL_REGEX } from '@/constants/index';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setModalState } from '@/store/modal/modalSlice';
|
||||
import { addItem, editItem } from '@/store/resume/resumeSlice';
|
||||
@ -47,9 +48,7 @@ const schema = Joi.object<FormData>().keys({
|
||||
start: Joi.string().allow(''),
|
||||
end: Joi.string().allow(''),
|
||||
}),
|
||||
url: Joi.string()
|
||||
.pattern(/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/, { name: 'valid URL' })
|
||||
.allow(''),
|
||||
url: Joi.string().pattern(VALID_URL_REGEX, { name: 'valid URL' }).allow(''),
|
||||
level: Joi.string().allow(''),
|
||||
levelNum: Joi.number().min(0).max(10),
|
||||
summary: Joi.string().allow(''),
|
||||
@ -194,6 +193,7 @@ const CustomModal: React.FC = () => {
|
||||
render={({ field, fieldState }) => (
|
||||
<TextField
|
||||
label={t('builder.common.form.url.label')}
|
||||
placeholder="https://"
|
||||
className="col-span-2"
|
||||
error={!!fieldState.error}
|
||||
helperText={fieldState.error?.message}
|
||||
|
||||
@ -14,6 +14,7 @@ import { Controller, useForm } from 'react-hook-form';
|
||||
import ArrayInput from '@/components/shared/ArrayInput';
|
||||
import BaseModal from '@/components/shared/BaseModal';
|
||||
import MarkdownSupported from '@/components/shared/MarkdownSupported';
|
||||
import { VALID_URL_REGEX } from '@/constants/index';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setModalState } from '@/store/modal/modalSlice';
|
||||
import { addItem, editItem } from '@/store/resume/resumeSlice';
|
||||
@ -46,9 +47,7 @@ const schema = Joi.object<FormData>().keys({
|
||||
start: Joi.string().allow(''),
|
||||
end: Joi.string().allow(''),
|
||||
}),
|
||||
url: Joi.string()
|
||||
.pattern(/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/, { name: 'valid URL' })
|
||||
.allow(''),
|
||||
url: Joi.string().pattern(VALID_URL_REGEX, { name: 'valid URL' }).allow(''),
|
||||
summary: Joi.string().allow(''),
|
||||
courses: Joi.array().items(Joi.string().optional()),
|
||||
});
|
||||
@ -217,6 +216,7 @@ const EducationModal: React.FC = () => {
|
||||
render={({ field, fieldState }) => (
|
||||
<TextField
|
||||
label={t('builder.common.form.url.label')}
|
||||
placeholder="https://"
|
||||
className="col-span-2"
|
||||
error={!!fieldState.error}
|
||||
helperText={fieldState.error?.message}
|
||||
|
||||
@ -10,6 +10,7 @@ import { useEffect, useMemo } from 'react';
|
||||
import { Controller, useForm } from 'react-hook-form';
|
||||
|
||||
import BaseModal from '@/components/shared/BaseModal';
|
||||
import { VALID_URL_REGEX } from '@/constants/index';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setModalState } from '@/store/modal/modalSlice';
|
||||
import { addItem, editItem } from '@/store/resume/resumeSlice';
|
||||
@ -21,17 +22,14 @@ const path = 'sections.profile';
|
||||
const defaultState: FormData = {
|
||||
network: '',
|
||||
username: '',
|
||||
url: 'https://',
|
||||
url: '',
|
||||
};
|
||||
|
||||
const schema = Joi.object<FormData>({
|
||||
id: Joi.string(),
|
||||
network: Joi.string().required(),
|
||||
username: Joi.string().required(),
|
||||
url: Joi.string()
|
||||
.pattern(/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/, { name: 'valid URL' })
|
||||
.default('https://')
|
||||
.allow(''),
|
||||
url: Joi.string().pattern(VALID_URL_REGEX, { name: 'valid URL' }).allow(''),
|
||||
});
|
||||
|
||||
const ProfileModal: React.FC = () => {
|
||||
@ -45,10 +43,10 @@ const ProfileModal: React.FC = () => {
|
||||
const isEditMode = useMemo(() => !!item, [item]);
|
||||
|
||||
const addText = t('builder.common.actions.add', {
|
||||
section: t('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
|
||||
token: t('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
|
||||
});
|
||||
const editText = t('builder.common.actions.edit', {
|
||||
section: t('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
|
||||
token: t('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
|
||||
});
|
||||
|
||||
const { reset, control, handleSubmit } = useForm<FormData>({
|
||||
@ -131,6 +129,7 @@ const ProfileModal: React.FC = () => {
|
||||
<TextField
|
||||
label={t('builder.common.form.url.label')}
|
||||
className="col-span-2"
|
||||
placeholder="https://"
|
||||
error={!!fieldState.error}
|
||||
helperText={fieldState.error?.message}
|
||||
{...field}
|
||||
|
||||
@ -14,6 +14,7 @@ import { Controller, useForm } from 'react-hook-form';
|
||||
import ArrayInput from '@/components/shared/ArrayInput';
|
||||
import BaseModal from '@/components/shared/BaseModal';
|
||||
import MarkdownSupported from '@/components/shared/MarkdownSupported';
|
||||
import { VALID_URL_REGEX } from '@/constants/index';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setModalState } from '@/store/modal/modalSlice';
|
||||
import { addItem, editItem } from '@/store/resume/resumeSlice';
|
||||
@ -42,9 +43,7 @@ const schema = Joi.object<FormData>().keys({
|
||||
start: Joi.string().allow(''),
|
||||
end: Joi.string().allow(''),
|
||||
}),
|
||||
url: Joi.string()
|
||||
.pattern(/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/, { name: 'valid URL' })
|
||||
.allow(''),
|
||||
url: Joi.string().pattern(VALID_URL_REGEX, { name: 'valid URL' }).allow(''),
|
||||
summary: Joi.string().allow(''),
|
||||
keywords: Joi.array().items(Joi.string().optional()),
|
||||
});
|
||||
@ -187,6 +186,7 @@ const ProjectModal: React.FC = () => {
|
||||
render={({ field, fieldState }) => (
|
||||
<TextField
|
||||
label={t('builder.common.form.url.label')}
|
||||
placeholder="https://"
|
||||
className="col-span-2"
|
||||
error={!!fieldState.error}
|
||||
helperText={fieldState.error?.message}
|
||||
|
||||
@ -13,6 +13,7 @@ import { Controller, useForm } from 'react-hook-form';
|
||||
|
||||
import BaseModal from '@/components/shared/BaseModal';
|
||||
import MarkdownSupported from '@/components/shared/MarkdownSupported';
|
||||
import { VALID_URL_REGEX } from '@/constants/index';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setModalState } from '@/store/modal/modalSlice';
|
||||
import { addItem, editItem } from '@/store/resume/resumeSlice';
|
||||
@ -34,9 +35,7 @@ const schema = Joi.object<FormData>().keys({
|
||||
name: Joi.string().required(),
|
||||
publisher: Joi.string().required(),
|
||||
date: Joi.string().allow(''),
|
||||
url: Joi.string()
|
||||
.pattern(/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/, { name: 'valid URL' })
|
||||
.allow(''),
|
||||
url: Joi.string().pattern(VALID_URL_REGEX, { name: 'valid URL' }).allow(''),
|
||||
summary: Joi.string().allow(''),
|
||||
});
|
||||
|
||||
@ -154,6 +153,7 @@ const PublicationModal: React.FC = () => {
|
||||
render={({ field, fieldState }) => (
|
||||
<TextField
|
||||
label={t('builder.common.form.url.label')}
|
||||
placeholder="https://"
|
||||
error={!!fieldState.error}
|
||||
helperText={fieldState.error?.message}
|
||||
{...field}
|
||||
|
||||
@ -13,6 +13,7 @@ import { Controller, useForm } from 'react-hook-form';
|
||||
|
||||
import BaseModal from '@/components/shared/BaseModal';
|
||||
import MarkdownSupported from '@/components/shared/MarkdownSupported';
|
||||
import { VALID_URL_REGEX } from '@/constants/index';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setModalState } from '@/store/modal/modalSlice';
|
||||
import { addItem, editItem } from '@/store/resume/resumeSlice';
|
||||
@ -40,9 +41,7 @@ const schema = Joi.object<FormData>().keys({
|
||||
start: Joi.string().allow(''),
|
||||
end: Joi.string().allow(''),
|
||||
}),
|
||||
url: Joi.string()
|
||||
.pattern(/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/, { name: 'valid URL' })
|
||||
.allow(''),
|
||||
url: Joi.string().pattern(VALID_URL_REGEX, { name: 'valid URL' }).allow(''),
|
||||
summary: Joi.string().allow(''),
|
||||
});
|
||||
|
||||
@ -184,6 +183,7 @@ const VolunteerModal: React.FC = () => {
|
||||
render={({ field, fieldState }) => (
|
||||
<TextField
|
||||
label={t('builder.common.form.url.label')}
|
||||
placeholder="https://"
|
||||
className="col-span-2"
|
||||
error={!!fieldState.error}
|
||||
helperText={fieldState.error?.message}
|
||||
|
||||
@ -13,6 +13,7 @@ import { Controller, useForm } from 'react-hook-form';
|
||||
|
||||
import BaseModal from '@/components/shared/BaseModal';
|
||||
import MarkdownSupported from '@/components/shared/MarkdownSupported';
|
||||
import { VALID_URL_REGEX } from '@/constants/index';
|
||||
import { useAppDispatch, useAppSelector } from '@/store/hooks';
|
||||
import { setModalState } from '@/store/modal/modalSlice';
|
||||
import { addItem, editItem } from '@/store/resume/resumeSlice';
|
||||
@ -40,9 +41,7 @@ const schema = Joi.object<FormData>().keys({
|
||||
start: Joi.string().allow(''),
|
||||
end: Joi.string().allow(''),
|
||||
}),
|
||||
url: Joi.string()
|
||||
.pattern(/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/, { name: 'valid URL' })
|
||||
.allow(''),
|
||||
url: Joi.string().pattern(VALID_URL_REGEX, { name: 'valid URL' }).allow(''),
|
||||
summary: Joi.string().allow(''),
|
||||
});
|
||||
|
||||
@ -184,6 +183,7 @@ const WorkModal: React.FC = () => {
|
||||
render={({ field, fieldState }) => (
|
||||
<TextField
|
||||
label={t('builder.common.form.url.label')}
|
||||
placeholder="https://"
|
||||
className="col-span-2"
|
||||
error={!!fieldState.error}
|
||||
helperText={fieldState.error?.message}
|
||||
|
||||
@ -125,7 +125,7 @@ const CreateResumeModal: React.FC = () => {
|
||||
|
||||
<FormGroup>
|
||||
<FormControlLabel
|
||||
label={t<string>('modals.dashboard.create-resume.form.public.label')}
|
||||
label={t('modals.dashboard.create-resume.form.public.label') as string}
|
||||
control={
|
||||
<Controller
|
||||
name="isPublic"
|
||||
|
||||
@ -84,7 +84,7 @@ const ImportExternalModal: React.FC = () => {
|
||||
<p className="mb-2">
|
||||
<Trans t={t} i18nKey="modals.dashboard.import-external.linkedin.body">
|
||||
You can save time by exporting your data from LinkedIn and using it to auto-fill fields on Reactive Resume.
|
||||
Head on over to the
|
||||
Head over to the
|
||||
<a
|
||||
href="https://www.linkedin.com/psettings/member-data"
|
||||
className="underline"
|
||||
@ -93,7 +93,7 @@ const ImportExternalModal: React.FC = () => {
|
||||
>
|
||||
Data Privacy
|
||||
</a>
|
||||
section on LinkedIn and request an archive of your data. Once it is available, upload the ZIP archive below.
|
||||
section on LinkedIn and request an archive of your data. Once it is available, upload the ZIP file below.
|
||||
</Trans>
|
||||
</p>
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ const path = require('path');
|
||||
const i18nConfig = {
|
||||
i18n: {
|
||||
defaultLocale: 'en',
|
||||
locales: ['en', 'ta'],
|
||||
locales: ['de', 'en', 'es', 'kn', 'ta', 'hi'],
|
||||
},
|
||||
nsSeparator: '.',
|
||||
localePath: path.resolve('./public/locales'),
|
||||
|
||||
6
client/next-sitemap.config.js
Normal file
6
client/next-sitemap.config.js
Normal file
@ -0,0 +1,6 @@
|
||||
/** @type {import('next-sitemap').IConfig} */
|
||||
module.exports = {
|
||||
siteUrl: 'https://rxresu.me',
|
||||
changefreq: 'monthly',
|
||||
generateRobotsTxt: true,
|
||||
};
|
||||
@ -2,9 +2,10 @@
|
||||
"name": "@reactive-resume/client",
|
||||
"scripts": {
|
||||
"dev": "react-env --prefix PUBLIC -- next dev",
|
||||
"build": "next build",
|
||||
"build": "next build && npm run sitemap",
|
||||
"start": "react-env --prefix PUBLIC -- next start",
|
||||
"lint": "next lint --fix"
|
||||
"lint": "next lint --fix",
|
||||
"sitemap": "next-sitemap --config next-sitemap.config.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@beam-australia/react-env": "^3.1.1",
|
||||
@ -67,6 +68,7 @@
|
||||
"autoprefixer": "^10.4.2",
|
||||
"eslint": "^8.10.0",
|
||||
"eslint-config-next": "12.1.0",
|
||||
"next-sitemap": "^2.5.7",
|
||||
"postcss": "^8.4.8",
|
||||
"prettier": "^2.5.1",
|
||||
"sass": "^1.49.9",
|
||||
|
||||
@ -9,6 +9,7 @@ import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
|
||||
|
||||
import Testimony from '@/components/landing/Testimony';
|
||||
import Footer from '@/components/shared/Footer';
|
||||
import LanguageSwitcher from '@/components/shared/LanguageSwitcher';
|
||||
import Logo from '@/components/shared/Logo';
|
||||
import NoSSR from '@/components/shared/NoSSR';
|
||||
import { screenshots } from '@/config/screenshots';
|
||||
@ -147,18 +148,6 @@ const Home: NextPage = () => {
|
||||
<h6>{t('landing.links.heading')}</h6>
|
||||
|
||||
<div>
|
||||
<a href={GITHUB_URL} target="_blank" rel="noreferrer">
|
||||
<Button variant="text" startIcon={<LinkIcon />}>
|
||||
{t('landing.links.links.github')}
|
||||
</Button>
|
||||
</a>
|
||||
|
||||
<a href={DONATION_URL} target="_blank" rel="noreferrer">
|
||||
<Button variant="text" startIcon={<LinkIcon />}>
|
||||
{t('landing.links.links.donate')}
|
||||
</Button>
|
||||
</a>
|
||||
|
||||
<Link href="/meta/privacy" passHref>
|
||||
<Button variant="text" startIcon={<LinkIcon />}>
|
||||
{t('landing.links.links.privacy')}
|
||||
@ -170,6 +159,18 @@ const Home: NextPage = () => {
|
||||
{t('landing.links.links.service')}
|
||||
</Button>
|
||||
</Link>
|
||||
|
||||
<a href={GITHUB_URL} target="_blank" rel="noreferrer">
|
||||
<Button variant="text" startIcon={<LinkIcon />}>
|
||||
{t('landing.links.links.github')}
|
||||
</Button>
|
||||
</a>
|
||||
|
||||
<a href={DONATION_URL} target="_blank" rel="noreferrer">
|
||||
<Button variant="text" startIcon={<LinkIcon />}>
|
||||
{t('landing.links.links.donate')}
|
||||
</Button>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@ -180,9 +181,13 @@ const Home: NextPage = () => {
|
||||
</section>
|
||||
|
||||
<footer>
|
||||
<Footer className="font-semibold leading-5 opacity-50" />
|
||||
<div className={styles.version}>
|
||||
<Footer className="font-semibold leading-5 opacity-50" />
|
||||
|
||||
<div>v{process.env.appVersion}</div>
|
||||
<div>v{process.env.appVersion}</div>
|
||||
</div>
|
||||
|
||||
<LanguageSwitcher />
|
||||
</footer>
|
||||
</main>
|
||||
);
|
||||
|
||||
358
client/public/locales/de/builder.json
Normal file
358
client/public/locales/de/builder.json
Normal file
@ -0,0 +1,358 @@
|
||||
{
|
||||
"common": {
|
||||
"actions": {
|
||||
"add": "Neue {{token}} hinzufügen",
|
||||
"delete": "Löschen {{token}}",
|
||||
"edit": "Bearbeiten {{token}}"
|
||||
},
|
||||
"columns": {
|
||||
"heading": "Spalten",
|
||||
"tooltip": "Anzahl der Spalten ändern"
|
||||
},
|
||||
"form": {
|
||||
"date": {
|
||||
"label": "Datum"
|
||||
},
|
||||
"description": {
|
||||
"label": "Beschreibung"
|
||||
},
|
||||
"email": {
|
||||
"label": "E-Mail Adresse"
|
||||
},
|
||||
"end-date": {
|
||||
"help-text": "Dieses Feld leer lassen, wenn noch vorhanden",
|
||||
"label": "Enddatum"
|
||||
},
|
||||
"keywords": {
|
||||
"label": "Stichwörter"
|
||||
},
|
||||
"level": {
|
||||
"label": "Ebene"
|
||||
},
|
||||
"levelNum": {
|
||||
"label": "Ebene (Anzahl)"
|
||||
},
|
||||
"name": {
|
||||
"label": "Name"
|
||||
},
|
||||
"phone": {
|
||||
"label": "Telefonnummer"
|
||||
},
|
||||
"position": {
|
||||
"label": "Position"
|
||||
},
|
||||
"start-date": {
|
||||
"label": "Startdatum"
|
||||
},
|
||||
"subtitle": {
|
||||
"label": "Untertitel"
|
||||
},
|
||||
"summary": {
|
||||
"label": "Zusammenfassung"
|
||||
},
|
||||
"title": {
|
||||
"label": "Titel"
|
||||
},
|
||||
"url": {
|
||||
"label": "Webseite"
|
||||
}
|
||||
},
|
||||
"glossary": {
|
||||
"page": "Seite"
|
||||
},
|
||||
"list": {
|
||||
"actions": {
|
||||
"delete": "Löschen",
|
||||
"duplicate": "Duplizieren",
|
||||
"edit": "Bearbeiten"
|
||||
},
|
||||
"empty-text": "Diese Liste ist leer."
|
||||
},
|
||||
"tooltip": {
|
||||
"delete-item": "Sind Sie sicher, dass Sie dieses Element löschen möchten? Dies ist eine unumkehrbare Aktion.",
|
||||
"delete-section": "Abschnitt löschen",
|
||||
"rename-section": "Abschnitt umbenennen",
|
||||
"toggle-visibility": "Sichtbarkeit umschalten"
|
||||
}
|
||||
},
|
||||
"controller": {
|
||||
"tooltip": {
|
||||
"center-artboard": "Artboard zentrieren",
|
||||
"copy-link": "Link zum Lebenslauf kopieren",
|
||||
"export-pdf": "PDF exportieren",
|
||||
"toggle-orientation": "Seitenausrichtung umschalten",
|
||||
"toggle-page-break-line": "Pausenzeile umschalten",
|
||||
"toggle-sidebars": "Seitenleisten umschalten",
|
||||
"zoom-in": "Vergrößern",
|
||||
"zoom-out": "Verkleinern"
|
||||
}
|
||||
},
|
||||
"header": {
|
||||
"menu": {
|
||||
"delete": "Löschen",
|
||||
"duplicate": "Duplizieren",
|
||||
"rename": "Umbenennen",
|
||||
"share-link": "Link teilen",
|
||||
"tooltips": {
|
||||
"delete": "Sind Sie sicher, dass Sie diesen Lebenslauf löschen möchten? Dies ist eine unumkehrbare Aktion.",
|
||||
"share-link": "Du musst die Sichtbarkeit deines Lebenslaufs in die Öffentlichkeit ändern, um ihn für andere sichtbar zu machen."
|
||||
}
|
||||
}
|
||||
},
|
||||
"leftSidebar": {
|
||||
"sections": {
|
||||
"awards": {
|
||||
"form": {
|
||||
"awarder": {
|
||||
"label": "Auszeichnung"
|
||||
}
|
||||
}
|
||||
},
|
||||
"basics": {
|
||||
"actions": {
|
||||
"photo-filters": "Fotofilter"
|
||||
},
|
||||
"heading": "Grundlagen",
|
||||
"headline": {
|
||||
"label": "Überschrift"
|
||||
},
|
||||
"name": {
|
||||
"label": "Voller Name"
|
||||
},
|
||||
"photo-filters": {
|
||||
"effects": {
|
||||
"border": {
|
||||
"label": "Grenze"
|
||||
},
|
||||
"grayscale": {
|
||||
"label": "Graustufen"
|
||||
},
|
||||
"heading": "Effekte"
|
||||
},
|
||||
"shape": {
|
||||
"heading": "Form"
|
||||
},
|
||||
"size": {
|
||||
"heading": "Größe (in px)"
|
||||
}
|
||||
},
|
||||
"photo-upload": {
|
||||
"tooltip": {
|
||||
"remove": "Foto entfernen",
|
||||
"upload": "Foto hochladen"
|
||||
}
|
||||
}
|
||||
},
|
||||
"certifications": {
|
||||
"form": {
|
||||
"issuer": {
|
||||
"label": "Aussteller"
|
||||
}
|
||||
}
|
||||
},
|
||||
"education": {
|
||||
"form": {
|
||||
"area-study": {
|
||||
"label": "Studienbereich"
|
||||
},
|
||||
"courses": {
|
||||
"label": "Kurse"
|
||||
},
|
||||
"degree": {
|
||||
"label": "Grad"
|
||||
},
|
||||
"grade": {
|
||||
"label": "Note"
|
||||
},
|
||||
"institution": {
|
||||
"label": "Institution"
|
||||
}
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"address": {
|
||||
"label": "Adresse"
|
||||
},
|
||||
"city": {
|
||||
"label": "Stadt"
|
||||
},
|
||||
"country": {
|
||||
"label": "Land"
|
||||
},
|
||||
"heading": "Standort",
|
||||
"postal-code": {
|
||||
"label": "Postleitzahl"
|
||||
},
|
||||
"region": {
|
||||
"label": "Region"
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"form": {
|
||||
"network": {
|
||||
"label": "Netzwerk"
|
||||
},
|
||||
"username": {
|
||||
"label": "Benutzername"
|
||||
}
|
||||
},
|
||||
"heading": "Profiles",
|
||||
"heading_one": "Profil"
|
||||
},
|
||||
"publications": {
|
||||
"form": {
|
||||
"publisher": {
|
||||
"label": "Herausgeber"
|
||||
}
|
||||
}
|
||||
},
|
||||
"references": {
|
||||
"form": {
|
||||
"relationship": {
|
||||
"label": "Beziehung"
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
"heading": "Abschnitt"
|
||||
},
|
||||
"volunteer": {
|
||||
"form": {
|
||||
"organization": {
|
||||
"label": "Organisation"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"rightSidebar": {
|
||||
"sections": {
|
||||
"css": {
|
||||
"heading": "Benutzerdefiniertes CSS"
|
||||
},
|
||||
"export": {
|
||||
"heading": "Exportieren",
|
||||
"json": {
|
||||
"primary": "JSON",
|
||||
"secondary": "Laden Sie eine JSON-Version Ihres Lebenslaufs herunter, die Sie wieder in Reaktives Lebenslauf importieren können."
|
||||
},
|
||||
"pdf": {
|
||||
"loading": {
|
||||
"primary": "PDF wird erstellt",
|
||||
"secondary": "Bitte warten Sie, wenn Ihr PDF generiert wird, dies kann bis zu 15 Sekunden dauern."
|
||||
},
|
||||
"normal": {
|
||||
"primary": "PDF",
|
||||
"secondary": "Laden Sie sich ein PDF Ihres Lebenslaufs herunter, das Sie ausdrucken und an Ihren Traumjob senden können. Diese Datei kann nicht zur weiteren Bearbeitung importiert werden."
|
||||
}
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
"heading": "Layout",
|
||||
"tooltip": {
|
||||
"reset-layout": "Layout zurücksetzen"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"bugs-features": {
|
||||
"body": "Hält Sie etwas davon ab, einen Lebenslauf zu erstellen? Oder haben Sie eine tolle Idee, die Sie hinzufügen möchten? Erhöhen Sie einen Eintrag auf GitHub, um loszulegen.",
|
||||
"button": "GitHub Themen",
|
||||
"heading": "Fehler? Feature-Anfragen?"
|
||||
},
|
||||
"donate": {
|
||||
"body": "Wenn Ihnen Reactive Resume gefallen hat, denken Sie bitte darüber nach, so viel wie möglich zu spenden, damit die App für immer kostenlos und werbefrei bleibt.",
|
||||
"button": "Kaufe mir einen Kaffee",
|
||||
"heading": "Spenden an Reaktives Lebenslauf"
|
||||
},
|
||||
"github": "Quellcode",
|
||||
"heading": "Links"
|
||||
},
|
||||
"settings": {
|
||||
"global": {
|
||||
"date": {
|
||||
"primary": "Datum",
|
||||
"secondary": "Datumsformat für die gesamte App"
|
||||
},
|
||||
"heading": "Globale",
|
||||
"language": {
|
||||
"primary": "Sprache",
|
||||
"secondary": "Sprache anzeigen, die in der gesamten App verwendet wird"
|
||||
},
|
||||
"theme": {
|
||||
"primary": "Thema"
|
||||
}
|
||||
},
|
||||
"heading": "Einstellungen",
|
||||
"page": {
|
||||
"break-line": {
|
||||
"primary": "Linie anhalten",
|
||||
"secondary": "Zeile auf allen Seiten anzeigen, um die Höhe einer A4-Seite zu markieren"
|
||||
},
|
||||
"heading": "Seite",
|
||||
"orientation": {
|
||||
"disabled": "Hat keine Auswirkung, wenn nur eine Seite vorhanden ist",
|
||||
"primary": "Ausrichtung",
|
||||
"secondary": "Ob Seiten horizontal oder vertikal angezeigt werden sollen"
|
||||
}
|
||||
},
|
||||
"resume": {
|
||||
"heading": "Lebenslauf",
|
||||
"reset": {
|
||||
"primary": "Alles zurücksetzen",
|
||||
"secondary": "Zu viele Fehler gemacht? Klicken Sie hier, um alle Änderungen zurückzusetzen und bei Null zu beginnen. Sei vorsichtig, diese Aktion kann nicht rückgängig gemacht werden."
|
||||
},
|
||||
"sample": {
|
||||
"primary": "Beispieldaten laden",
|
||||
"secondary": "Nicht sicher, wo man anfangen soll? Klicken Sie hier, um ein paar Beispieldaten zu laden, um zu sehen, wie ein vollständiger Lebenslauf aussieht."
|
||||
}
|
||||
}
|
||||
},
|
||||
"sharing": {
|
||||
"heading": "Teilen",
|
||||
"short-url": {
|
||||
"label": "Kurze URL bevorzugen"
|
||||
},
|
||||
"visibility": {
|
||||
"subtitle": "Erlaube jemandem mit einem Link deinen Lebenslauf anzusehen",
|
||||
"title": "Öffentlich"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"heading": "Vorlagen"
|
||||
},
|
||||
"theme": {
|
||||
"form": {
|
||||
"background": {
|
||||
"label": "Hintergrund"
|
||||
},
|
||||
"primary": {
|
||||
"label": "Primär"
|
||||
},
|
||||
"text": {
|
||||
"label": "Text"
|
||||
}
|
||||
},
|
||||
"heading": "Thema"
|
||||
},
|
||||
"typography": {
|
||||
"form": {
|
||||
"font-family": {
|
||||
"label": "Schriftfamilie"
|
||||
},
|
||||
"font-size": {
|
||||
"label": "Schriftgröße"
|
||||
}
|
||||
},
|
||||
"heading": "Typographie",
|
||||
"widgets": {
|
||||
"body": {
|
||||
"label": "Körper"
|
||||
},
|
||||
"headings": {
|
||||
"label": "Überschriften"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
32
client/public/locales/de/common.json
Normal file
32
client/public/locales/de/common.json
Normal file
@ -0,0 +1,32 @@
|
||||
{
|
||||
"avatar": {
|
||||
"menu": {
|
||||
"greeting": "Hallo",
|
||||
"logout": "Abmelden"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"credit": "Ein Herzensprojekt von <1>Amruth Pillai</1>",
|
||||
"language": {
|
||||
"missing": "Ihre Sprache fehlt?"
|
||||
},
|
||||
"license": "Von der Gemeinschaft, für die Gemeinschaft."
|
||||
},
|
||||
"markdown": {
|
||||
"help-text": "Dieser Abschnitt unterstützt <1>Markdown</1> Formatierung."
|
||||
},
|
||||
"date": {
|
||||
"present": "Gegenwärtig"
|
||||
},
|
||||
"subtitle": "Ein freier und Open-Source-Lebenslauf-Builder.",
|
||||
"title": "Reaktives Lebenslauf",
|
||||
"toast": {
|
||||
"error": {
|
||||
"upload-file-size": "Bitte laden Sie nur Dateien unter 2 Megabytes hoch.",
|
||||
"upload-photo-size": "Bitte laden Sie nur Fotos unter 2 Megabytes hoch, vorzugsweise quadratisch."
|
||||
},
|
||||
"success": {
|
||||
"resume-link-copied": "Ein Link zu deinem Lebenslauf wurde in deine Zwischenablage kopiert."
|
||||
}
|
||||
}
|
||||
}
|
||||
25
client/public/locales/de/dashboard.json
Normal file
25
client/public/locales/de/dashboard.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"create-resume": {
|
||||
"subtitle": "Bei Null anfangen",
|
||||
"title": "Neuen Lebenslauf erstellen"
|
||||
},
|
||||
"import-external": {
|
||||
"subtitle": "LinkedIn, JSON Resume, Reaktives Lebenslauf",
|
||||
"title": "Aus externen Quellen importieren"
|
||||
},
|
||||
"resume": {
|
||||
"menu": {
|
||||
"delete": "Löschen",
|
||||
"duplicate": "Duplizieren",
|
||||
"open": "Öffnen",
|
||||
"rename": "Umbenennen",
|
||||
"share-link": "Link teilen",
|
||||
"tooltips": {
|
||||
"delete": "Sind Sie sicher, dass Sie diesen Lebenslauf löschen möchten? Dies ist eine unumkehrbare Aktion.",
|
||||
"share-link": "Du musst die Sichtbarkeit deines Lebenslaufs in die Öffentlichkeit ändern, um ihn für andere sichtbar zu machen."
|
||||
}
|
||||
},
|
||||
"timestamp": "Zuletzt vor {{timestamp}} aktualisiert"
|
||||
},
|
||||
"title": "Dashboard"
|
||||
}
|
||||
41
client/public/locales/de/landing.json
Normal file
41
client/public/locales/de/landing.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"actions": {
|
||||
"app": "Gehe zu App",
|
||||
"login": "Anmelden",
|
||||
"logout": "Abmelden",
|
||||
"register": "Registrieren"
|
||||
},
|
||||
"features": {
|
||||
"heading": "Eigenschaften",
|
||||
"list": {
|
||||
"ads": "Keine Werbung",
|
||||
"export": "Exportieren Sie Ihren Lebenslauf in JSON oder PDF Format",
|
||||
"free": "Frei, für immer",
|
||||
"import": "Importiere Daten von LinkedIn, JSON Lebenslauf",
|
||||
"languages": "In mehreren Sprachen zugänglich",
|
||||
"more": "Und viel mehr aufregende Features, <1>lesen Sie alles hier</1>",
|
||||
"tracking": "Keine Benutzerverfolgung"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"heading": "Links",
|
||||
"links": {
|
||||
"donate": "Spenden",
|
||||
"github": "Quellcode",
|
||||
"privacy": "Datenschutzerklärung",
|
||||
"service": "Nutzungsbedingungen"
|
||||
}
|
||||
},
|
||||
"screenshots": {
|
||||
"heading": "Screenshots"
|
||||
},
|
||||
"testimonials": {
|
||||
"heading": "Referenzen",
|
||||
"body": "Gut oder schlecht, ich würde gerne Ihre Meinung über Reactive Resume und wie die Erfahrung war für Sie.<br/>Hier sind einige der Nachrichten, die von Benutzern auf der ganzen Welt gesendet werden.",
|
||||
"contact": "Du kannst mich über <1>meine E-Mail</1> oder über das Kontaktformular auf <3>meiner Website</3>erreichen."
|
||||
},
|
||||
"summary": {
|
||||
"body": "Reaktives Lebenslauf ist ein freier und Open-Source-Lebenslauf-Builder, der gebaut wurde, um die weltlichen Aufgaben zu machen, zu erstellen, Aktualisieren und teilen Sie Ihren Lebenslauf so einfach wie 1, 2, 3. Mit dieser App kannst du mehrere Bewerbungen erstellen, sie mit Recruitern oder Freunden über einen einzigartigen Link teilen und sie als PDF ausdrucken. alle kostenlos, keine Werbung, keine Verfolgung, ohne die Integrität und Privatsphäre Ihrer Daten zu verlieren.",
|
||||
"heading": "Zusammenfassung"
|
||||
}
|
||||
}
|
||||
135
client/public/locales/de/modals.json
Normal file
135
client/public/locales/de/modals.json
Normal file
@ -0,0 +1,135 @@
|
||||
{
|
||||
"auth": {
|
||||
"forgot-password": {
|
||||
"actions": {
|
||||
"send-email": "Passwort zurücksetzen E-Mail senden"
|
||||
},
|
||||
"body": "Geben Sie einfach die E-Mail-Adresse ein, die mit dem Konto verknüpft ist, das Sie wiederherstellen möchten.",
|
||||
"form": {
|
||||
"email": {
|
||||
"label": "E-Mail Adresse"
|
||||
}
|
||||
},
|
||||
"heading": "Passwort vergessen?",
|
||||
"help-text": "Wenn das Konto existiert, erhalten Sie eine E-Mail mit einem Link zum Zurücksetzen Ihres Passworts."
|
||||
},
|
||||
"login": {
|
||||
"actions": {
|
||||
"login": "Anmelden",
|
||||
"google": "Mit Google anmelden"
|
||||
},
|
||||
"body": "Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein, um sich anzumelden und zuzugreifen, Ihre Bewerbungen zu verwalten und weiterzugeben.",
|
||||
"form": {
|
||||
"password": {
|
||||
"label": "Passwort"
|
||||
},
|
||||
"username": {
|
||||
"help-text": "Sie können auch Ihre E-Mail-Adresse eingeben",
|
||||
"label": "Benutzername"
|
||||
}
|
||||
},
|
||||
"heading": "Bei Ihrem Konto anmelden",
|
||||
"recover-text": "Falls Sie Ihr Passwort vergessen haben, können Sie <1>Ihr Konto wiederherstellen</1> hier einrichten.",
|
||||
"register-text": "Wenn Sie keinen haben, können Sie hier <1>ein Konto erstellen</1> anlegen."
|
||||
},
|
||||
"register": {
|
||||
"actions": {
|
||||
"register": "Registrieren",
|
||||
"google": "Mit Google registrieren"
|
||||
},
|
||||
"body": "Bitte geben Sie Ihre persönlichen Daten ein, um ein Konto zu erstellen.",
|
||||
"form": {
|
||||
"confirm-password": {
|
||||
"label": "Passwort bestätigen"
|
||||
},
|
||||
"email": {
|
||||
"label": "E-Mail Adresse"
|
||||
},
|
||||
"name": {
|
||||
"label": "Voller Name"
|
||||
},
|
||||
"password": {
|
||||
"label": "Passwort"
|
||||
},
|
||||
"username": {
|
||||
"label": "Benutzername"
|
||||
}
|
||||
},
|
||||
"heading": "Ein Konto erstellen",
|
||||
"loginText": "Wenn Sie bereits ein Konto haben, können Sie sich hier <1>anmelden</1>."
|
||||
},
|
||||
"reset-password": {
|
||||
"actions": {
|
||||
"set-password": "Neues Passwort setzen"
|
||||
},
|
||||
"body": "Geben Sie ein neues Passwort für Ihr Konto ein.",
|
||||
"form": {
|
||||
"confirm-password": {
|
||||
"label": "Passwort bestätigen"
|
||||
},
|
||||
"password": {
|
||||
"label": "Passwort"
|
||||
}
|
||||
},
|
||||
"heading": "Passwort zurücksetzen"
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"create-resume": {
|
||||
"actions": {
|
||||
"create-resume": "Lebenslauf erstellen"
|
||||
},
|
||||
"body": "Erstelle deinen Lebenslauf, indem du ihm einen Namen gibst. Er könnte sich auf die Rolle beziehen, die Sie beantragen, oder nur auf Ihren Lieblings-Snack.",
|
||||
"form": {
|
||||
"name": {
|
||||
"label": "Name"
|
||||
},
|
||||
"public": {
|
||||
"label": "Ist öffentlich zugänglich?"
|
||||
},
|
||||
"slug": {
|
||||
"label": "Slug"
|
||||
}
|
||||
},
|
||||
"heading": "Neuen Lebenslauf erstellen"
|
||||
},
|
||||
"import-external": {
|
||||
"heading": "Aus externen Quellen importieren",
|
||||
"json-resume": {
|
||||
"actions": {
|
||||
"upload-json": "JSON hochladen"
|
||||
},
|
||||
"body": "Wenn du einen <1>validierten JSON Resume</1> bereit hast, kannst du damit deine Entwicklung auf reaktiven Resume beschleunigen. Klicken Sie auf den Button unten und laden Sie eine gültige JSON-Datei hoch, um zu beginnen.",
|
||||
"heading": "Import vom JSON-Lebenslauf"
|
||||
},
|
||||
"linkedin": {
|
||||
"actions": {
|
||||
"upload-archive": "ZIP-Archiv hochladen"
|
||||
},
|
||||
"body": "Sie können Zeit sparen, indem Sie Ihre Daten aus LinkedIn exportieren und sie zum automatischen Ausfüllen von Feldern auf Reaktives Lebenslauf verwenden. Gehen Sie zum Abschnitt <1>Datenschutz </1> auf LinkedIn und fordern Sie ein Archiv Ihrer Daten an. Sobald diese verfügbar sind, laden Sie die ZIP-Datei unten hoch.",
|
||||
"heading": "Aus LinkedIn importieren"
|
||||
},
|
||||
"reactive-resume": {
|
||||
"actions": {
|
||||
"upload-json": "JSON hochladen"
|
||||
},
|
||||
"body": "Wenn Sie ein JSON haben, das mit der aktuellen Version von Reactive Resume exportiert wurde, Sie können es hier wieder importieren um wieder eine editierbare Version zu erhalten. Vorherige Versionen von Reactive Resume werden derzeit leider nicht unterstützt.",
|
||||
"heading": "Import vom Reaktives Lebenslauf"
|
||||
}
|
||||
},
|
||||
"rename-resume": {
|
||||
"actions": {
|
||||
"rename-resume": "Lebenslauf umbenennen"
|
||||
},
|
||||
"form": {
|
||||
"name": {
|
||||
"label": "Name"
|
||||
},
|
||||
"slug": {
|
||||
"label": "Slug"
|
||||
}
|
||||
},
|
||||
"heading": "Lebenslauf umbenennen"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -61,9 +61,15 @@
|
||||
"page": "Page"
|
||||
},
|
||||
"list": {
|
||||
"actions": {
|
||||
"delete": "Delete",
|
||||
"duplicate": "Duplicate",
|
||||
"edit": "Edit"
|
||||
},
|
||||
"empty-text": "This list is empty."
|
||||
},
|
||||
"tooltip": {
|
||||
"delete-item": "Are you sure you want to delete this item? This is an irreversible action.",
|
||||
"delete-section": "Delete Section",
|
||||
"rename-section": "Rename Section",
|
||||
"toggle-visibility": "Toggle Visibility"
|
||||
@ -284,6 +290,7 @@
|
||||
},
|
||||
"heading": "Page",
|
||||
"orientation": {
|
||||
"disabled": "Has no effect when there is only one page",
|
||||
"primary": "Orientation",
|
||||
"secondary": "Whether to display pages horizontally or vertically"
|
||||
}
|
||||
|
||||
@ -5,14 +5,19 @@
|
||||
"logout": "Logout"
|
||||
}
|
||||
},
|
||||
"description": "Reactive Resume is a free and open source resume builder that's built to make the mundane tasks of creating, updating and sharing your resume as easy as 1, 2, 3.",
|
||||
"footer": {
|
||||
"credit": "A passion project by <1>Amruth Pillai</1>",
|
||||
"language": {
|
||||
"missing": "Missing your language?"
|
||||
},
|
||||
"license": "By the community, for the community."
|
||||
},
|
||||
"markdown": {
|
||||
"help-text": "This section supports <1>markdown</1> formatting."
|
||||
},
|
||||
"date": {
|
||||
"present": "Present"
|
||||
},
|
||||
"subtitle": "A free and open source resume builder.",
|
||||
"title": "Reactive Resume",
|
||||
"toast": {
|
||||
|
||||
@ -32,7 +32,7 @@
|
||||
"testimonials": {
|
||||
"heading": "Testimonials",
|
||||
"body": "Good or bad, I would love to hear your opinion on Reactive Resume and how the experience has been for you.<br/>Here are some of the messages sent in by users across the world.",
|
||||
"contact": "You can reach out to me through <1>my email</1> or through the contact form on <2>my website</2>."
|
||||
"contact": "You can reach out to me through <1>my email</1> or through the contact form on <3>my website</3>."
|
||||
},
|
||||
"summary": {
|
||||
"body": "Reactive Resume is a free and open source resume builder that's built to make the mundane tasks of creating, updating and sharing your resume as easy as 1, 2, 3. With this app, you can create multiple resumes, share them with recruiters or friends through a unique link and print it as a PDF, all for free, no ads, no tracking, without losing the integrity and privacy of your data.",
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
"login": {
|
||||
"actions": {
|
||||
"login": "Login",
|
||||
"login-google": "Login with Google"
|
||||
"google": "Login with Google"
|
||||
},
|
||||
"body": "Please enter your username and password associated with your account to login and access, manage and share your resumes.",
|
||||
"form": {
|
||||
@ -34,7 +34,8 @@
|
||||
},
|
||||
"register": {
|
||||
"actions": {
|
||||
"register": "Register"
|
||||
"register": "Register",
|
||||
"google": "Register with Google"
|
||||
},
|
||||
"body": "Please enter your personal information to create an account.",
|
||||
"form": {
|
||||
@ -105,14 +106,14 @@
|
||||
"actions": {
|
||||
"upload-archive": "Upload ZIP Archive"
|
||||
},
|
||||
"body": "You can save time by exporting your data from LinkedIn and using it to auto-fill fields on Reactive Resume. Head on over to the <1>Data Privacy</1> section on LinkedIn and request an archive of your data. Once it is available, upload the ZIP archive below.",
|
||||
"body": "You can save time by exporting your data from LinkedIn and using it to auto-fill fields on Reactive Resume. Head over to the <1>Data Privacy</1> section on LinkedIn and request an archive of your data. Once it is available, upload the ZIP file below.",
|
||||
"heading": "Import From LinkedIn"
|
||||
},
|
||||
"reactive-resume": {
|
||||
"actions": {
|
||||
"upload-json": "Upload JSON"
|
||||
},
|
||||
"body": "If you have a JSON that was exported with the current version of Reactive Resume, you can import it back here to get an editable version again.",
|
||||
"body": "If you have a JSON that was exported with the current version of Reactive Resume, you can import it back here to get an editable version again. Previous versions of Reactive Resume are unfortunately not supported at the moment.",
|
||||
"heading": "Import From Reactive Resume"
|
||||
}
|
||||
},
|
||||
|
||||
358
client/public/locales/es/builder.json
Normal file
358
client/public/locales/es/builder.json
Normal file
@ -0,0 +1,358 @@
|
||||
{
|
||||
"common": {
|
||||
"actions": {
|
||||
"add": "Agregar nuevo {{token}}",
|
||||
"delete": "Eliminar {{token}}",
|
||||
"edit": "Editar {{token}}"
|
||||
},
|
||||
"columns": {
|
||||
"heading": "Columnas",
|
||||
"tooltip": "Cambiar número de columnas"
|
||||
},
|
||||
"form": {
|
||||
"date": {
|
||||
"label": "Fecha"
|
||||
},
|
||||
"description": {
|
||||
"label": "Descripción"
|
||||
},
|
||||
"email": {
|
||||
"label": "Correo electrónico"
|
||||
},
|
||||
"end-date": {
|
||||
"help-text": "Deje este campo en blanco, si todavía está presente",
|
||||
"label": "Fecha de finalización"
|
||||
},
|
||||
"keywords": {
|
||||
"label": "Palabras claves"
|
||||
},
|
||||
"level": {
|
||||
"label": "Nivel"
|
||||
},
|
||||
"levelNum": {
|
||||
"label": "Nivel (Número)"
|
||||
},
|
||||
"name": {
|
||||
"label": "Nombre"
|
||||
},
|
||||
"phone": {
|
||||
"label": "Número de teléfono"
|
||||
},
|
||||
"position": {
|
||||
"label": "Puesto de trabajo"
|
||||
},
|
||||
"start-date": {
|
||||
"label": "Fecha de inicio"
|
||||
},
|
||||
"subtitle": {
|
||||
"label": "Subtítulo"
|
||||
},
|
||||
"summary": {
|
||||
"label": "Resumen"
|
||||
},
|
||||
"title": {
|
||||
"label": "Título"
|
||||
},
|
||||
"url": {
|
||||
"label": "Sitio Web"
|
||||
}
|
||||
},
|
||||
"glossary": {
|
||||
"page": "Página"
|
||||
},
|
||||
"list": {
|
||||
"actions": {
|
||||
"delete": "Eliminar",
|
||||
"duplicate": "Duplicar",
|
||||
"edit": "Editar"
|
||||
},
|
||||
"empty-text": "Esta lista esta vacia."
|
||||
},
|
||||
"tooltip": {
|
||||
"delete-item": "¿Estás seguro de que deseas eliminar este elemento? Esta acción es irreversible.",
|
||||
"delete-section": "Eliminar sección",
|
||||
"rename-section": "Renombrar sección",
|
||||
"toggle-visibility": "Cambiar Visibilidad"
|
||||
}
|
||||
},
|
||||
"controller": {
|
||||
"tooltip": {
|
||||
"center-artboard": "Centrar Tablero",
|
||||
"copy-link": "Copiar enlace al currículum",
|
||||
"export-pdf": "Exportar PDF",
|
||||
"toggle-orientation": "Cambiar la orientación de la página",
|
||||
"toggle-page-break-line": "Alternar línea de salto de página",
|
||||
"toggle-sidebars": "Ocultar/mostrar barra lateral",
|
||||
"zoom-in": "Acercar",
|
||||
"zoom-out": "Alejar"
|
||||
}
|
||||
},
|
||||
"header": {
|
||||
"menu": {
|
||||
"delete": "Eliminar",
|
||||
"duplicate": "Duplicar",
|
||||
"rename": "Renombrar",
|
||||
"share-link": "Compartir enlace",
|
||||
"tooltips": {
|
||||
"delete": "¿Estás seguro de que deseas eliminar este elemento? Esta acción es irreversible.",
|
||||
"share-link": "Debe cambiar la visibilidad de su currículum a público para que sea visible para los demás."
|
||||
}
|
||||
}
|
||||
},
|
||||
"leftSidebar": {
|
||||
"sections": {
|
||||
"awards": {
|
||||
"form": {
|
||||
"awarder": {
|
||||
"label": "Otorgado por"
|
||||
}
|
||||
}
|
||||
},
|
||||
"basics": {
|
||||
"actions": {
|
||||
"photo-filters": "Filtro de fotos"
|
||||
},
|
||||
"heading": "Información básica",
|
||||
"headline": {
|
||||
"label": "Titular"
|
||||
},
|
||||
"name": {
|
||||
"label": "Nombre Completo"
|
||||
},
|
||||
"photo-filters": {
|
||||
"effects": {
|
||||
"border": {
|
||||
"label": "Borde"
|
||||
},
|
||||
"grayscale": {
|
||||
"label": "Escala de grises"
|
||||
},
|
||||
"heading": "Efectos"
|
||||
},
|
||||
"shape": {
|
||||
"heading": "Forma"
|
||||
},
|
||||
"size": {
|
||||
"heading": "Tamaño (en píxeles)"
|
||||
}
|
||||
},
|
||||
"photo-upload": {
|
||||
"tooltip": {
|
||||
"remove": "Eliminar foto",
|
||||
"upload": "Subir foto"
|
||||
}
|
||||
}
|
||||
},
|
||||
"certifications": {
|
||||
"form": {
|
||||
"issuer": {
|
||||
"label": "Emisor"
|
||||
}
|
||||
}
|
||||
},
|
||||
"education": {
|
||||
"form": {
|
||||
"area-study": {
|
||||
"label": "Área de estudio"
|
||||
},
|
||||
"courses": {
|
||||
"label": "Cursos"
|
||||
},
|
||||
"degree": {
|
||||
"label": "Grado"
|
||||
},
|
||||
"grade": {
|
||||
"label": "Calificación"
|
||||
},
|
||||
"institution": {
|
||||
"label": "Institución"
|
||||
}
|
||||
}
|
||||
},
|
||||
"location": {
|
||||
"address": {
|
||||
"label": "Dirección"
|
||||
},
|
||||
"city": {
|
||||
"label": "Ciudad"
|
||||
},
|
||||
"country": {
|
||||
"label": "País"
|
||||
},
|
||||
"heading": "Ubicación",
|
||||
"postal-code": {
|
||||
"label": "Código Postal"
|
||||
},
|
||||
"region": {
|
||||
"label": "Area"
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"form": {
|
||||
"network": {
|
||||
"label": "Red"
|
||||
},
|
||||
"username": {
|
||||
"label": "Nombre de usario"
|
||||
}
|
||||
},
|
||||
"heading": "Perfiles",
|
||||
"heading_one": "Perfil"
|
||||
},
|
||||
"publications": {
|
||||
"form": {
|
||||
"publisher": {
|
||||
"label": "Editor"
|
||||
}
|
||||
}
|
||||
},
|
||||
"references": {
|
||||
"form": {
|
||||
"relationship": {
|
||||
"label": "Relación"
|
||||
}
|
||||
}
|
||||
},
|
||||
"section": {
|
||||
"heading": "Sección"
|
||||
},
|
||||
"volunteer": {
|
||||
"form": {
|
||||
"organization": {
|
||||
"label": "Organización"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"rightSidebar": {
|
||||
"sections": {
|
||||
"css": {
|
||||
"heading": "CSS personalizado"
|
||||
},
|
||||
"export": {
|
||||
"heading": "Exportar",
|
||||
"json": {
|
||||
"primary": "JSON",
|
||||
"secondary": "Descargar una versión JSON de su currículum que se puede volver a importar a Reactive Resume."
|
||||
},
|
||||
"pdf": {
|
||||
"loading": {
|
||||
"primary": "Generando PDF",
|
||||
"secondary": "Por favor, espere mientras se genera su PDF, esto puede tardar hasta 15 segundos."
|
||||
},
|
||||
"normal": {
|
||||
"primary": "PDF",
|
||||
"secondary": "Descargar un PDF de su currículum que puede imprimir y enviar al trabajo de sus sueños. Este archivo no se puede volver a importar para su posterior edición."
|
||||
}
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
"heading": "Diseño",
|
||||
"tooltip": {
|
||||
"reset-layout": "Restablecer Diseño"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"bugs-features": {
|
||||
"body": "¿Algo que te impide hacer un currículum? ¿O tienes una idea increíble para agregar? Plantea una Propuesta en GitHub para comenzar.",
|
||||
"button": "Propuesta de GitHub",
|
||||
"heading": "¿Errores? ¿Solicitud de características?"
|
||||
},
|
||||
"donate": {
|
||||
"body": "Si le gustó usar Reactive Resume, considere donar lo que pueda a la causa de mantener la aplicación en funcionamiento, sin anuncios y gratis para siempre.",
|
||||
"button": "Invítame a un café",
|
||||
"heading": "Donar a Reactive Resume"
|
||||
},
|
||||
"github": "Código Fuente",
|
||||
"heading": "Enlaces"
|
||||
},
|
||||
"settings": {
|
||||
"global": {
|
||||
"date": {
|
||||
"primary": "Fecha",
|
||||
"secondary": "Formato de fecha para usar en toda la aplicación"
|
||||
},
|
||||
"heading": "Global",
|
||||
"language": {
|
||||
"primary": "Idioma",
|
||||
"secondary": "Idioma que se utilizará en toda la aplicación"
|
||||
},
|
||||
"theme": {
|
||||
"primary": "Tema"
|
||||
}
|
||||
},
|
||||
"heading": "Preferencias",
|
||||
"page": {
|
||||
"break-line": {
|
||||
"primary": "Linea de separación",
|
||||
"secondary": "Mostrar una línea en todas las páginas para marcar la altura de una página A4"
|
||||
},
|
||||
"heading": "Página",
|
||||
"orientation": {
|
||||
"disabled": "No tiene efecto cuando solo hay una página",
|
||||
"primary": "Orientación",
|
||||
"secondary": "Visualización horizontal o vertical de las páginas"
|
||||
}
|
||||
},
|
||||
"resume": {
|
||||
"heading": "Currículum",
|
||||
"reset": {
|
||||
"primary": "Restablecer Todo",
|
||||
"secondary": "¿Has cometido demasiados errores? Haz clic aquí para restablecer todos los cambios y empezar de cero. Ten cuidado, esta acción no se puede revertir."
|
||||
},
|
||||
"sample": {
|
||||
"primary": "Cargar datos de muestra",
|
||||
"secondary": "¿No sabe por dónde empezar? Haz clic aquí para cargar algunos datos de muestra y ver cómo es un currículum completo."
|
||||
}
|
||||
}
|
||||
},
|
||||
"sharing": {
|
||||
"heading": "Compartir",
|
||||
"short-url": {
|
||||
"label": "Preferir URL corta"
|
||||
},
|
||||
"visibility": {
|
||||
"subtitle": "Permitir que cualquier persona con un enlace vea su currículum",
|
||||
"title": "Público"
|
||||
}
|
||||
},
|
||||
"templates": {
|
||||
"heading": "Plantillas"
|
||||
},
|
||||
"theme": {
|
||||
"form": {
|
||||
"background": {
|
||||
"label": "Fondo"
|
||||
},
|
||||
"primary": {
|
||||
"label": "Principal"
|
||||
},
|
||||
"text": {
|
||||
"label": "Texto"
|
||||
}
|
||||
},
|
||||
"heading": "Tema"
|
||||
},
|
||||
"typography": {
|
||||
"form": {
|
||||
"font-family": {
|
||||
"label": "Familia tipográfica"
|
||||
},
|
||||
"font-size": {
|
||||
"label": "Tamaño de fuente"
|
||||
}
|
||||
},
|
||||
"heading": "Tipografía",
|
||||
"widgets": {
|
||||
"body": {
|
||||
"label": "Cuerpo"
|
||||
},
|
||||
"headings": {
|
||||
"label": "Encabezados"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
32
client/public/locales/es/common.json
Normal file
32
client/public/locales/es/common.json
Normal file
@ -0,0 +1,32 @@
|
||||
{
|
||||
"avatar": {
|
||||
"menu": {
|
||||
"greeting": "Hola",
|
||||
"logout": "Cerrar sesión"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"credit": "Un proyecto apasionante de <1>Amruth Pillai</1>",
|
||||
"language": {
|
||||
"missing": "Idioma ausente?"
|
||||
},
|
||||
"license": "Por la comunidad, para la comunidad."
|
||||
},
|
||||
"markdown": {
|
||||
"help-text": "Esta sección soporta el formato <1>markdown</1>."
|
||||
},
|
||||
"date": {
|
||||
"present": "Regalo"
|
||||
},
|
||||
"subtitle": "Un generador de currículum gratuito y de código abierto.",
|
||||
"title": "Reactive Resume",
|
||||
"toast": {
|
||||
"error": {
|
||||
"upload-file-size": "Por favor, suba sólo archivos de menos de 2 megabytes.",
|
||||
"upload-photo-size": "Por favor, suba sólo fotos de menos de 2 megabytes, preferiblemente cuadradas."
|
||||
},
|
||||
"success": {
|
||||
"resume-link-copied": "Se ha copiado un enlace a su currículum en su portapapeles."
|
||||
}
|
||||
}
|
||||
}
|
||||
25
client/public/locales/es/dashboard.json
Normal file
25
client/public/locales/es/dashboard.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"create-resume": {
|
||||
"subtitle": "Empezar desde cero",
|
||||
"title": "Crear currículum"
|
||||
},
|
||||
"import-external": {
|
||||
"subtitle": "LinkedIn, JSON Resume, Reactive Resume",
|
||||
"title": "Importar desde fuentes externas"
|
||||
},
|
||||
"resume": {
|
||||
"menu": {
|
||||
"delete": "Eliminar",
|
||||
"duplicate": "Duplicar",
|
||||
"open": "Abrir",
|
||||
"rename": "Renombrar",
|
||||
"share-link": "Compartir enlace",
|
||||
"tooltips": {
|
||||
"delete": "¿Estás seguro de que deseas eliminar este elemento? Esta acción es irreversible.",
|
||||
"share-link": "Debe cambiar la visibilidad de su currículum a público para que sea visible para los demás."
|
||||
}
|
||||
},
|
||||
"timestamp": "Última actualización {{timestamp}}"
|
||||
},
|
||||
"title": "Panel de Control"
|
||||
}
|
||||
41
client/public/locales/es/landing.json
Normal file
41
client/public/locales/es/landing.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"actions": {
|
||||
"app": "Ir a la aplicación",
|
||||
"login": "Iniciar sesión",
|
||||
"logout": "Cerrar sesión",
|
||||
"register": "Registrar"
|
||||
},
|
||||
"features": {
|
||||
"heading": "Características",
|
||||
"list": {
|
||||
"ads": "Sin publicidad",
|
||||
"export": "Exporta tu currículum a formato JSON o PDF",
|
||||
"free": "Gratis para siempre",
|
||||
"import": "Importar datos de LinkedIn, JSON Resume",
|
||||
"languages": "Accesible en varios idiomas",
|
||||
"more": "Y funciones mucho más emocionantes, <1>lea todo sobre esto aquí</1>",
|
||||
"tracking": "Sin seguimiento de usuario"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"heading": "Enlaces",
|
||||
"links": {
|
||||
"donate": "Donar",
|
||||
"github": "Código Fuente",
|
||||
"privacy": "Política de Privacidad",
|
||||
"service": "Términos de Servicio"
|
||||
}
|
||||
},
|
||||
"screenshots": {
|
||||
"heading": "Capturas de pantalla"
|
||||
},
|
||||
"testimonials": {
|
||||
"heading": "Opiniones",
|
||||
"body": "Bueno o malo, me encantaría saber tu opinión sobre Reactive Resume y cómo ha sido la experiencia para ti.<br/>Estos son algunos de los mensajes enviados por usuarios de todo el mundo.",
|
||||
"contact": "Puedes comunicarte conmigo a través de <1>mi correo electrónico</1> o a través del formulario de contacto en <3>mi sitio web</3>."
|
||||
},
|
||||
"summary": {
|
||||
"body": "Reactive Resume es un generador de currículums gratuito y de código abierto que está diseñado para hacer que las tareas mundanas de crear, actualizar y compartir su currículum sean tan fáciles como 1, 2, 3. Con esta aplicación, puede crear múltiples currículums, compartirlos con reclutadores o amigos a través de un enlace único e imprímalo como PDF, todo gratis, sin anuncios, sin seguimiento, sin perder la integridad y privacidad de sus datos.",
|
||||
"heading": "Resumen"
|
||||
}
|
||||
}
|
||||
135
client/public/locales/es/modals.json
Normal file
135
client/public/locales/es/modals.json
Normal file
@ -0,0 +1,135 @@
|
||||
{
|
||||
"auth": {
|
||||
"forgot-password": {
|
||||
"actions": {
|
||||
"send-email": "Enviar correo electrónico para restablecer la contraseña"
|
||||
},
|
||||
"body": "Simplemente ingrese la dirección de correo electrónico asociada con la cuenta que desea recuperar.",
|
||||
"form": {
|
||||
"email": {
|
||||
"label": "Correo electrónico"
|
||||
}
|
||||
},
|
||||
"heading": "¿Olvidó su contraseña?",
|
||||
"help-text": "Si la cuenta existe, recibirá un correo electrónico con un enlace para restablecer su contraseña."
|
||||
},
|
||||
"login": {
|
||||
"actions": {
|
||||
"login": "Iniciar sesión",
|
||||
"google": "Iniciar sesión con Google"
|
||||
},
|
||||
"body": "Por favor, introduzca su nombre de usuario y contraseña asociados a su cuenta para iniciar sesión y acceder, gestionar y compartir sus currículos.",
|
||||
"form": {
|
||||
"password": {
|
||||
"label": "Contraseña"
|
||||
},
|
||||
"username": {
|
||||
"help-text": "También puede ingresar su dirección de correo electrónico",
|
||||
"label": "Nombre de usario"
|
||||
}
|
||||
},
|
||||
"heading": "Ingrese en su cuenta",
|
||||
"recover-text": "En caso de que hayas olvidado tu contraseña, puedes <1>recuperar tu cuenta</1> aquí.",
|
||||
"register-text": "Si no tiene una, puede <1>crear una cuenta</1> aquí."
|
||||
},
|
||||
"register": {
|
||||
"actions": {
|
||||
"register": "Registrar",
|
||||
"google": "Regístrese con Google"
|
||||
},
|
||||
"body": "Por favor ingrese su información personal para crear una cuenta.",
|
||||
"form": {
|
||||
"confirm-password": {
|
||||
"label": "Confirmar Contraseña"
|
||||
},
|
||||
"email": {
|
||||
"label": "Correo electrónico"
|
||||
},
|
||||
"name": {
|
||||
"label": "Nombre Completo"
|
||||
},
|
||||
"password": {
|
||||
"label": "Contraseña"
|
||||
},
|
||||
"username": {
|
||||
"label": "Nombre de usario"
|
||||
}
|
||||
},
|
||||
"heading": "Crear una cuenta",
|
||||
"loginText": "Si ya tiene una cuenta, puede <1>iniciar sesión aquí</1>."
|
||||
},
|
||||
"reset-password": {
|
||||
"actions": {
|
||||
"set-password": "Establecer una nueva contraseña"
|
||||
},
|
||||
"body": "Introduzca una nueva contraseña para su cuenta.",
|
||||
"form": {
|
||||
"confirm-password": {
|
||||
"label": "Confirmar Contraseña"
|
||||
},
|
||||
"password": {
|
||||
"label": "Contraseña"
|
||||
}
|
||||
},
|
||||
"heading": "Restablecer tu contraseña"
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"create-resume": {
|
||||
"actions": {
|
||||
"create-resume": "Crear currículum"
|
||||
},
|
||||
"body": "Comience a construir su currículum dándole un nombre. Podría ser en referencia al puesto que está solicitando, o simplemente a su refrigerio favorito.",
|
||||
"form": {
|
||||
"name": {
|
||||
"label": "Nombre"
|
||||
},
|
||||
"public": {
|
||||
"label": "¿Es de acceso público?"
|
||||
},
|
||||
"slug": {
|
||||
"label": "Segmento"
|
||||
}
|
||||
},
|
||||
"heading": "Crear un nuevo currículum"
|
||||
},
|
||||
"import-external": {
|
||||
"heading": "Importar desde fuentes externas",
|
||||
"json-resume": {
|
||||
"actions": {
|
||||
"upload-json": "Subir JSON"
|
||||
},
|
||||
"body": "Si tiene un <1>JSON Resume validado</1> listo para usar, puede usarlo para acelerar su desarrollo en Reactive Resume. Haga clic en el botón a continuación y cargue un archivo JSON válido para comenzar.",
|
||||
"heading": "Importar desde JSON Resume"
|
||||
},
|
||||
"linkedin": {
|
||||
"actions": {
|
||||
"upload-archive": "Subir archivo ZIP"
|
||||
},
|
||||
"body": "Puede ahorrar tiempo exportando sus datos de LinkedIn y usándolos para autocompletar campos en Reactive Resume. Dirígete a <1>Privacidad de datos</1> en LinkedIn y solicita un archivo de tus datos. Una vez que esté disponible, cargue el archivo ZIP a continuación.",
|
||||
"heading": "Importar desde LinkedIn"
|
||||
},
|
||||
"reactive-resume": {
|
||||
"actions": {
|
||||
"upload-json": "Subir JSON"
|
||||
},
|
||||
"body": "Si tiene un JSON que se exportó con la versión actual de Reactive Resume, puede volver a importarlo aquí para obtener una versión editable nuevamente. Desafortunadamente, las versiones anteriores de Reactive Resume no son compatibles en este momento.",
|
||||
"heading": "Importar desde Reactive Resume"
|
||||
}
|
||||
},
|
||||
"rename-resume": {
|
||||
"actions": {
|
||||
"rename-resume": "Renombrar currículum"
|
||||
},
|
||||
"form": {
|
||||
"name": {
|
||||
"label": "Nombre"
|
||||
},
|
||||
"slug": {
|
||||
"label": "Segmento"
|
||||
}
|
||||
},
|
||||
"heading": "Renombrar tu currículum"
|
||||
}
|
||||
}
|
||||
}
|
||||
358
client/public/locales/hi/builder.json
Normal file
358
client/public/locales/hi/builder.json
Normal file
@ -0,0 +1,358 @@
|
||||
{
|
||||
"common": {
|
||||
"actions": {
|
||||
"add": "नया जोड़ें {{token}}",
|
||||
"delete": "हटाएं {{token}}",
|
||||
"edit": "संपादित करें {{token}}"
|
||||
},
|
||||
"columns": {
|
||||
"heading": "कॉलम",
|
||||
"tooltip": "स्तंभों की संख्या बदलें"
|
||||
},
|
||||
"form": {
|
||||
"date": {
|
||||
"label": "तारीख"
|
||||
},
|
||||
"description": {
|
||||
"label": "विवरण"
|
||||
},
|
||||
"email": {
|
||||
"label": "ईमेल पता"
|
||||
},
|
||||
"end-date": {
|
||||
"help-text": "इस फ़ील्ड को खाली छोड़ दें, यदि अभी भी मौजूद है",
|
||||
"label": "अंतिम तिथि"
|
||||
},
|
||||
"keywords": {
|
||||
"label": "कीवर्ड"
|
||||
},
|
||||
"level": {
|
||||
"label": "स्तर"
|
||||
},
|
||||
"levelNum": {
|
||||
"label": "स्तर (संख्या)"
|
||||
},
|
||||
"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": "पीडीएफ निर्यात करें",
|
||||
"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": "कस्टम सीएसएस"
|
||||
},
|
||||
"export": {
|
||||
"heading": "निर्यात",
|
||||
"json": {
|
||||
"primary": "JSON",
|
||||
"secondary": "अपने रेज़्यूमे का JSON संस्करण डाउनलोड करें जिसे रिएक्टिव रेज़्यूमे में वापस आयात किया जा सकता है।"
|
||||
},
|
||||
"pdf": {
|
||||
"loading": {
|
||||
"primary": "पीडीएफ उत्पन्न करना",
|
||||
"secondary": "कृपया प्रतीक्षा करें क्योंकि आपका PDF जनरेट हो गया है, इसमें 15 सेकंड तक लग सकते हैं।"
|
||||
},
|
||||
"normal": {
|
||||
"primary": "पीडीएफ",
|
||||
"secondary": "अपने रिज्यूमे का एक पीडीएफ डाउनलोड करें जिसे आप प्रिंट कर सकते हैं और अपने सपनों की नौकरी के लिए भेज सकते हैं। आगे के संपादन के लिए इस फ़ाइल को वापस आयात नहीं किया जा सकता है।"
|
||||
}
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
"heading": "ख़ाका",
|
||||
"tooltip": {
|
||||
"reset-layout": "लेआउट रीसेट करें"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"bugs-features": {
|
||||
"body": "कुछ आपको रिज्यूमे बनाने से रोक रहा है? या क्या आपके पास जोड़ने के लिए एक अद्भुत विचार है? आरंभ करने के लिए गिटहब पर एक मुद्दा उठाएं।",
|
||||
"button": "गिटहब मुद्दे",
|
||||
"heading": "कीड़े? सुविधा का अनुरोध?"
|
||||
},
|
||||
"donate": {
|
||||
"body": "यदि आप रिएक्टिव रिज्यूमे का उपयोग करना पसंद करते हैं, तो कृपया ऐप को चालू रखने और विज्ञापनों के बिना और हमेशा के लिए मुक्त रखने के लिए जितना हो सके दान करने पर विचार करें।",
|
||||
"button": "मेरे लिए एक कॉफी खरीदें",
|
||||
"heading": "प्रतिक्रियाशील फिर से शुरू करने के लिए दान करें"
|
||||
},
|
||||
"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": "शीर्षकों"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
32
client/public/locales/hi/common.json
Normal file
32
client/public/locales/hi/common.json
Normal file
@ -0,0 +1,32 @@
|
||||
{
|
||||
"avatar": {
|
||||
"menu": {
|
||||
"greeting": "नमस्ते",
|
||||
"logout": "लॉग आउट"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"credit": "<1>अमृत पिल्लै</1> . का एक जुनूनी प्रोजेक्ट",
|
||||
"language": {
|
||||
"missing": "आपकी भाषा याद आ रही है?"
|
||||
},
|
||||
"license": "समाज के लिए, समाज के लिए।"
|
||||
},
|
||||
"markdown": {
|
||||
"help-text": "यह अनुभाग <1>मार्कडाउन</1> स्वरूपण का समर्थन करता है।"
|
||||
},
|
||||
"date": {
|
||||
"present": "वर्तमान"
|
||||
},
|
||||
"subtitle": "एक फ्री और ओपन सोर्स रिज्यूम बिल्डर।",
|
||||
"title": "रिएक्टिव रिज्यूमे",
|
||||
"toast": {
|
||||
"error": {
|
||||
"upload-file-size": "कृपया केवल 2 मेगाबाइट से कम की फ़ाइलें अपलोड करें।",
|
||||
"upload-photo-size": "कृपया केवल 2 मेगाबाइट से कम के फ़ोटो अपलोड करें, अधिमानतः वर्गाकार।"
|
||||
},
|
||||
"success": {
|
||||
"resume-link-copied": "आपके रिज्यूमे का लिंक आपके क्लिपबोर्ड पर कॉपी कर दिया गया है।"
|
||||
}
|
||||
}
|
||||
}
|
||||
25
client/public/locales/hi/dashboard.json
Normal file
25
client/public/locales/hi/dashboard.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"create-resume": {
|
||||
"subtitle": "शून्य से शुरू करें",
|
||||
"title": "नया रिज्यूमे बनाएं"
|
||||
},
|
||||
"import-external": {
|
||||
"subtitle": "लिंक्डइन, JSON रिज्यूमे, रिएक्टिव रिज्यूमे",
|
||||
"title": "बाहरी स्रोतों से आयात"
|
||||
},
|
||||
"resume": {
|
||||
"menu": {
|
||||
"delete": "हटाएं",
|
||||
"duplicate": "डुप्लिकेट",
|
||||
"open": "खुला हुआ",
|
||||
"rename": "नाम बदलें",
|
||||
"share-link": "लिंक शेयर करें",
|
||||
"tooltips": {
|
||||
"delete": "क्या आप वाकई इस रेज़्यूमे को हटाना चाहते हैं? यह एक अपरिवर्तनीय क्रिया है।",
|
||||
"share-link": "आपको अपने रेज़्यूमे की दृश्यता को सार्वजनिक करने की आवश्यकता है ताकि इसे दूसरों को दिखाई दे।"
|
||||
}
|
||||
},
|
||||
"timestamp": "पिछली बार अपडेट किया गया {{timestamp}} पहले"
|
||||
},
|
||||
"title": "डैशबोर्ड"
|
||||
}
|
||||
41
client/public/locales/hi/landing.json
Normal file
41
client/public/locales/hi/landing.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"actions": {
|
||||
"app": "ऐप्स पर जाएं",
|
||||
"login": "लॉग इन करें",
|
||||
"logout": "लॉग आउट",
|
||||
"register": "रजिस्टर करें"
|
||||
},
|
||||
"features": {
|
||||
"heading": "विशेषताएं",
|
||||
"list": {
|
||||
"ads": "कोई विज्ञापन नहीं",
|
||||
"export": "अपने रिज्यूमे को JSON या PDF फॉर्मेट में एक्सपोर्ट करें",
|
||||
"free": "हमेशा के लिए आज़ाद",
|
||||
"import": "लिंक्डइन, 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": "रिएक्टिव रिज्यूमे एक फ्री और ओपन सोर्स रिज्यूमे बिल्डर है जो आपके रिज्यूमे को बनाने, अपडेट करने और साझा करने के सांसारिक कार्यों को 1, 2, 3 जितना आसान बनाने के लिए बनाया गया है। इस ऐप के साथ, आप कई रिज्यूमे बना सकते हैं, उन्हें रिक्रूटर्स या दोस्तों के साथ साझा कर सकते हैं। एक अद्वितीय लिंक के माध्यम से और अपने डेटा की अखंडता और गोपनीयता को खोए बिना इसे एक पीडीएफ के रूप में प्रिंट करें, सब कुछ मुफ्त में, कोई विज्ञापन नहीं, कोई ट्रैकिंग नहीं।",
|
||||
"heading": "सारांश"
|
||||
}
|
||||
}
|
||||
135
client/public/locales/hi/modals.json
Normal file
135
client/public/locales/hi/modals.json
Normal file
@ -0,0 +1,135 @@
|
||||
{
|
||||
"auth": {
|
||||
"forgot-password": {
|
||||
"actions": {
|
||||
"send-email": "रीसेट पासवर्ड ईमेल भेजें"
|
||||
},
|
||||
"body": "बस उस खाते से संबद्ध ईमेल पता दर्ज करें जिसे आप पुनर्प्राप्त करना चाहते हैं।",
|
||||
"form": {
|
||||
"email": {
|
||||
"label": "ईमेल पता"
|
||||
}
|
||||
},
|
||||
"heading": "अपना कूट शब्द भूल गए?",
|
||||
"help-text": "यदि खाता मौजूद है, तो आपको अपना पासवर्ड रीसेट करने के लिए एक लिंक के साथ एक ईमेल प्राप्त होगा।"
|
||||
},
|
||||
"login": {
|
||||
"actions": {
|
||||
"login": "लॉग इन करें",
|
||||
"google": "Google के साथ लॉगिन करें"
|
||||
},
|
||||
"body": "लॉग इन करने और अपने रिज्यूमे को एक्सेस करने, प्रबंधित करने और साझा करने के लिए कृपया अपने खाते से संबद्ध अपना उपयोगकर्ता नाम और पासवर्ड दर्ज करें।",
|
||||
"form": {
|
||||
"password": {
|
||||
"label": "कुंजिका"
|
||||
},
|
||||
"username": {
|
||||
"help-text": "आप अपना ईमेल पता भी दर्ज कर सकते हैं",
|
||||
"label": "उपयोगकर्ता नाम"
|
||||
}
|
||||
},
|
||||
"heading": "अपने अकाउंट में लॉग इन करें",
|
||||
"recover-text": "यदि आप अपना पासवर्ड भूल गए हैं, तो आप यहां <1>अपना खाता पुनर्प्राप्त</1> कर सकते हैं।",
|
||||
"register-text": "यदि आपके पास खाता नहीं है, तो आप यहां <1>खाता बना</1> सकते हैं।"
|
||||
},
|
||||
"register": {
|
||||
"actions": {
|
||||
"register": "रजिस्टर करें",
|
||||
"google": "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": "यदि आपके पास <1>मान्य JSON रिज्यूमे</1> जाने के लिए तैयार है, तो आप इसका उपयोग रिएक्टिव रिज्यूमे पर अपने विकास को तेजी से ट्रैक करने के लिए कर सकते हैं। शुरू करने के लिए नीचे दिए गए बटन पर क्लिक करें और एक मान्य JSON फ़ाइल अपलोड करें।",
|
||||
"heading": "JSON रिज्यूमे से आयात करें"
|
||||
},
|
||||
"linkedin": {
|
||||
"actions": {
|
||||
"upload-archive": "ज़िप संग्रह अपलोड करें"
|
||||
},
|
||||
"body": "आप अपने डेटा को लिंक्डइन से निर्यात करके और रिएक्टिव रिज्यूमे पर ऑटो-फिल फ़ील्ड में इसका उपयोग करके समय बचा सकते हैं। लिंक्डइन पर <1>डेटा गोपनीयता</1> अनुभाग पर जाएं और अपने डेटा के संग्रह का अनुरोध करें। एक बार यह उपलब्ध हो जाने पर, नीचे ज़िप फ़ाइल अपलोड करें।",
|
||||
"heading": "लिंक्डइन से आयात करें"
|
||||
},
|
||||
"reactive-resume": {
|
||||
"actions": {
|
||||
"upload-json": "JSON अपलोड करें"
|
||||
},
|
||||
"body": "यदि आपके पास एक JSON है जिसे रिएक्टिव रिज्यूमे के वर्तमान संस्करण के साथ निर्यात किया गया था, तो आप इसे फिर से एक संपादन योग्य संस्करण प्राप्त करने के लिए यहां वापस आयात कर सकते हैं। रिएक्टिव रिज्यूमे के पिछले संस्करण दुर्भाग्य से इस समय समर्थित नहीं हैं।",
|
||||
"heading": "रिएक्टिव रिज्यूमे से आयात करें"
|
||||
}
|
||||
},
|
||||
"rename-resume": {
|
||||
"actions": {
|
||||
"rename-resume": "रिज्यूमे का नाम बदलें"
|
||||
},
|
||||
"form": {
|
||||
"name": {
|
||||
"label": "नाम"
|
||||
},
|
||||
"slug": {
|
||||
"label": "काउंटर"
|
||||
}
|
||||
},
|
||||
"heading": "अपने रिज्यूमे का नाम बदलें"
|
||||
}
|
||||
}
|
||||
}
|
||||
358
client/public/locales/kn/builder.json
Normal file
358
client/public/locales/kn/builder.json
Normal file
@ -0,0 +1,358 @@
|
||||
{
|
||||
"common": {
|
||||
"actions": {
|
||||
"add": "ಹೊಸ {{token}} ಸೇರಿಸಿ",
|
||||
"delete": "{{token}} ಅನ್ನು ಅಳಿಸಿ",
|
||||
"edit": "{{token}} ತಿದ್ದಿಸಿ"
|
||||
},
|
||||
"columns": {
|
||||
"heading": "ಉದ್ದಸಾಲುಗಳು",
|
||||
"tooltip": "ಉದ್ದಸಾಲುಗಳ ಸಂಖ್ಯೆಯನ್ನು ಬದಲಾಯಿಸಿ"
|
||||
},
|
||||
"form": {
|
||||
"date": {
|
||||
"label": "ದಿನಾಂಕ"
|
||||
},
|
||||
"description": {
|
||||
"label": "ವಿವರಣೆ"
|
||||
},
|
||||
"email": {
|
||||
"label": "ಇಮೇಲ್ ವಿಳಾಸ"
|
||||
},
|
||||
"end-date": {
|
||||
"help-text": "ಇನ್ನೂ ಇದ್ದರೆ ಈ ಕ್ಷೇತ್ರವನ್ನು ಖಾಲಿ ಬಿಡಿ",
|
||||
"label": "ಅಂತ್ಯದ ದಿನಾಂಕ"
|
||||
},
|
||||
"keywords": {
|
||||
"label": "ಕೀವರ್ಡ್ಗಳು"
|
||||
},
|
||||
"level": {
|
||||
"label": "ಹಂತ"
|
||||
},
|
||||
"levelNum": {
|
||||
"label": "ಹಂತ (ಸಂಖ್ಯೆ)"
|
||||
},
|
||||
"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": "ಗಾತ್ರ (px ನಲ್ಲಿ)"
|
||||
}
|
||||
},
|
||||
"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": "ಜೆಸೊನ್",
|
||||
"secondary": "ರಿಯಾಕ್ಟಿವ್ ರೆಸ್ಯೂಮ್ಗೆ ಮರಳಿ ಆಮದು ಮಾಡಿಕೊಳ್ಳಬಹುದಾದ ನಿಮ್ಮ ರೆಸ್ಯೂಮ್ನ ஜேசன் ಆವೃತ್ತಿಯನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ."
|
||||
},
|
||||
"pdf": {
|
||||
"loading": {
|
||||
"primary": "PDF ಅನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ",
|
||||
"secondary": "ನಿಮ್ಮ PDF ರಚನೆಯಾಗುತ್ತಿದ್ದಂತೆ ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ, ಇದು 15 ಸೆಕೆಂಡುಗಳವರೆಗೆ ತೆಗೆದುಕೊಳ್ಳಬಹುದು."
|
||||
},
|
||||
"normal": {
|
||||
"primary": "ಪಿಡಿಎಫ್",
|
||||
"secondary": "ನಿಮ್ಮ ರೆಸ್ಯೂಮ್ನ ಪಿಡಿಎಫ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ ಅದನ್ನು ನೀವು ಮುದ್ರಿಸಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕನಸಿನ ಕೆಲಸಕ್ಕೆ ಕಳುಹಿಸಬಹುದು. ಹೆಚ್ಚಿನ ಸಂಪಾದನೆಗಾಗಿ ಈ ಫೈಲ್ ಅನ್ನು ಮರಳಿ ಆಮದು ಮಾಡಿಕೊಳ್ಳಲಾಗುವುದಿಲ್ಲ."
|
||||
}
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
"heading": "ಲೆಔಟ್",
|
||||
"tooltip": {
|
||||
"reset-layout": "ಲೇಔಟ್ ಅನ್ನು ಮರುಹೊಂದಿಸಿ"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"bugs-features": {
|
||||
"body": "ರೇಸುಮೆವನ್ನು ಮಾಡಲು ಏನಾದರೂ ನಿಮ್ಮನ್ನು ತಡೆಯುತ್ತಿದೆಯೇ? ಅಥವಾ ನೀವು ಸೇರಿಸಲು ಅದ್ಭುತವಾದ ಕಲ್ಪನೆಯನ್ನು ಹೊಂದಿದ್ದೀರಾ? ಪ್ರಾರಂಭಿಸಲು GitHub ನಲ್ಲಿ ಸಮಸ್ಯೆಯನ್ನು ಎತ್ತಿಕೊಳ್ಳಿ.",
|
||||
"button": "ಗಿಟ್ಹಬ್ ಸಮಸ್ಯೆಗಳು",
|
||||
"heading": "ಸಮಸ್ಯೆಗಳು? ವೈಶಿಷ್ಟ್ಯದ ವಿನಂತಿಗಳು?"
|
||||
},
|
||||
"donate": {
|
||||
"body": "ನೀವು ರಿಯಾಕ್ಟಿವ್ ರೇಸುಮೆವನ್ನು ಬಳಸಲು ಇಷ್ಟಪಟ್ಟರೆ, ಜಾಹೀರಾತುಗಳಿಲ್ಲದೆ ಮತ್ತು ಶಾಶ್ವತವಾಗಿ ಉಚಿತವಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಇರಿಸಿಕೊಳ್ಳಲು ಮತ್ತು ಚಾಲನೆಯಲ್ಲಿರುವ ಕಾರಣಕ್ಕಾಗಿ ನಿಮ್ಮಿಂದ ಸಾಧ್ಯವಾದಷ್ಟು ದೇಣಿಗೆ ನೀಡಲು ದಯವಿಟ್ಟು ಪರಿಗಣಿಸಿ.",
|
||||
"button": "ನನಗೆ ಕಾಫಿಯನ್ನು ಖರೀದಿಸಿ",
|
||||
"heading": "ರಿಯಾಕ್ಟಿವ್ ರೆಸ್ಯೂಮ್ಗೆ ದೇಣಿಗೆ ನೀಡಿ"
|
||||
},
|
||||
"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": "ಶೀರ್ಷಿಕೆಗಳು"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
32
client/public/locales/kn/common.json
Normal file
32
client/public/locales/kn/common.json
Normal file
@ -0,0 +1,32 @@
|
||||
{
|
||||
"avatar": {
|
||||
"menu": {
|
||||
"greeting": "ನಮಸ್ಕಾರ",
|
||||
"logout": "ಲಾಗ್ ಔಟ್"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"credit": "<1>ಅಮೃತ್ ಪಿಳ್ಳೈ</1> ಅವರು ಉತ್ಸಾಹದಿಂದ ಮಾಡಿರುವ ಪ್ರಾಜೆಕ್ಟ್",
|
||||
"language": {
|
||||
"missing": "ನಿಮ್ಮ ಭಾಷೆ ಕಾಣೆಯಾಗಿದೆಯೇ?"
|
||||
},
|
||||
"license": "ಸಮುದಾಯದಿಂದ, ಸಮುದಾಯಕ್ಕಾಗಿ."
|
||||
},
|
||||
"markdown": {
|
||||
"help-text": "ಈ ವಿಭಾಗವು <1>ಮಾರ್ಕ್ಡೌನ್</1> ಫಾರ್ಮ್ಯಾಟಿಂಗ್ ಅನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ."
|
||||
},
|
||||
"date": {
|
||||
"present": "ಪ್ರಸ್ತುತ"
|
||||
},
|
||||
"subtitle": "ಉಚಿತ ಮತ್ತು ಮುಕ್ತ ಮೂಲ ರೇಸುಮೆ ಬಿಲ್ಡರ್.",
|
||||
"title": "ರಿಯಾಕ್ಟಿವ್ ರೇಸುಮೆ",
|
||||
"toast": {
|
||||
"error": {
|
||||
"upload-file-size": "ದಯವಿಟ್ಟು 2 ಮೆಗಾಬೈಟ್ಗಳೊಳಗಿನ ಫೈಲ್ಗಳನ್ನು ಮಾತ್ರ ಅಪ್ಲೋಡ್ ಮಾಡಿ.",
|
||||
"upload-photo-size": "ದಯವಿಟ್ಟು 2 ಮೆಗಾಬೈಟ್ಗಳ ಕೆಳಗಿನ ಫೋಟೋಗಳನ್ನು ಮಾತ್ರ ಅಪ್ಲೋಡ್ ಮಾಡಿ, ಮೇಲಾಗಿ ಚೌಕ."
|
||||
},
|
||||
"success": {
|
||||
"resume-link-copied": "ನಿಮ್ಮ ರೇಸುಮೆಗೆ ಲಿಂಕ್ ಅನ್ನು ನಿಮ್ಮ ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲಿಸಲಾಗಿದೆ."
|
||||
}
|
||||
}
|
||||
}
|
||||
25
client/public/locales/kn/dashboard.json
Normal file
25
client/public/locales/kn/dashboard.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"create-resume": {
|
||||
"subtitle": "ಮೊದಲಿನಿಂದ ಆರಂಭಿಸಿ",
|
||||
"title": "ಹೊಸ ರೇಸುಮೆ ರಚಿಸಿ"
|
||||
},
|
||||
"import-external": {
|
||||
"subtitle": "ಲಿಂಕ್ಡ್ಇನ್, JSON ರೆಸ್ಯೂಮ್, ರಿಯಾಕ್ಟಿವ್ ರೆಸ್ಯೂಮ್",
|
||||
"title": "ಬಾಹ್ಯ ಮೂಲಗಳಿಂದ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ"
|
||||
},
|
||||
"resume": {
|
||||
"menu": {
|
||||
"delete": "ಅಳಿಸಿ",
|
||||
"duplicate": "ನಕಲು ಮಾಡಿ",
|
||||
"open": "ತೆರೆಯಿರಿ",
|
||||
"rename": "ಮರುಹೆಸರಿಸಿ",
|
||||
"share-link": "ಲಿಂಕ್ ಶೇರ್ ಮಾಡಿ",
|
||||
"tooltips": {
|
||||
"delete": "ಈ ರೇಸುಮೆವನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? ಇದು ಬದಲಾಯಿಸಲಾಗದ ಕ್ರಮ.",
|
||||
"share-link": "ಇತರರಿಗೆ ಗೋಚರಿಸುವಂತೆ ಮಾಡಲು ನಿಮ್ಮ ರೇಸುಮೆನ ಗೋಚರತೆಯನ್ನು ನೀವು ಸಾರ್ವಜನಿಕವಾಗಿ ಬದಲಾಯಿಸುವ ಅಗತ್ಯವಿದೆ."
|
||||
}
|
||||
},
|
||||
"timestamp": "{{timestamp}} ಹಿಂದೆ ಕೊನೆಯದಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ"
|
||||
},
|
||||
"title": "ಡ್ಯಾಶ್ಬೋರ್ಡ್"
|
||||
}
|
||||
41
client/public/locales/kn/landing.json
Normal file
41
client/public/locales/kn/landing.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"actions": {
|
||||
"app": "ಅಪ್ಲಿಕೇಶನ್ಗೆ ಹೋಗಿ",
|
||||
"login": "ಲಾಗಿನ್ ಮಾಡಿ",
|
||||
"logout": "ಲಾಗ್ ಔಟ್",
|
||||
"register": "ನೋಂದಣಿ"
|
||||
},
|
||||
"features": {
|
||||
"heading": "ವೈಶಿಷ್ಟ್ಯಗಳು",
|
||||
"list": {
|
||||
"ads": "ಜಾಹೀರಾತು ಇಲ್ಲ",
|
||||
"export": "ನಿಮ್ಮ ರೆಸ್ಯೂಮ್ ಅನ್ನು ಜೆಸನ್(JSON) ಅಥವಾ PDF ಫಾರ್ಮ್ಯಾಟ್ಗೆ ರಫ್ತು ಮಾಡಿ",
|
||||
"free": "ಉಚಿತ, ಶಾಶ್ವತವಾಗಿ",
|
||||
"import": "ಲಿಂಕ್ಡ್ಇನ್, ಜೆಸನ್ ರೇಸುಮೆನಿಂದ ಡೇಟಾವನ್ನು ಆಮದು ಮಾಡಿ",
|
||||
"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": "ರಿಯಾಕ್ಟಿವ್ ರೇಸುಮೆವು ಉಚಿತ ಮತ್ತು ಮುಕ್ತ ಮೂಲ ರೆಸ್ಯೂಮ್ ಬಿಲ್ಡರ್ ಆಗಿದ್ದು, ನಿಮ್ಮ ರೆಸ್ಯೂಮ್ ಅನ್ನು 1, 2, 3 ರಂತೆ ಸುಲಭವಾಗಿ ರಚಿಸುವ, ನವೀಕರಿಸುವ ಮತ್ತು ಹಂಚಿಕೊಳ್ಳುವ ಪ್ರಾಪಂಚಿಕ ಕಾರ್ಯಗಳನ್ನು ಮಾಡಲು ನಿರ್ಮಿಸಲಾಗಿದೆ. ಈ ಅಪ್ಲಿಕೇಶನ್ನೊಂದಿಗೆ, ನೀವು ಬಹು ರೆಸ್ಯೂಮ್ಗಳನ್ನು ರಚಿಸಬಹುದು, ನೇಮಕಾತಿ ಮಾಡುವವರು ಅಥವಾ ಸ್ನೇಹಿತರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅನನ್ಯ ಲಿಂಕ್ ಮೂಲಕ ಮತ್ತು ಅದನ್ನು PDF ಆಗಿ ಮುದ್ರಿಸಿ, ಎಲ್ಲಾ ಉಚಿತವಾಗಿ, ಯಾವುದೇ ಜಾಹೀರಾತುಗಳಿಲ್ಲ, ಯಾವುದೇ ಟ್ರ್ಯಾಕಿಂಗ್ ಇಲ್ಲ, ನಿಮ್ಮ ಡೇಟಾದ ಸಮಗ್ರತೆ ಮತ್ತು ಗೌಪ್ಯತೆಯನ್ನು ಕಳೆದುಕೊಳ್ಳದೆ.",
|
||||
"heading": "ಸಾರಾಂಶ"
|
||||
}
|
||||
}
|
||||
135
client/public/locales/kn/modals.json
Normal file
135
client/public/locales/kn/modals.json
Normal file
@ -0,0 +1,135 @@
|
||||
{
|
||||
"auth": {
|
||||
"forgot-password": {
|
||||
"actions": {
|
||||
"send-email": "ಪಾಸ್ವರ್ಡ್ ಮರುಹೊಂದಿಸಿ ಇಮೇಲ್ ಕಳುಹಿಸಿ"
|
||||
},
|
||||
"body": "ನೀವು ಮರುಪಡೆಯಲು ಬಯಸುವ ಖಾತೆಯೊಂದಿಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ.",
|
||||
"form": {
|
||||
"email": {
|
||||
"label": "ಇಮೇಲ್ ವಿಳಾಸ"
|
||||
}
|
||||
},
|
||||
"heading": "ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಮರೆತಿರುವಿರಾ?",
|
||||
"help-text": "%1 ರ ಜೊತೆ ಜೋಡಣೆಯಾಗಿರುವ ಖಾತೆ ಇದ್ದಲ್ಲಿ, ನೀವು ನಿಮ್ಮ ಗುಪ್ತಪದ ಮರುಹೊಂದಿಕೆ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿರುವ ಮಿಂಚೆಯನ್ನು ಪಡೆಯುವಿರಿ."
|
||||
},
|
||||
"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": "ಜೆಸನ್ ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ"
|
||||
},
|
||||
"body": "ನೀವು <1>ಮಾನ್ಯಗೊಳಿಸಿದ ಜೆಸನ್ ರೆಸ್ಯೂಮ್ ಹೊಂದಿದ್ದರೆ</1> ಹೋಗಲು ಸಿದ್ಧವಾಗಿದೆ, ರಿಯಾಕ್ಟಿವ್ ರೆಸ್ಯೂಮ್ನಲ್ಲಿ ನಿಮ್ಮ ಅಭಿವೃದ್ಧಿಯನ್ನು ವೇಗವಾಗಿ ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ನೀವು ಇದನ್ನು ಬಳಸಬಹುದು. ಕೆಳಗಿನ ಬಟನ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ಪ್ರಾರಂಭಿಸಲು ಮಾನ್ಯವಾದ JSON ಫೈಲ್ ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ.",
|
||||
"heading": "ಜೆಸನ್ ರೆಸ್ಯೂಮ್ನಿಂದ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ"
|
||||
},
|
||||
"linkedin": {
|
||||
"actions": {
|
||||
"upload-archive": "ಜಿಪ್ (ZIP) ಆರ್ಕೈವ್ ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ"
|
||||
},
|
||||
"body": "ಲಿಂಕ್ಡ್ಇನ್ನಿಂದ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ರಫ್ತು ಮಾಡುವ ಮೂಲಕ ಮತ್ತು ರಿಯಾಕ್ಟಿವ್ ರೆಸ್ಯೂಮ್ನಲ್ಲಿ ಕ್ಷೇತ್ರಗಳನ್ನು ಸ್ವಯಂ ತುಂಬಲು ಅದನ್ನು ಬಳಸುವ ಮೂಲಕ ನೀವು ಸಮಯವನ್ನು ಉಳಿಸಬಹುದು. <1>ಡೇಟಾ ಗೌಪ್ಯತೆಗೆ ಹೋಗಿ</1> ಲಿಂಕ್ಡ್ಇನ್ನಲ್ಲಿ ವಿಭಾಗ ಮತ್ತು ನಿಮ್ಮ ಡೇಟಾದ ಆರ್ಕೈವ್ ಅನ್ನು ವಿನಂತಿಸಿ. ಒಮ್ಮೆ ಅದು ಲಭ್ಯವಾದ ನಂತರ, ಕೆಳಗಿನ ZIP ಫೈಲ್ ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ.",
|
||||
"heading": "ಲಿಂಕ್ಡಿನ್(LinkedIn) ನಿಂದ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ"
|
||||
},
|
||||
"reactive-resume": {
|
||||
"actions": {
|
||||
"upload-json": "ಜೆಸನ್ ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡಿ"
|
||||
},
|
||||
"body": "ನೀವು ರಿಯಾಕ್ಟಿವ್ ರೆಸ್ಯೂಮ್ನ ಪ್ರಸ್ತುತ ಆವೃತ್ತಿಯೊಂದಿಗೆ ರಫ್ತು ಮಾಡಲಾದ ಜೆಸನ್(JSON) ಅನ್ನು ಹೊಂದಿದ್ದರೆ, ಮತ್ತೆ ಸಂಪಾದಿಸಬಹುದಾದ ಆವೃತ್ತಿಯನ್ನು ಪಡೆಯಲು ನೀವು ಅದನ್ನು ಇಲ್ಲಿಗೆ ಆಮದು ಮಾಡಿಕೊಳ್ಳಬಹುದು. ರಿಯಾಕ್ಟಿವ್ ರೆಸ್ಯೂಮ್ನ ಹಿಂದಿನ ಆವೃತ್ತಿಗಳು ದುರದೃಷ್ಟವಶಾತ್ ಸದ್ಯಕ್ಕೆ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ.",
|
||||
"heading": "ಜೆಸನ್ ರೆಸ್ಯೂಮ್ನಿಂದ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ"
|
||||
}
|
||||
},
|
||||
"rename-resume": {
|
||||
"actions": {
|
||||
"rename-resume": "ರೇಸುಮೆವನ್ನು ಮರುಹೆಸರಿಸಿ"
|
||||
},
|
||||
"form": {
|
||||
"name": {
|
||||
"label": "ಹೆಸರು"
|
||||
},
|
||||
"slug": {
|
||||
"label": "ಸ್ಲಗ್"
|
||||
}
|
||||
},
|
||||
"heading": "ನಿಮ್ಮ ರೇಸುಮೆವನ್ನು ಅನ್ನು ಮರುಹೆಸರಿಸಿ"
|
||||
}
|
||||
}
|
||||
}
|
||||
358
client/public/locales/ta/builder.json
Normal file
358
client/public/locales/ta/builder.json
Normal file
@ -0,0 +1,358 @@
|
||||
{
|
||||
"common": {
|
||||
"actions": {
|
||||
"add": "புதிய {{token}}ஐ சேர்க்கவும்",
|
||||
"delete": "{{token}}ஐ அழிக்கவும்",
|
||||
"edit": "{{token}}ஐ திருத்தவும்"
|
||||
},
|
||||
"columns": {
|
||||
"heading": "நெடுவரிசைகள்",
|
||||
"tooltip": "நெடுவரிசைகளின் எண்ணிக்கையை மாற்றவும்"
|
||||
},
|
||||
"form": {
|
||||
"date": {
|
||||
"label": "தேதி"
|
||||
},
|
||||
"description": {
|
||||
"label": "விளக்கம்"
|
||||
},
|
||||
"email": {
|
||||
"label": "மின்னஞ்சல் முகவரி"
|
||||
},
|
||||
"end-date": {
|
||||
"help-text": "இன்னும் இருந்தால், இந்த புலத்தை காலியாக விடவும்",
|
||||
"label": "கடைசி தேதி"
|
||||
},
|
||||
"keywords": {
|
||||
"label": "முக்கிய வார்த்தைகள்"
|
||||
},
|
||||
"level": {
|
||||
"label": "நிலை"
|
||||
},
|
||||
"levelNum": {
|
||||
"label": "நிலை (எண்)"
|
||||
},
|
||||
"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": "அளவு (px)"
|
||||
}
|
||||
},
|
||||
"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": "ஜேசன்",
|
||||
"secondary": "ரியாக்டிவ் ரெஸ்யூமில் மீண்டும் இறக்குமதி செய்யக்கூடிய உங்கள் ரெஸ்யூமின் ஜேசன் பதிப்பைப் பதிவிறக்கவும்."
|
||||
},
|
||||
"pdf": {
|
||||
"loading": {
|
||||
"primary": "PDFஐ உருவாக்குகிறது",
|
||||
"secondary": "உங்கள் PDF உருவாக்கப்படும் வரை காத்திருக்கவும், இதற்கு 15 வினாடிகள்வரை ஆகலாம்."
|
||||
},
|
||||
"normal": {
|
||||
"primary": "பிடிஎப்",
|
||||
"secondary": "உங்கள் பயோடேட்டாவின் பிடிஎப் ஐப் பதிவிறக்கவும், அதை நீங்கள் அச்சிட்டு உங்கள் கனவு வேலைக்கு அனுப்பலாம். மேலும் திருத்துவதற்கு இந்தக் கோப்பை மீண்டும் இறக்குமதி செய்ய முடியாது."
|
||||
}
|
||||
}
|
||||
},
|
||||
"layout": {
|
||||
"heading": "தளவமைப்பு",
|
||||
"tooltip": {
|
||||
"reset-layout": "தளவமைப்பை மீட்டமைக்கவும்"
|
||||
}
|
||||
},
|
||||
"links": {
|
||||
"bugs-features": {
|
||||
"body": "ரெஸ்யூம் தயாரிப்பதில் இருந்து ஏதாவது தடையா? அல்லது நீங்கள் சேர்க்க ஒரு அற்புதமான யோசனை உள்ளதா? தொடங்குவதற்கு கிதஹப இல் சிக்கலை எழுப்புங்கள்.",
|
||||
"button": "கிதஹப சிக்கல்கள்",
|
||||
"heading": "பிழைகள்? அம்ச கோரிக்கைகள்?"
|
||||
},
|
||||
"donate": {
|
||||
"body": "ரியாக்டிவ் ரெஸ்யூமைப் பயன்படுத்த நீங்கள் விரும்பினால், விளம்பரங்கள் இல்லாமல், எப்போதும் இலவசம் இல்லாமல், ஆப்ஸைத் தொடர்ந்து இயக்குவதற்கு உங்களால் முடிந்த அளவு நன்கொடை அளிப்பதைக் கருத்தில் கொள்ளவும்.",
|
||||
"button": "காபி வாங்கிக் கொடு",
|
||||
"heading": "ரீயாக்ட்டிவ் ரெசுமேக்கு நன்கொடை அளிக்கவும்"
|
||||
},
|
||||
"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": "தலைப்புகள்"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5,14 +5,19 @@
|
||||
"logout": "வெளியேறு"
|
||||
}
|
||||
},
|
||||
"description": "ரியாக்டிவ் ரெஸ்யூம் என்பது ஒரு இலவச மற்றும் ஓப்பன் சோர்ஸ் ரெஸ்யூம் பில்டராகும், இது உங்கள் விண்ணப்பத்தை 1, 2, 3 என எளிதாக உருவாக்குவது, புதுப்பித்தல் மற்றும் பகிர்வது போன்ற சர்வ சாதாரணமான பணிகளைச் செய்ய உருவாக்கப்பட்டுள்ளது.",
|
||||
"footer": {
|
||||
"credit": "<1>அம்ருத் பிள்ளை</1>யின் திட்டம்",
|
||||
"language": {
|
||||
"missing": "உங்கள் மொழியைக் காணவில்லையா?"
|
||||
},
|
||||
"license": "சமூகத்தால், சமூகத்திற்காக."
|
||||
},
|
||||
"markdown": {
|
||||
"help-text": "இந்தப் பிரிவு <1>மார்க் டவுன்</1> வடிவமைப்பை ஆதரிக்கிறது."
|
||||
},
|
||||
"date": {
|
||||
"present": "தற்போது"
|
||||
},
|
||||
"subtitle": "இலவச மற்றும் ஓப்பன் சோர்ஸ் ரெஸ்யூம் பில்டர்.",
|
||||
"title": "ரியாக்டிவ் ரெசுமே",
|
||||
"toast": {
|
||||
|
||||
25
client/public/locales/ta/dashboard.json
Normal file
25
client/public/locales/ta/dashboard.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"create-resume": {
|
||||
"subtitle": "மீண்டும் முதலில் இருந்து துவங்கு",
|
||||
"title": "புதிய ரெஸ்யூமை உருவாக்கவும்"
|
||||
},
|
||||
"import-external": {
|
||||
"subtitle": "லிங்க்டின், ஜேசன் ரெசுமே, ரீயாக்ட்டிவ் ரெசுமே",
|
||||
"title": "வெளி மூலங்களிலிருந்து இறக்குமதி"
|
||||
},
|
||||
"resume": {
|
||||
"menu": {
|
||||
"delete": "அழி",
|
||||
"duplicate": "நகல்",
|
||||
"open": "திற",
|
||||
"rename": "மறுபெயரிடவும்",
|
||||
"share-link": "பகிர்வு இணைப்பு",
|
||||
"tooltips": {
|
||||
"delete": "இந்த ரெஸ்யூமை நிச்சயமாக நீக்க வேண்டுமா? இது மீள முடியாத செயல்.",
|
||||
"share-link": "உங்கள் பயோடேட்டாவை மற்றவர்களுக்குத் தெரியப்படுத்த, அதன் தெரிவுநிலையை பொதுவில் மாற்ற வேண்டும்."
|
||||
}
|
||||
},
|
||||
"timestamp": "{{timestamp}} ಹಿಂದೆ ಕೊನೆಯದಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ"
|
||||
},
|
||||
"title": "டாஷ்போர்டு"
|
||||
}
|
||||
41
client/public/locales/ta/landing.json
Normal file
41
client/public/locales/ta/landing.json
Normal file
@ -0,0 +1,41 @@
|
||||
{
|
||||
"actions": {
|
||||
"app": "பயன்பாட்டிற்குச் செல்லவும்",
|
||||
"login": "உள்நுழைய",
|
||||
"logout": "வெளியேறு",
|
||||
"register": "பதிவு"
|
||||
},
|
||||
"features": {
|
||||
"heading": "அம்சங்கள்",
|
||||
"list": {
|
||||
"ads": "விளம்பரம் இல்லை",
|
||||
"export": "உங்கள் விண்ணப்பத்தை JSON அல்லது PDF வடிவத்திற்கு ஏற்றுமதி செய்யவும்",
|
||||
"free": "இலவசம், எப்போதும்",
|
||||
"import": "LinkedIn, JSON Resume இலிருந்து தரவை இறக்குமதி செய்யவும்",
|
||||
"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": "ரியாக்டிவ் ரெஸ்யூம் என்பது ஒரு இலவச மற்றும் ஓப்பன் சோர்ஸ் ரெஸ்யூம் பில்டராகும், இது உங்கள் விண்ணப்பத்தை உருவாக்குதல், புதுப்பித்தல் மற்றும் பகிர்தல் போன்ற சாதாரண பணிகளை 1, 2, 3 என எளிதாக்கும் வகையில் உருவாக்கப்பட்டுள்ளது. இந்தப் பயன்பாட்டின் மூலம், நீங்கள் பல ரெஸ்யூம்களை உருவாக்கலாம், ஆட்சேர்ப்பு செய்பவர்கள் அல்லது நண்பர்களுடன் பகிர்ந்து கொள்ளலாம். ஒரு தனித்துவமான இணைப்பின் மூலம் அதை PDF ஆக அச்சிடுங்கள், அனைத்தும் இலவசமாக, விளம்பரங்கள் இல்லை, கண்காணிப்பு இல்லை, உங்கள் தரவின் ஒருமைப்பாடு மற்றும் தனியுரிமையை இழக்காமல்.",
|
||||
"heading": "சுருக்கம்"
|
||||
}
|
||||
}
|
||||
135
client/public/locales/ta/modals.json
Normal file
135
client/public/locales/ta/modals.json
Normal file
@ -0,0 +1,135 @@
|
||||
{
|
||||
"auth": {
|
||||
"forgot-password": {
|
||||
"actions": {
|
||||
"send-email": "கடவுச்சொல்லை மீட்டமைக்கும் மின்னஞ்சலை அனுப்பவும்"
|
||||
},
|
||||
"body": "நீங்கள் மீட்டெடுக்க விரும்பும் கணக்குடன் தொடர்புடைய மின்னஞ்சல் முகவரியை உள்ளிடவும்.",
|
||||
"form": {
|
||||
"email": {
|
||||
"label": "மின்னஞ்சல் முகவரி"
|
||||
}
|
||||
},
|
||||
"heading": "உங்கள் கடவுச்சொல்லை மறந்து விட்டீர்களா?",
|
||||
"help-text": "கணக்கு இருந்தால், உங்கள் கடவுச்சொல்லை மீட்டமைப்பதற்கான இணைப்புடன் மின்னஞ்சலைப் பெறுவீர்கள்."
|
||||
},
|
||||
"login": {
|
||||
"actions": {
|
||||
"login": "உள்நுழைய",
|
||||
"google": "Google மூலம் உள்நுழைக"
|
||||
},
|
||||
"body": "உள்நுழைவதற்கும் அணுகுவதற்கும், உங்கள் பயோடேட்டாக்களை நிர்வகிப்பதற்கும் பகிரவும் உங்கள் கணக்குடன் தொடர்புடைய உங்கள் பயனர்பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்.",
|
||||
"form": {
|
||||
"password": {
|
||||
"label": "கடவுச்சொல்"
|
||||
},
|
||||
"username": {
|
||||
"help-text": "உங்கள் மின்னஞ்சல் முகவரியையும் உள்ளிடலாம்",
|
||||
"label": "பயனர் பெயர்"
|
||||
}
|
||||
},
|
||||
"heading": "உங்கள் கணக்கில் உள்நுழைக",
|
||||
"recover-text": "உங்கள் கடவுச்சொல்லை மறந்துவிட்டால், இங்கே <1>உங்கள் கணக்கை மீட்டெடுக்கலாம்</1>.",
|
||||
"register-text": "உங்களிடம் ஒன்று இல்லையென்றால், நீங்கள் இங்கே <1>ஒரு கணக்கை உருவாக்கலாம்</1>."
|
||||
},
|
||||
"register": {
|
||||
"actions": {
|
||||
"register": "பதிவு",
|
||||
"google": "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": "உங்களிடம் <1>சரிபார்க்கப்பட்ட JSON ரெஸ்யூம்</1> தயாராக இருந்தால், ரியாக்டிவ் ரெஸ்யூமில் உங்கள் மேம்பாட்டை விரைவாகக் கண்காணிக்க அதைப் பயன்படுத்தலாம். தொடங்குவதற்கு, கீழே உள்ள பொத்தானைக் கிளிக் செய்து சரியான JSON கோப்பைப் பதிவேற்றவும்.",
|
||||
"heading": "JSON ரெஸ்யூமிலிருந்து இறக்குமதி செய்யவும்"
|
||||
},
|
||||
"linkedin": {
|
||||
"actions": {
|
||||
"upload-archive": "ZIP காப்பகத்தைப் பதிவேற்றவும்"
|
||||
},
|
||||
"body": "LinkedIn இலிருந்து உங்கள் தரவை ஏற்றுமதி செய்து, Reactive Resume இல் புலங்களைத் தானாக நிரப்புவதற்குப் பயன்படுத்துவதன் மூலம் நேரத்தைச் சேமிக்கலாம். LinkedIn இல் <1>தரவு தனியுரிமை</1> பகுதிக்குச் சென்று உங்கள் தரவைக் காப்பகமாகக் கோரவும். அது கிடைத்ததும், ஜிப் கோப்பை கீழே பதிவேற்றவும்.",
|
||||
"heading": "LinkedIn இலிருந்து இறக்குமதி செய்யவும்"
|
||||
},
|
||||
"reactive-resume": {
|
||||
"actions": {
|
||||
"upload-json": "JSON ஐப் பதிவேற்றவும்"
|
||||
},
|
||||
"body": "Reactive Resume இன் தற்போதைய பதிப்பில் ஏற்றுமதி செய்யப்பட்ட JSON உங்களிடம் இருந்தால், திருத்தக்கூடிய பதிப்பை மீண்டும் பெற, அதை மீண்டும் இங்கு இறக்குமதி செய்யலாம். Reactive Resume இன் முந்தைய பதிப்புகள் துரதிருஷ்டவசமாக தற்போது ஆதரிக்கப்படவில்லை.",
|
||||
"heading": "Reactive Resume லிருந்து இறக்குமதி செய்யவும்"
|
||||
}
|
||||
},
|
||||
"rename-resume": {
|
||||
"actions": {
|
||||
"rename-resume": "ரெஸ்யூமை மறுபெயரிடவும்"
|
||||
},
|
||||
"form": {
|
||||
"name": {
|
||||
"label": "பெயர்"
|
||||
},
|
||||
"slug": {
|
||||
"label": "ஸ்லக்"
|
||||
}
|
||||
},
|
||||
"heading": "ரெஸ்யூமை மறுபெயரிடவும்"
|
||||
}
|
||||
}
|
||||
}
|
||||
9
client/public/robots.txt
Normal file
9
client/public/robots.txt
Normal file
@ -0,0 +1,9 @@
|
||||
# *
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# Host
|
||||
Host: https://rxresu.me
|
||||
|
||||
# Sitemaps
|
||||
Sitemap: https://rxresu.me/sitemap.xml
|
||||
15
client/public/sitemap-0.xml
Normal file
15
client/public/sitemap-0.xml
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
|
||||
<url><loc>https://rxresu.me</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/dashboard</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/meta/privacy</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/meta/service</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/de/dashboard</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/kn/dashboard</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/ta/dashboard</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/hi/dashboard</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/de</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/kn</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/ta</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
<url><loc>https://rxresu.me/hi</loc><changefreq>monthly</changefreq><priority>0.7</priority><lastmod>2022-03-12T10:44:13.581Z</lastmod></url>
|
||||
</urlset>
|
||||
4
client/public/sitemap.xml
Normal file
4
client/public/sitemap.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<sitemap><loc>https://rxresu.me/sitemap-0.xml</loc></sitemap>
|
||||
</sitemapindex>
|
||||
@ -1,8 +1,6 @@
|
||||
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
||||
import merge from 'lodash/merge';
|
||||
|
||||
import { Language, languageMap } from '@/config/languages';
|
||||
|
||||
export type Theme = 'light' | 'dark';
|
||||
|
||||
export type Sidebar = 'left' | 'right';
|
||||
@ -13,7 +11,6 @@ export type Orientation = 'horizontal' | 'vertical';
|
||||
|
||||
export type BuildState = {
|
||||
theme?: Theme;
|
||||
language: Language;
|
||||
sidebar: Record<Sidebar, SidebarState>;
|
||||
page: {
|
||||
breakLine: boolean;
|
||||
@ -22,7 +19,6 @@ export type BuildState = {
|
||||
};
|
||||
|
||||
const initialState: BuildState = {
|
||||
language: languageMap['en'],
|
||||
sidebar: {
|
||||
left: { open: false },
|
||||
right: { open: false },
|
||||
@ -35,8 +31,6 @@ const initialState: BuildState = {
|
||||
|
||||
type SetThemePayload = { theme: Theme };
|
||||
|
||||
type SetLanguagePayload = { language: string };
|
||||
|
||||
type ToggleSidebarPayload = { sidebar: Sidebar };
|
||||
|
||||
type SetSidebarStatePayload = { sidebar: Sidebar; state: SidebarState };
|
||||
@ -50,11 +44,6 @@ export const buildSlice = createSlice({
|
||||
|
||||
state.theme = theme;
|
||||
},
|
||||
setLanguage: (state, action: PayloadAction<SetLanguagePayload>) => {
|
||||
const { language } = action.payload;
|
||||
|
||||
state.language = languageMap[language];
|
||||
},
|
||||
toggleSidebar: (state, action: PayloadAction<ToggleSidebarPayload>) => {
|
||||
const { sidebar } = action.payload;
|
||||
|
||||
@ -76,7 +65,7 @@ export const buildSlice = createSlice({
|
||||
},
|
||||
});
|
||||
|
||||
export const { setTheme, setLanguage, toggleSidebar, setSidebarState, togglePageBreakLine, togglePageOrientation } =
|
||||
export const { setTheme, toggleSidebar, setSidebarState, togglePageBreakLine, togglePageOrientation } =
|
||||
buildSlice.actions;
|
||||
|
||||
export default buildSlice.reducer;
|
||||
|
||||
@ -82,7 +82,7 @@ export const resumeSlice = createSlice({
|
||||
},
|
||||
deleteSection: (state: Resume, action: PayloadAction<DeleteSectionPayload>) => {
|
||||
const { path } = action.payload;
|
||||
const id = path ? path.split('.').at(-1) : '';
|
||||
const id = path.split('.')[1];
|
||||
|
||||
const sections = Object.keys(state.sections).filter((x) => x !== id);
|
||||
const layout = state.metadata.layout.map((pages) => pages.map((list) => list.filter((x) => x !== id)));
|
||||
|
||||
@ -1,8 +1,12 @@
|
||||
.container {
|
||||
@apply m-6 grid gap-8 text-center md:m-8 md:text-left;
|
||||
|
||||
footer > div {
|
||||
@apply text-xs font-medium opacity-50 mt-2;
|
||||
footer {
|
||||
@apply flex items-end justify-between;
|
||||
|
||||
.version > div {
|
||||
@apply text-xs font-medium opacity-50 mt-3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -91,13 +91,7 @@ const Section: React.FC<SectionProps> = ({
|
||||
</DataDisplay>
|
||||
)}
|
||||
|
||||
{keywords && (
|
||||
<div className="leading-normal">
|
||||
<span className="font-semibold">Keywords:</span>
|
||||
|
||||
{keywords.join(', ')}
|
||||
</div>
|
||||
)}
|
||||
{keywords && <div>{keywords.join(', ')}</div>}
|
||||
|
||||
{(phone || email) && (
|
||||
<div className="grid gap-1">
|
||||
|
||||
@ -92,13 +92,7 @@ const Section: React.FC<SectionProps> = ({
|
||||
</DataDisplay>
|
||||
)}
|
||||
|
||||
{keywords && (
|
||||
<div className="leading-normal">
|
||||
<span className="font-semibold">Keywords:</span>
|
||||
|
||||
{keywords.join(', ')}
|
||||
</div>
|
||||
)}
|
||||
{keywords && <div>{keywords.join(', ')}</div>}
|
||||
|
||||
{(phone || email) && (
|
||||
<div className="grid gap-1">
|
||||
|
||||
@ -92,13 +92,7 @@ const Section: React.FC<SectionProps> = ({
|
||||
</DataDisplay>
|
||||
)}
|
||||
|
||||
{keywords && (
|
||||
<div>
|
||||
<span className="font-semibold">Keywords:</span>
|
||||
|
||||
{keywords.join(', ')}
|
||||
</div>
|
||||
)}
|
||||
{keywords && <div>{keywords.join(', ')}</div>}
|
||||
|
||||
{(phone || email) && (
|
||||
<div className="grid gap-1">
|
||||
|
||||
@ -84,13 +84,7 @@ const Section: React.FC<SectionProps> = ({
|
||||
</DataDisplay>
|
||||
)}
|
||||
|
||||
{keywords && (
|
||||
<div className="leading-normal">
|
||||
<span className="font-semibold">Keywords:</span>
|
||||
|
||||
{keywords.join(', ')}
|
||||
</div>
|
||||
)}
|
||||
{keywords && <div>{keywords.join(', ')}</div>}
|
||||
|
||||
{(phone || email) && (
|
||||
<div className="grid gap-1">
|
||||
|
||||
@ -2,6 +2,7 @@ import { DateRange } from '@reactive-resume/schema';
|
||||
import dayjs from 'dayjs';
|
||||
import isEmpty from 'lodash/isEmpty';
|
||||
import isString from 'lodash/isString';
|
||||
import { i18n } from 'next-i18next';
|
||||
|
||||
export const dateFormatOptions: string[] = [
|
||||
'MMMM DD, YYYY',
|
||||
@ -14,12 +15,15 @@ export const dateFormatOptions: string[] = [
|
||||
'YYYY/MM/DD',
|
||||
'MMMM YYYY',
|
||||
'MMM YYYY',
|
||||
'MM/YYYY',
|
||||
'YYYY',
|
||||
];
|
||||
|
||||
export const getRelativeTime = (timestamp: dayjs.ConfigType): string => dayjs(timestamp).toNow(true);
|
||||
|
||||
export const formatDateString = (date: string | DateRange, formatStr: string): string | null => {
|
||||
const presentString = i18n?.t('common.date.present') ?? '';
|
||||
|
||||
if (isEmpty(date)) return null;
|
||||
|
||||
// If `date` is a string
|
||||
@ -38,5 +42,5 @@ export const formatDateString = (date: string | DateRange, formatStr: string): s
|
||||
return `${dayjs(date.start).format(formatStr)} - ${dayjs(date.end).format(formatStr)}`;
|
||||
}
|
||||
|
||||
return dayjs(date.start).format(formatStr);
|
||||
return `${dayjs(date.start).format(formatStr)} - ${presentString}`;
|
||||
};
|
||||
|
||||
8
client/utils/getCookie.ts
Normal file
8
client/utils/getCookie.ts
Normal file
@ -0,0 +1,8 @@
|
||||
export const getCookie = (name: string): string | undefined => {
|
||||
const value = `; ${document.cookie}`;
|
||||
const parts = value.split(`; ${name}=`);
|
||||
|
||||
if (parts.length === 2) {
|
||||
return parts[1];
|
||||
}
|
||||
};
|
||||
@ -1,11 +1,23 @@
|
||||
import dayjs from 'dayjs';
|
||||
import relativeTime from 'dayjs/plugin/relativeTime';
|
||||
import { useRouter } from 'next/router';
|
||||
import { useEffect } from 'react';
|
||||
|
||||
const DateWrapper: React.FC = ({ children }) => {
|
||||
const { locale } = useRouter();
|
||||
|
||||
useEffect(() => {
|
||||
dayjs.extend(relativeTime);
|
||||
}, []);
|
||||
|
||||
// Locales
|
||||
require('dayjs/locale/es');
|
||||
require('dayjs/locale/de');
|
||||
require('dayjs/locale/hi');
|
||||
require('dayjs/locale/kn');
|
||||
require('dayjs/locale/ta');
|
||||
|
||||
locale && dayjs.locale(locale);
|
||||
}, [locale]);
|
||||
|
||||
return <>{children}</>;
|
||||
};
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
import { useRouter } from 'next/router';
|
||||
import { useEffect } from 'react';
|
||||
|
||||
import { useAppSelector } from '@/store/hooks';
|
||||
|
||||
const LocaleWrapper: React.FC = ({ children }) => {
|
||||
const router = useRouter();
|
||||
|
||||
const language = useAppSelector((state) => state.build.language);
|
||||
|
||||
useEffect(() => {
|
||||
if (!language) return;
|
||||
|
||||
const { code } = language;
|
||||
const { pathname, asPath, query, locale } = router;
|
||||
|
||||
document.cookie = `NEXT_LOCALE=${code}; path=/; expires=2147483647`;
|
||||
|
||||
if (locale !== code) {
|
||||
router.push({ pathname, query }, asPath, { locale: code });
|
||||
}
|
||||
}, [router, language]);
|
||||
|
||||
return <>{children}</>;
|
||||
};
|
||||
|
||||
export default LocaleWrapper;
|
||||
@ -1,7 +1,6 @@
|
||||
import DateWrapper from './DateWrapper';
|
||||
import FontWrapper from './FontWrapper';
|
||||
import HotkeysWrapper from './HotkeysWrapper';
|
||||
import LocaleWrapper from './LocaleWrapper';
|
||||
import ThemeWrapper from './ThemeWrapper';
|
||||
|
||||
const WrapperRegistry: React.FC = ({ children }) => {
|
||||
@ -10,9 +9,7 @@ const WrapperRegistry: React.FC = ({ children }) => {
|
||||
<FontWrapper>
|
||||
<HotkeysWrapper>
|
||||
<DateWrapper>
|
||||
<LocaleWrapper>
|
||||
<>{children}</>
|
||||
</LocaleWrapper>
|
||||
<>{children}</>
|
||||
</DateWrapper>
|
||||
</HotkeysWrapper>
|
||||
</FontWrapper>
|
||||
|
||||
4
docs/.eslintrc.json
Normal file
4
docs/.eslintrc.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"extends": "../.eslintrc.json",
|
||||
"ignorePatterns": ["build", ".docusaurus"]
|
||||
}
|
||||
20
docs/.gitignore
vendored
Normal file
20
docs/.gitignore
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
# Dependencies
|
||||
/node_modules
|
||||
|
||||
# Production
|
||||
/build
|
||||
|
||||
# Generated files
|
||||
.docusaurus
|
||||
.cache-loader
|
||||
|
||||
# Misc
|
||||
.DS_Store
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
3
docs/babel.config.js
Normal file
3
docs/babel.config.js
Normal file
@ -0,0 +1,3 @@
|
||||
module.exports = {
|
||||
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
|
||||
};
|
||||
69
docs/docs/index.mdx
Normal file
69
docs/docs/index.mdx
Normal file
@ -0,0 +1,69 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
sidebar_label: Introduction
|
||||
---
|
||||
|
||||
import TOCInline from '@theme/TOCInline';
|
||||
|
||||
# Reactive Resume
|
||||
|
||||

|
||||

|
||||
[](https://hub.docker.com/r/amruthpillai/reactive-resume)
|
||||
[](https://app.fossa.com/projects/git%2Bgithub.com%2FAmruthPillai%2FReactive-Resume?ref=badge_shield)
|
||||
|
||||
## [Go to App](https://rxresu.me) | [Docs](https://docs.rxresu.me)
|
||||
|
||||
## Summary
|
||||
|
||||
Reactive Resume is a free and open source resume builder that's built to make the mundane tasks of creating, updating and sharing your resume as easy as 1, 2, 3. With this app, you can create multiple resumes, share them with recruiters through a unique link and print as PDF, all for free, no advertisements, without losing the integrity and privacy of your data.
|
||||
|
||||
You have complete control over what goes into your resume, how it looks, what colors, what templates, even the layout in which sections placed. Want a dark mode resume? It's as easy as editing 3 values and you're done. You don't need to wait to see your changes either. Everything you type, everything you change, appears immediately on your resume and gets updated in real time.
|
||||
|
||||
## Features
|
||||
|
||||
- Free, forever
|
||||
- No Advertising
|
||||
- No User Tracking
|
||||
- Sync your data across devices
|
||||
- Import data from [LinkedIn](https://www.linkedin.com/), [JSON Resume](https://jsonresume.org/)
|
||||
- Manage multiple resumes with one account
|
||||
- Open Source (with large community support)
|
||||
- Send your resume to others with a unique sharable link
|
||||
- Accessible in multiple languages, [help translate here](https://translate.rxresu.me/)
|
||||
- Pick any font from [Google Fonts](https://fonts.google.com/) to use on your resume
|
||||
- Choose from 6 vibrant templates and more coming soon
|
||||
- Export your resume to JSON or PDF format with just one click
|
||||
- Create an account using your email, or just Sign in with Google
|
||||
- Mix and match colors to any degree, even a dark mode resume?
|
||||
- Add sections, add pages and change layouts the way you want to
|
||||
- Tailor-made Backend and Database, isolated from Google, Amazon etc.
|
||||
- **Oh, and did I mention that it's free?**
|
||||
|
||||
## Languages
|
||||
|
||||
- English
|
||||
- German (Deutsch)
|
||||
- Hindi (हिन्दी)
|
||||
- Kannada (ಕನ್ನಡ) (@aksh1251)
|
||||
- Spanish (Español) (@seba11998)
|
||||
- Tamil (தமிழ்)
|
||||
|
||||
Help by [translating Reactive Resume](https://translate.rxresu.me) to your language!
|
||||
|
||||
## Report Issues
|
||||
|
||||
Use the [GitHub Issues](https://github.com/AmruthPillai/Reactive-Resume/issues/new/choose) platform to notify me about bugs or new features that you would like to see in Reactive Resume. Please check before creating new issues as there might already be one.
|
||||
|
||||
## Donations
|
||||
|
||||
Reactive Resume would be nothing without the folks who supported me and kept the project alive in the beginning, and your cotinued support is what keeps me going. If you found Reactive Resume to be useful, helpful or just insightful and appreciate the effort I took to make the project, please consider donating as little or as much as your can.
|
||||
|
||||
#### [☕️ Buy me a coffee](https://www.buymeacoffee.com/AmruthPillai) | [💸 PayPal](https://paypal.me/RajaRajanA)
|
||||
|
||||
## 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.
|
||||
|
||||
_By the community, for the community._
|
||||
A passion project by [Amruth Pillai](https://amruthpillai.com/)
|
||||
2
docs/docs/source-code/_category_.yml
Normal file
2
docs/docs/source-code/_category_.yml
Normal file
@ -0,0 +1,2 @@
|
||||
position: 3
|
||||
label: Source Code
|
||||
38
docs/docs/source-code/docker.mdx
Normal file
38
docs/docs/source-code/docker.mdx
Normal file
@ -0,0 +1,38 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Docker
|
||||
|
||||
This is probably the easiest method to build the source code on your machine if you already have Docker and Docker Compose installed. If you don't have Docker on your machine, I'll let you figure that out on your own.
|
||||
|
||||
1. Once you have Docker set up, you can pull the source code from GitHub and dive into the repository.
|
||||
|
||||
```bash
|
||||
git clone git@github.com:AmruthPillai/Reactive-Resume.git
|
||||
cd Reactive-Resume
|
||||
```
|
||||
|
||||
2. Install dependencies using [pnpm](https://pnpm.io/), but feel free to use any other package manager that supports [npm workspaces](https://docs.npmjs.com/cli/v8/using-npm/workspaces).
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
|
||||
3. Copy the `.env.example` file to `.env` in the project root and fill it with values according to your setup. To know which environment variables are required, and about what they do, head over [this section](env-vars).
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
4. Use Docker Compose to create a PostgreSQL instance and a `reactive_resume` database, or feel free to use your own and modify the variables used in `.env`
|
||||
|
||||
```bash
|
||||
docker-compose up -d postgres
|
||||
```
|
||||
|
||||
5. Run the project and start building!
|
||||
|
||||
```bash
|
||||
pnpm dev
|
||||
```
|
||||
163
docs/docs/source-code/env-vars.mdx
Normal file
163
docs/docs/source-code/env-vars.mdx
Normal file
@ -0,0 +1,163 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
import TOCInline from '@theme/TOCInline';
|
||||
|
||||
# Environment Variables
|
||||
|
||||
The project source code requires certain envrionment variables to be pre-set in order to work as expected. You can get a copy of what the `.env` file should look like from the `.env.example` file in the root of the project's [source code](https://github.com/AmruthPillai/Reactive-Resume/blob/main/.env.example).
|
||||
|
||||
Here, I'll be explaining what each of the environment variables are for, and which ones are actually **required** and which ones aren't.
|
||||
|
||||
### Sections
|
||||
|
||||
<TOCInline toc={toc} minHeadingLevel="2" maxHeadingLevel="2" />
|
||||
|
||||
## App
|
||||
|
||||
### `TZ`
|
||||
|
||||
**Required**: `no`
|
||||
**Default Value:** `UTC`
|
||||
**Description:** Server Timezone
|
||||
|
||||
This field is just to indicate the timezone that the server should follow. This is just so that the date time information should be unified and all timestamps should follow the same suit.
|
||||
|
||||
### `SECRET_KEY`
|
||||
|
||||
**Required**: `yes`
|
||||
**Description:** Secret Key for Client-Server Communication
|
||||
|
||||
The secret key can be a unique key, a randomly generated string that is used for client-server communication. You can use this [random.org](https://www.random.org/strings/?num=10&len=20&digits=on&upperalpha=on&loweralpha=on&unique=on&format=html&rnd=new) configuration to generate a long unique string.
|
||||
|
||||
## URLs
|
||||
|
||||
### `PUBLIC_URL`
|
||||
|
||||
**Required**: `yes`
|
||||
**Description:** URL through which app is accessible
|
||||
|
||||
**Default Value:** `http://localhost:3000`
|
||||
|
||||
This URL would be used in features like link sharing functionality and authentication redirection. This points only to the client app, as the server would be running on `PORT 3100` always.
|
||||
|
||||
### `PUBLIC_SERVER_URL`
|
||||
|
||||
**Required**: `yes`
|
||||
**Description:** URL through which server is accessible
|
||||
|
||||
**Default Value:** `http://localhost:3100`
|
||||
|
||||
This URL is used when export PDF functionality is used within the app and has to reach out to the server.
|
||||
|
||||
## Database
|
||||
|
||||
### `POSTGRES_HOST`
|
||||
|
||||
**Required**: `yes`
|
||||
**Default Value:** `localhost`
|
||||
**Description:** Hostname for the PostgreSQL Server
|
||||
|
||||
### `POSTGRES_PORT`
|
||||
|
||||
**Required**: `yes`
|
||||
**Default Value:** `5432`
|
||||
**Description:** Port of the PostgreSQL Server
|
||||
|
||||
### `POSTGRES_USERNAME`
|
||||
|
||||
**Required**: `yes`
|
||||
**Default Value:** `postgres`
|
||||
**Description:** Username of the PostgreSQL Server
|
||||
|
||||
### `POSTGRES_PASSWORD`
|
||||
|
||||
**Required**: `yes`
|
||||
**Default Value:** `postgres`
|
||||
**Description:** Password of the PostgreSQL Server
|
||||
|
||||
### `POSTGRES_DATABASE`
|
||||
|
||||
**Required**: `yes`
|
||||
**Default Value:** `reactive_resume`
|
||||
**Description:** Name of the Database in PostgreSQL Server
|
||||
|
||||
### `POSTGRES_SSL_CERT`
|
||||
|
||||
**Required**: `no`
|
||||
**Description:** Base64 Encoded String of the SSL CA Certificate
|
||||
|
||||
Some production-grade managed databases require the need to pass a CA certificate along with the options. You can encode the contents of the `.crt` file sent to you by your cloud provider in _Base64_ and provide it as a environment variable.
|
||||
|
||||
## Authentication
|
||||
|
||||
### `JWT_SECRET`
|
||||
|
||||
**Required**: `yes`
|
||||
**Description:** Secret to Sign and Extract JWT Payloads
|
||||
|
||||
Similar to the `SECRET_KEY`, this can also be a unique generated string. This is used for email/password authentication, to hash + salt passwords stored in the database so they are unreadable.
|
||||
|
||||
### `JWT_EXPIRY_TIME`
|
||||
|
||||
**Required**: `yes`
|
||||
**Default Value:** `604800`
|
||||
**Description:** How long should the JWT be valid for?
|
||||
|
||||
This value, in milliseconds, denotes the validity of the JWT token. A shorter value would make the user have to login more frequently.
|
||||
|
||||
## Google
|
||||
|
||||
As much as I'd like to keep Google out of the picture, they do provide a few services that are actually useful. Namely, Google OAuth (for Login with Google) and Google Fonts (to list all fonts and use them on a resume).
|
||||
|
||||
### `PUBLIC_GOOGLE_CLIENT_ID`
|
||||
|
||||
**Required**: `no`
|
||||
**Description:** Google Client ID for Google Login
|
||||
|
||||
This field is only required if the Google Login functionality is important to you.
|
||||
|
||||
### `GOOGLE_CLIENT_SECRET`
|
||||
|
||||
**Required**: `no`
|
||||
**Description:** Google Client Secret for Google Login
|
||||
|
||||
This field is only required if the Google Login functionality is important to you.
|
||||
|
||||
### `GOOGLE_API_KEY`
|
||||
|
||||
**Required**: `yes`
|
||||
**Description:** Google API Key used for fetching Google Fonts
|
||||
|
||||
Within the resume builder, there's a section where you can pick any font from the Google Fonts Library. To fetch the names and IDs of these fonts, we depend on the Google Fonts API. It does not cost any payment, or the need to enter credit card information to create or use this API.
|
||||
|
||||
You can get your own key here: https://developers.google.com/fonts/docs/developer_api
|
||||
|
||||
## SendGrid
|
||||
|
||||
The server makes use of SendGrid to send the password reset email to those who have forgotten their password. **This section is completely optional for those who do not require this functionality.**
|
||||
|
||||
### `SENDGRID_API_KEY`
|
||||
|
||||
**Required**: `no`
|
||||
**Description:** SendGrid API Key
|
||||
|
||||
Does not require any payment or credit card information to obtain an API key.
|
||||
|
||||
You can get your own key here: https://docs.sendgrid.com/ui/account-and-settings/api-keys
|
||||
|
||||
### `SENDGRID_FORGOT_PASSWORD_TEMPLATE_ID`
|
||||
|
||||
**Required**: `no`
|
||||
**Description:** Dynamic Template ID for Forgot Password
|
||||
|
||||
### `SENDGRID_FROM_NAME`
|
||||
|
||||
**Required**: `no`
|
||||
**Description:** Sender's Name
|
||||
|
||||
### `SENDGRID_FROM_EMAIL`
|
||||
|
||||
**Required**: `no`
|
||||
**Description:** Sender's Email Address
|
||||
14
docs/docs/source-code/index.mdx
Normal file
14
docs/docs/source-code/index.mdx
Normal file
@ -0,0 +1,14 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Source Code
|
||||
|
||||
No, I'm not going to be talking about [the 2011 movie](https://www.imdb.com/title/tt0945513/) here.
|
||||
|
||||
The source code to Reactive Resume is available on [GitHub](https://github.com/AmruthPillai) for you to poke, prod, pull and publish. It is distributed under the [MIT License](https://choosealicense.com/licenses/mit/) which allows you to do **anything you want** with it, including commercial use.
|
||||
|
||||
In this section, I'll be going through the steps on how you can build the project on your local machine (or the cloud). You can choose one of two paths from here:
|
||||
|
||||
- [Docker](docker)
|
||||
- [Local Build](local-build)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user