Compare commits
45 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 047a69886e | |||
| 71bf002370 | |||
| d0e6df044e | |||
| 8e16ef17ed | |||
| 2b80496637 | |||
| 01a3aa02ec | |||
| 35210fe8cf | |||
| d5847faeda | |||
| 0130e02ffd | |||
| c2b858e3fe | |||
| e11f18c034 | |||
| 2ca299224d | |||
| cf1d66d07e | |||
| 62662bb79c | |||
| c0fb34fa50 | |||
| 68f6ab2e6c | |||
| ca642c2001 | |||
| 5b151cdbfc | |||
| 14b3af5f96 | |||
| baa68f03e3 | |||
| 87381da1e5 | |||
| bbd44f0107 | |||
| c65a44c2c7 | |||
| 715d0113ca | |||
| 0f15fb82cb | |||
| 320a7dc342 | |||
| 42ba9e88ad | |||
| 4a002333d4 | |||
| 6384237782 | |||
| 557c5cdc29 | |||
| f9d7736e48 | |||
| 5b64389544 | |||
| 23833b47d1 | |||
| c3eff0a0e7 | |||
| 6f7bc37233 | |||
| b2e8fadaf3 | |||
| 315c8f9afe | |||
| 0fb0d8bc11 | |||
| c356bc26ff | |||
| 23c974a94d | |||
| ee286dd629 | |||
| 4418c47f4f | |||
| 2d88a3a81d | |||
| 1f29506179 | |||
| c90175b6eb |
+186
-44
@@ -1,62 +1,204 @@
|
|||||||
<a name="readme-top"></a>
|
<a name="readme-top"></a>
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
# [1.0.0-beta.10](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.9...v1.0.0-beta.10) (2025-02-16)
|
# [1.0.0-beta.25](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.24...v1.0.0-beta.25) (2025-03-01)
|
||||||
|
|
||||||
|
|
||||||
### 🐛 Bug Fixes
|
|
||||||
|
|
||||||
* **subscribe**: Update forms to include refetch functionality and improve toast messages ([fc55e95](https://github.com/perfect-panel/ppanel-web/commit/fc55e95))
|
|
||||||
|
|
||||||
# [1.0.0-beta.9](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.8...v1.0.0-beta.9) (2025-02-15)
|
|
||||||
|
|
||||||
|
|
||||||
### 🐛 Bug Fixes
|
|
||||||
|
|
||||||
* **register**: Adjust user email verification logic to handle domain suffix checks correctly ([686aa2d](https://github.com/perfect-panel/ppanel-web/commit/686aa2d))
|
|
||||||
|
|
||||||
# [1.0.0-beta.8](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.7...v1.0.0-beta.8) (2025-02-15)
|
|
||||||
|
|
||||||
|
|
||||||
### ✨ Features
|
### ✨ Features
|
||||||
|
|
||||||
* **accounts**: Update third-party account binding and unbinding ([1841552](https://github.com/perfect-panel/ppanel-web/commit/1841552))
|
* **auth**: Add privacy policy link to the footer ([8e16ef1](https://github.com/perfect-panel/ppanel-web/commit/8e16ef1))
|
||||||
* **auth-control**: Adding phone number labels to mobile verification configurations in multiple languages ([046740f](https://github.com/perfect-panel/ppanel-web/commit/046740f))
|
|
||||||
* **auth-control**: Update general ([3883646](https://github.com/perfect-panel/ppanel-web/commit/3883646))
|
|
||||||
* **auth**: Add type parameter to SendCode and update related API typings ([4198871](https://github.com/perfect-panel/ppanel-web/commit/4198871))
|
|
||||||
* **auth**: Refactor mobile authentication config to support whitelist functionality ([c761ec7](https://github.com/perfect-panel/ppanel-web/commit/c761ec7))
|
|
||||||
* **device**: Modify IMEI to device identifier support ([e3f9ef6](https://github.com/perfect-panel/ppanel-web/commit/e3f9ef6))
|
|
||||||
* **imei**: Add IMEI related internationalization support and menu items ([13c3337](https://github.com/perfect-panel/ppanel-web/commit/13c3337))
|
|
||||||
* **locales**: Add kick offline confirmation and success messages in multiple languages ([5db5343](https://github.com/perfect-panel/ppanel-web/commit/5db5343))
|
|
||||||
* **locales**: Update 'sms' to 'mobile' in authentication methods across multiple languages ([fea2171](https://github.com/perfect-panel/ppanel-web/commit/fea2171))
|
|
||||||
* **log**: Add message log retrieval functionality and update related typings ([1c0ecae](https://github.com/perfect-panel/ppanel-web/commit/1c0ecae))
|
|
||||||
* **profile**: Update localization strings and enhance third-party account binding ([2d1effb](https://github.com/perfect-panel/ppanel-web/commit/2d1effb))
|
|
||||||
* **release**: Extend supported platforms for Docker images, closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([e3a31eb](https://github.com/perfect-panel/ppanel-web/commit/e3a31eb))
|
|
||||||
* **subscription**: Add delete user subscription functionality ([1fc3a10](https://github.com/perfect-panel/ppanel-web/commit/1fc3a10))
|
|
||||||
* **ui**: Update input components and enhance card minimum width for better layout ([8a02310](https://github.com/perfect-panel/ppanel-web/commit/8a02310))
|
|
||||||
* **user**: Add user Detail ([3a3d223](https://github.com/perfect-panel/ppanel-web/commit/3a3d223))
|
|
||||||
* **user**: Add User Detail ([fdaf11b](https://github.com/perfect-panel/ppanel-web/commit/fdaf11b))
|
|
||||||
|
|
||||||
|
|
||||||
### 🐛 Bug Fixes
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
* **auth-control**: Fix citation error for platform values ([c940f3c](https://github.com/perfect-panel/ppanel-web/commit/c940f3c))
|
* **dashboard**: Display subscription creation date in user dashboard ([d0e6df0](https://github.com/perfect-panel/ppanel-web/commit/d0e6df0))
|
||||||
* **auth-control**: Fix citation error for platform values ([28813d2](https://github.com/perfect-panel/ppanel-web/commit/28813d2))
|
* **request**: Add error code 40005 to trigger logout ([71bf002](https://github.com/perfect-panel/ppanel-web/commit/71bf002))
|
||||||
* **auth-control**: Rename phone_variable to phone_number in mobile verification configuration ([e5455aa](https://github.com/perfect-panel/ppanel-web/commit/e5455aa))
|
* **subscribe**: Update payment return URL ([2b80496](https://github.com/perfect-panel/ppanel-web/commit/2b80496))
|
||||||
* **auth**: Update authentication configuration and localization strings ([47f2c58](https://github.com/perfect-panel/ppanel-web/commit/47f2c58))
|
|
||||||
* **locales**: Update expiration time description from minutes to seconds in multiple languages ([5bac933](https://github.com/perfect-panel/ppanel-web/commit/5bac933))
|
|
||||||
* **notify**: Ensure user info is updated after notification settings submission ([9bc3a94](https://github.com/perfect-panel/ppanel-web/commit/9bc3a94))
|
|
||||||
* **notify**: Set default values for notification settings to false ([3652819](https://github.com/perfect-panel/ppanel-web/commit/3652819))
|
|
||||||
* **third-party-accounts**: Remove mobile display logic from third-party accounts component ([b4946f7](https://github.com/perfect-panel/ppanel-web/commit/b4946f7))
|
|
||||||
* **third-party-accounts**: Update redirect property name in binding response handling ([012e83a](https://github.com/perfect-panel/ppanel-web/commit/012e83a))
|
|
||||||
* **user**: Refactor user form validation and reset password fields ([6733fc2](https://github.com/perfect-panel/ppanel-web/commit/6733fc2))
|
|
||||||
* **user**: Update locales ([4e7d249](https://github.com/perfect-panel/ppanel-web/commit/4e7d249))
|
|
||||||
* **user**: Update notification and verify code settings ([574b043](https://github.com/perfect-panel/ppanel-web/commit/574b043))
|
|
||||||
|
|
||||||
|
# [1.0.0-beta.24](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.23...v1.0.0-beta.24) (2025-02-27)
|
||||||
|
|
||||||
|
|
||||||
|
### ♻ Code Refactoring
|
||||||
|
|
||||||
|
* **ui**: Optimize document display ([2ca2992](https://github.com/perfect-panel/ppanel-web/commit/2ca2992))
|
||||||
|
* Reduce code complexity and improve readability ([e11f18c](https://github.com/perfect-panel/ppanel-web/commit/e11f18c))
|
||||||
|
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
* **loading**: Add loading components and integrate them in Providers ([d5847fa](https://github.com/perfect-panel/ppanel-web/commit/d5847fa))
|
||||||
|
|
||||||
|
|
||||||
|
### 🎫 Chores
|
||||||
|
|
||||||
|
* **merge**: Add advertising module and device settings ([0130e02](https://github.com/perfect-panel/ppanel-web/commit/0130e02))
|
||||||
|
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
* **locales**: Order recharge related fields ([35210fe](https://github.com/perfect-panel/ppanel-web/commit/35210fe))
|
||||||
|
|
||||||
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
# [1.0.0-beta.23](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.22...v1.0.0-beta.23) (2025-02-24)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth**: Update email verification logic to use domain suffix check ([62662bb](https://github.com/perfect-panel/ppanel-web/commit/62662bb))
|
||||||
|
|
||||||
|
# [1.0.0-beta.22](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.21...v1.0.0-beta.22) (2025-02-23)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **locales**: Removed language file import to clean up unnecessary language support ([68f6ab2](https://github.com/perfect-panel/ppanel-web/commit/68f6ab2))
|
||||||
|
|
||||||
|
# [1.0.0-beta.21](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.20...v1.0.0-beta.21) (2025-02-23)
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
- **privacy-policy**: Add privacy policy related text and links ([baa68f0](https://github.com/perfect-panel/ppanel-web/commit/baa68f0))
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **locales**: Removed multilingual files to clean up unnecessary language support ([5b151cd](https://github.com/perfect-panel/ppanel-web/commit/5b151cd))
|
||||||
|
- **locales**: Update custom HTML description in language file, ([87381da](https://github.com/perfect-panel/ppanel-web/commit/87381da))
|
||||||
|
- **table**: Update privacy policy tab translation key and remove unnecessary requestType from OAuth callback ([14b3af5](https://github.com/perfect-panel/ppanel-web/commit/14b3af5))
|
||||||
|
|
||||||
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
# [1.0.0-beta.20](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.19...v1.0.0-beta.20) (2025-02-23)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth**: Add error handling to form submission and reset Turnstile on failure ([715d011](https://github.com/perfect-panel/ppanel-web/commit/715d011))
|
||||||
|
- **subscribe**: Update subscription domain placeholder to include examples; improve site name retrieval in global store ([c65a44c](https://github.com/perfect-panel/ppanel-web/commit/c65a44c))
|
||||||
|
|
||||||
|
# [1.0.0-beta.19](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.18...v1.0.0-beta.19) (2025-02-23)
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
- **form**: Make version field optional and set default value; update site domain placeholder for clarity ([42ba9e8](https://github.com/perfect-panel/ppanel-web/commit/42ba9e8))
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth**: Refactor forms to use Turnstile ref for reset functionality ([320a7dc](https://github.com/perfect-panel/ppanel-web/commit/320a7dc))
|
||||||
|
|
||||||
|
# [1.0.0-beta.18](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.17...v1.0.0-beta.18) (2025-02-22)
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
- **platform**: Update platform naming and add keywords and custom HTML fields ([6384237](https://github.com/perfect-panel/ppanel-web/commit/6384237))
|
||||||
|
- **site**: Added localization support for custom HTML and keyword fields ([f9d7736](https://github.com/perfect-panel/ppanel-web/commit/f9d7736))
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **locales**: Update custom HTML description for clarity across multiple languages ([557c5cd](https://github.com/perfect-panel/ppanel-web/commit/557c5cd))
|
||||||
|
|
||||||
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
# [1.0.0-beta.17](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.16...v1.0.0-beta.17) (2025-02-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth**: Refactor reset password form to simplify code input and update placeholder text ([23833b4](https://github.com/perfect-panel/ppanel-web/commit/23833b4))
|
||||||
|
|
||||||
|
# [1.0.0-beta.16](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.15...v1.0.0-beta.16) (2025-02-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth**: Simplify email verification code input rendering ([6f7bc37](https://github.com/perfect-panel/ppanel-web/commit/6f7bc37))
|
||||||
|
|
||||||
|
# [1.0.0-beta.15](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.14...v1.0.0-beta.15) (2025-02-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **profile**: Restore filter to ensure only valid OAuth accounts are shown ([315c8f9](https://github.com/perfect-panel/ppanel-web/commit/315c8f9))
|
||||||
|
|
||||||
|
# [1.0.0-beta.14](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.13...v1.0.0-beta.14) (2025-02-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **locales**: Fixed description in multilingual files, updated text related to email registration functionality ([c356bc2](https://github.com/perfect-panel/ppanel-web/commit/c356bc2))
|
||||||
|
|
||||||
|
# [1.0.0-beta.13](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.12...v1.0.0-beta.13) (2025-02-21)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **api**: Fix type error in API request and add return URL parameter ([ee286dd](https://github.com/perfect-panel/ppanel-web/commit/ee286dd))
|
||||||
|
|
||||||
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
# [1.0.0-beta.12](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.11...v1.0.0-beta.12) (2025-02-18)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- More bugs ([2d88a3a](https://github.com/perfect-panel/ppanel-web/commit/2d88a3a))
|
||||||
|
|
||||||
|
# [1.0.0-beta.11](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.10...v1.0.0-beta.11) (2025-02-16)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **email**: Update platform configuration handling to use current ref for consistency ([c90175b](https://github.com/perfect-panel/ppanel-web/commit/c90175b))
|
||||||
|
|
||||||
|
# [1.0.0-beta.10](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.9...v1.0.0-beta.10) (2025-02-16)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **subscribe**: Update forms to include refetch functionality and improve toast messages ([fc55e95](https://github.com/perfect-panel/ppanel-web/commit/fc55e95))
|
||||||
|
|
||||||
|
# [1.0.0-beta.9](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.8...v1.0.0-beta.9) (2025-02-15)
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **register**: Adjust user email verification logic to handle domain suffix checks correctly ([686aa2d](https://github.com/perfect-panel/ppanel-web/commit/686aa2d))
|
||||||
|
|
||||||
|
# [1.0.0-beta.8](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.7...v1.0.0-beta.8) (2025-02-15)
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
- **accounts**: Update third-party account binding and unbinding ([1841552](https://github.com/perfect-panel/ppanel-web/commit/1841552))
|
||||||
|
- **auth-control**: Adding phone number labels to mobile verification configurations in multiple languages ([046740f](https://github.com/perfect-panel/ppanel-web/commit/046740f))
|
||||||
|
- **auth-control**: Update general ([3883646](https://github.com/perfect-panel/ppanel-web/commit/3883646))
|
||||||
|
- **auth**: Add type parameter to SendCode and update related API typings ([4198871](https://github.com/perfect-panel/ppanel-web/commit/4198871))
|
||||||
|
- **auth**: Refactor mobile authentication config to support whitelist functionality ([c761ec7](https://github.com/perfect-panel/ppanel-web/commit/c761ec7))
|
||||||
|
- **device**: Modify IMEI to device identifier support ([e3f9ef6](https://github.com/perfect-panel/ppanel-web/commit/e3f9ef6))
|
||||||
|
- **imei**: Add IMEI related internationalization support and menu items ([13c3337](https://github.com/perfect-panel/ppanel-web/commit/13c3337))
|
||||||
|
- **locales**: Add kick offline confirmation and success messages in multiple languages ([5db5343](https://github.com/perfect-panel/ppanel-web/commit/5db5343))
|
||||||
|
- **locales**: Update 'sms' to 'mobile' in authentication methods across multiple languages ([fea2171](https://github.com/perfect-panel/ppanel-web/commit/fea2171))
|
||||||
|
- **log**: Add message log retrieval functionality and update related typings ([1c0ecae](https://github.com/perfect-panel/ppanel-web/commit/1c0ecae))
|
||||||
|
- **profile**: Update localization strings and enhance third-party account binding ([2d1effb](https://github.com/perfect-panel/ppanel-web/commit/2d1effb))
|
||||||
|
- **release**: Extend supported platforms for Docker images, closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([e3a31eb](https://github.com/perfect-panel/ppanel-web/commit/e3a31eb))
|
||||||
|
- **subscription**: Add delete user subscription functionality ([1fc3a10](https://github.com/perfect-panel/ppanel-web/commit/1fc3a10))
|
||||||
|
- **ui**: Update input components and enhance card minimum width for better layout ([8a02310](https://github.com/perfect-panel/ppanel-web/commit/8a02310))
|
||||||
|
- **user**: Add user Detail ([3a3d223](https://github.com/perfect-panel/ppanel-web/commit/3a3d223))
|
||||||
|
- **user**: Add User Detail ([fdaf11b](https://github.com/perfect-panel/ppanel-web/commit/fdaf11b))
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **auth-control**: Fix citation error for platform values ([c940f3c](https://github.com/perfect-panel/ppanel-web/commit/c940f3c))
|
||||||
|
- **auth-control**: Fix citation error for platform values ([28813d2](https://github.com/perfect-panel/ppanel-web/commit/28813d2))
|
||||||
|
- **auth-control**: Rename phone_variable to phone_number in mobile verification configuration ([e5455aa](https://github.com/perfect-panel/ppanel-web/commit/e5455aa))
|
||||||
|
- **auth**: Update authentication configuration and localization strings ([47f2c58](https://github.com/perfect-panel/ppanel-web/commit/47f2c58))
|
||||||
|
- **locales**: Update expiration time description from minutes to seconds in multiple languages ([5bac933](https://github.com/perfect-panel/ppanel-web/commit/5bac933))
|
||||||
|
- **notify**: Ensure user info is updated after notification settings submission ([9bc3a94](https://github.com/perfect-panel/ppanel-web/commit/9bc3a94))
|
||||||
|
- **notify**: Set default values for notification settings to false ([3652819](https://github.com/perfect-panel/ppanel-web/commit/3652819))
|
||||||
|
- **third-party-accounts**: Remove mobile display logic from third-party accounts component ([b4946f7](https://github.com/perfect-panel/ppanel-web/commit/b4946f7))
|
||||||
|
- **third-party-accounts**: Update redirect property name in binding response handling ([012e83a](https://github.com/perfect-panel/ppanel-web/commit/012e83a))
|
||||||
|
- **user**: Refactor user form validation and reset password fields ([6733fc2](https://github.com/perfect-panel/ppanel-web/commit/6733fc2))
|
||||||
|
- **user**: Update locales ([4e7d249](https://github.com/perfect-panel/ppanel-web/commit/4e7d249))
|
||||||
|
- **user**: Update notification and verify code settings ([574b043](https://github.com/perfect-panel/ppanel-web/commit/574b043))
|
||||||
|
|
||||||
### 💄 Styles
|
### 💄 Styles
|
||||||
|
|
||||||
* **dashboard**: Enhance card components with full height and improved empty state handling ([7e1d551](https://github.com/perfect-panel/ppanel-web/commit/7e1d551))
|
- **dashboard**: Enhance card components with full height and improved empty state handling ([7e1d551](https://github.com/perfect-panel/ppanel-web/commit/7e1d551))
|
||||||
|
|
||||||
<a name="readme-top"></a>
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import { Form, FormControl, FormField, FormItem, FormMessage } from '@workspace/
|
|||||||
import { Input } from '@workspace/ui/components/input';
|
import { Input } from '@workspace/ui/components/input';
|
||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Dispatch, SetStateAction } from 'react';
|
import { Dispatch, SetStateAction, useRef } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import CloudFlareTurnstile from '../turnstile';
|
import CloudFlareTurnstile, { TurnstileRef } from '../turnstile';
|
||||||
|
|
||||||
export default function LoginForm({
|
export default function LoginForm({
|
||||||
loading,
|
loading,
|
||||||
@@ -38,10 +38,19 @@ export default function LoginForm({
|
|||||||
defaultValues: initialValues,
|
defaultValues: initialValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
turnstile.current?.reset();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
<form onSubmit={form.handleSubmit(onSubmit)} className='grid gap-6'>
|
<form onSubmit={handleSubmit} className='grid gap-6'>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='email'
|
name='email'
|
||||||
@@ -73,7 +82,7 @@ export default function LoginForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<CloudFlareTurnstile id='login' {...field} />
|
<CloudFlareTurnstile id='login' {...field} ref={turnstile} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ import { Input } from '@workspace/ui/components/input';
|
|||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { Markdown } from '@workspace/ui/custom-components/markdown';
|
import { Markdown } from '@workspace/ui/custom-components/markdown';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Dispatch, SetStateAction } from 'react';
|
import { Dispatch, SetStateAction, useRef } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import SendCode from '../send-code';
|
import SendCode from '../send-code';
|
||||||
import CloudFlareTurnstile from '../turnstile';
|
import CloudFlareTurnstile, { TurnstileRef } from '../turnstile';
|
||||||
|
|
||||||
export default function RegisterForm({
|
export default function RegisterForm({
|
||||||
loading,
|
loading,
|
||||||
@@ -31,11 +31,10 @@ export default function RegisterForm({
|
|||||||
|
|
||||||
const handleCheckUser = async (email: string) => {
|
const handleCheckUser = async (email: string) => {
|
||||||
try {
|
try {
|
||||||
|
if (!auth.email.enable_domain_suffix) return true;
|
||||||
const domain = email.split('@')[1];
|
const domain = email.split('@')[1];
|
||||||
const isValid =
|
const isValid = auth.email?.domain_suffix_list.split('\n').includes(domain || '');
|
||||||
!auth.email.enable_verify ||
|
return isValid;
|
||||||
auth.email?.domain_suffix_list.split('\n').includes(domain || '');
|
|
||||||
return !isValid;
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log('Error checking user:', error);
|
console.log('Error checking user:', error);
|
||||||
return false;
|
return false;
|
||||||
@@ -53,7 +52,7 @@ export default function RegisterForm({
|
|||||||
password: z.string(),
|
password: z.string(),
|
||||||
repeat_password: z.string(),
|
repeat_password: z.string(),
|
||||||
code: auth.email.enable_verify ? z.string() : z.string().nullish(),
|
code: auth.email.enable_verify ? z.string() : z.string().nullish(),
|
||||||
invite: invite.forced_invite ? z.string() : z.string().nullish(),
|
invite: invite.forced_invite ? z.string().min(1) : z.string().nullish(),
|
||||||
cf_token:
|
cf_token:
|
||||||
verify.enable_register_verify && verify.turnstile_site_key
|
verify.enable_register_verify && verify.turnstile_site_key
|
||||||
? z.string()
|
? z.string()
|
||||||
@@ -77,13 +76,22 @@ export default function RegisterForm({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
turnstile.current?.reset();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{auth.register.stop_register ? (
|
{auth.register.stop_register ? (
|
||||||
<Markdown>{t('message')}</Markdown>
|
<Markdown>{t('message')}</Markdown>
|
||||||
) : (
|
) : (
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
<form onSubmit={form.handleSubmit(onSubmit)} className='grid gap-6'>
|
<form onSubmit={handleSubmit} className='grid gap-6'>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='email'
|
name='email'
|
||||||
@@ -114,7 +122,12 @@ export default function RegisterForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<Input placeholder='Enter password again...' type='password' {...field} />
|
<Input
|
||||||
|
disabled={loading}
|
||||||
|
placeholder='Enter password again...'
|
||||||
|
type='password'
|
||||||
|
{...field}
|
||||||
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
@@ -129,6 +142,7 @@ export default function RegisterForm({
|
|||||||
<FormControl>
|
<FormControl>
|
||||||
<div className='flex items-center gap-2'>
|
<div className='flex items-center gap-2'>
|
||||||
<Input
|
<Input
|
||||||
|
disabled={loading}
|
||||||
placeholder='Enter code...'
|
placeholder='Enter code...'
|
||||||
type='text'
|
type='text'
|
||||||
{...field}
|
{...field}
|
||||||
@@ -172,7 +186,7 @@ export default function RegisterForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<CloudFlareTurnstile id='register' {...field} />
|
<CloudFlareTurnstile id='register' {...field} ref={turnstile} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ import { Form, FormControl, FormField, FormItem, FormMessage } from '@workspace/
|
|||||||
import { Input } from '@workspace/ui/components/input';
|
import { Input } from '@workspace/ui/components/input';
|
||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Dispatch, SetStateAction } from 'react';
|
import { Dispatch, SetStateAction, useRef } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
import SendCode from '../send-code';
|
import SendCode from '../send-code';
|
||||||
import CloudFlareTurnstile from '../turnstile';
|
import CloudFlareTurnstile, { TurnstileRef } from '../turnstile';
|
||||||
|
|
||||||
export default function ResetForm({
|
export default function ResetForm({
|
||||||
loading,
|
loading,
|
||||||
@@ -43,10 +43,19 @@ export default function ResetForm({
|
|||||||
defaultValues: initialValues,
|
defaultValues: initialValues,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const turnstile = useRef<TurnstileRef>(null);
|
||||||
|
const handleSubmit = form.handleSubmit((data) => {
|
||||||
|
try {
|
||||||
|
onSubmit(data);
|
||||||
|
} catch (error) {
|
||||||
|
turnstile.current?.reset();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
<form onSubmit={form.handleSubmit(onSubmit)} className='grid gap-6'>
|
<form onSubmit={handleSubmit} className='grid gap-6'>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='email'
|
name='email'
|
||||||
@@ -61,45 +70,43 @@ export default function ResetForm({
|
|||||||
/>
|
/>
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
name='password'
|
name='code'
|
||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<Input placeholder='Enter your password...' type='password' {...field} />
|
<div className='flex items-center gap-2'>
|
||||||
|
<Input
|
||||||
|
disabled={loading}
|
||||||
|
placeholder='Enter code...'
|
||||||
|
type='text'
|
||||||
|
{...field}
|
||||||
|
value={field.value as string}
|
||||||
|
/>
|
||||||
|
<SendCode
|
||||||
|
type='email'
|
||||||
|
params={{
|
||||||
|
...form.getValues(),
|
||||||
|
type: 2,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='password'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormControl>
|
||||||
|
<Input placeholder='Enter your new password...' type='password' {...field} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{auth?.email?.enable_verify && (
|
|
||||||
<FormField
|
|
||||||
control={form.control}
|
|
||||||
name='code'
|
|
||||||
render={({ field }) => (
|
|
||||||
<FormItem>
|
|
||||||
<FormControl>
|
|
||||||
<div className='flex items-center gap-2'>
|
|
||||||
<Input
|
|
||||||
placeholder='Enter code...'
|
|
||||||
type='text'
|
|
||||||
{...field}
|
|
||||||
value={field.value as string}
|
|
||||||
/>
|
|
||||||
<SendCode
|
|
||||||
type='email'
|
|
||||||
params={{
|
|
||||||
...form.getValues(),
|
|
||||||
type: 2,
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</FormControl>
|
|
||||||
<FormMessage />
|
|
||||||
</FormItem>
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{verify.enable_reset_password_verify && (
|
{verify.enable_reset_password_verify && (
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
@@ -107,7 +114,7 @@ export default function ResetForm({
|
|||||||
render={({ field }) => (
|
render={({ field }) => (
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<CloudFlareTurnstile id='reset' {...field} />
|
<CloudFlareTurnstile id='reset' {...field} ref={turnstile} />
|
||||||
</FormControl>
|
</FormControl>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
|||||||
@@ -1,26 +1,38 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import useGlobalStore from '@/config/use-global';
|
|
||||||
import { useLocale } from 'next-intl';
|
import { useLocale } from 'next-intl';
|
||||||
import { useTheme } from 'next-themes';
|
import { useTheme } from 'next-themes';
|
||||||
import { useEffect } from 'react';
|
import { forwardRef, useEffect, useImperativeHandle } from 'react';
|
||||||
import Turnstile, { useTurnstile } from 'react-turnstile';
|
import Turnstile, { useTurnstile } from 'react-turnstile';
|
||||||
|
|
||||||
export default function CloudFlareTurnstile({
|
import useGlobalStore from '@/config/use-global';
|
||||||
id,
|
|
||||||
value,
|
export type TurnstileRef = {
|
||||||
onChange,
|
reset: () => void;
|
||||||
}: {
|
};
|
||||||
id?: string;
|
|
||||||
value?: null | string;
|
const CloudFlareTurnstile = forwardRef<
|
||||||
onChange: (value?: string) => void;
|
TurnstileRef,
|
||||||
}) {
|
{
|
||||||
|
id?: string;
|
||||||
|
value?: null | string;
|
||||||
|
onChange: (value?: string) => void;
|
||||||
|
}
|
||||||
|
>(function CloudFlareTurnstile({ id, value, onChange }, ref) {
|
||||||
const { common } = useGlobalStore();
|
const { common } = useGlobalStore();
|
||||||
const { verify } = common;
|
const { verify } = common;
|
||||||
const { resolvedTheme } = useTheme();
|
const { resolvedTheme } = useTheme();
|
||||||
const locale = useLocale();
|
const locale = useLocale();
|
||||||
const turnstile = useTurnstile();
|
const turnstile = useTurnstile();
|
||||||
|
|
||||||
|
useImperativeHandle(
|
||||||
|
ref,
|
||||||
|
() => ({
|
||||||
|
reset: () => turnstile.reset(),
|
||||||
|
}),
|
||||||
|
[turnstile],
|
||||||
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (value === '') {
|
if (value === '') {
|
||||||
turnstile.reset();
|
turnstile.reset();
|
||||||
@@ -51,4 +63,6 @@ export default function CloudFlareTurnstile({
|
|||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
});
|
||||||
|
|
||||||
|
export default CloudFlareTurnstile;
|
||||||
|
|||||||
@@ -0,0 +1,299 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { zodResolver } from '@hookform/resolvers/zod';
|
||||||
|
import { Button } from '@workspace/ui/components/button';
|
||||||
|
import {
|
||||||
|
Form,
|
||||||
|
FormControl,
|
||||||
|
FormField,
|
||||||
|
FormItem,
|
||||||
|
FormLabel,
|
||||||
|
FormMessage,
|
||||||
|
} from '@workspace/ui/components/form';
|
||||||
|
import { RadioGroup, RadioGroupItem } from '@workspace/ui/components/radio-group';
|
||||||
|
import { ScrollArea } from '@workspace/ui/components/scroll-area';
|
||||||
|
import {
|
||||||
|
Sheet,
|
||||||
|
SheetContent,
|
||||||
|
SheetFooter,
|
||||||
|
SheetHeader,
|
||||||
|
SheetTitle,
|
||||||
|
SheetTrigger,
|
||||||
|
} from '@workspace/ui/components/sheet';
|
||||||
|
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
||||||
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
|
import { useTranslations } from 'next-intl';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import { useForm } from 'react-hook-form';
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
const formSchema = z.object({
|
||||||
|
title: z.string(),
|
||||||
|
type: z.enum(['image', 'video']),
|
||||||
|
content: z.string(),
|
||||||
|
description: z.string(),
|
||||||
|
target_url: z.string().url(),
|
||||||
|
start_time: z.number(),
|
||||||
|
end_time: z.number(),
|
||||||
|
});
|
||||||
|
|
||||||
|
interface AdsFormProps<T> {
|
||||||
|
onSubmit: (data: T) => Promise<boolean> | boolean;
|
||||||
|
initialValues?: T;
|
||||||
|
loading?: boolean;
|
||||||
|
trigger: string;
|
||||||
|
title: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function AdsForm<T extends Record<string, any>>({
|
||||||
|
onSubmit,
|
||||||
|
initialValues,
|
||||||
|
loading,
|
||||||
|
trigger,
|
||||||
|
title,
|
||||||
|
}: AdsFormProps<T>) {
|
||||||
|
const t = useTranslations('ads');
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
|
||||||
|
const form = useForm({
|
||||||
|
resolver: zodResolver(formSchema),
|
||||||
|
defaultValues: {
|
||||||
|
...initialValues,
|
||||||
|
} as any,
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
form?.reset(initialValues);
|
||||||
|
}, [form, initialValues]);
|
||||||
|
|
||||||
|
const type = form.watch('type');
|
||||||
|
const startTime = form.watch('start_time');
|
||||||
|
|
||||||
|
const renderContentField = () => {
|
||||||
|
return (
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='content'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('form.content')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<EnhancedInput
|
||||||
|
placeholder={
|
||||||
|
type === 'image'
|
||||||
|
? 'https://example.com/image.jpg'
|
||||||
|
: 'https://example.com/video.mp4'
|
||||||
|
}
|
||||||
|
value={field.value}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
form.setValue('content', value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function handleSubmit(data: { [x: string]: any }) {
|
||||||
|
const bool = await onSubmit(data as T);
|
||||||
|
if (bool) setOpen(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Sheet open={open} onOpenChange={setOpen}>
|
||||||
|
<SheetTrigger asChild>
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
form.reset();
|
||||||
|
setOpen(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{trigger}
|
||||||
|
</Button>
|
||||||
|
</SheetTrigger>
|
||||||
|
<SheetContent className='w-[500px] max-w-full md:max-w-screen-md'>
|
||||||
|
<SheetHeader>
|
||||||
|
<SheetTitle>{title}</SheetTitle>
|
||||||
|
</SheetHeader>
|
||||||
|
<ScrollArea className='-mx-6 h-[calc(100vh-48px-36px-36px-env(safe-area-inset-top))]'>
|
||||||
|
<Form {...form}>
|
||||||
|
<form onSubmit={form.handleSubmit(handleSubmit)} className='space-y-4 px-6 pt-4'>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='title'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('form.title')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<EnhancedInput
|
||||||
|
placeholder={t('form.enterTitle')}
|
||||||
|
value={field.value}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
form.setValue(field.name, value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='type'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('form.type')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<RadioGroup
|
||||||
|
defaultValue={field.value}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
form.setValue(field.name, value);
|
||||||
|
}}
|
||||||
|
className='flex gap-4'
|
||||||
|
>
|
||||||
|
<FormItem className='flex items-center space-x-3 space-y-0'>
|
||||||
|
<FormControl>
|
||||||
|
<RadioGroupItem value='image' />
|
||||||
|
</FormControl>
|
||||||
|
<FormLabel className='font-normal'>{t('form.typeImage')}</FormLabel>
|
||||||
|
</FormItem>
|
||||||
|
<FormItem className='flex items-center space-x-3 space-y-0'>
|
||||||
|
<FormControl>
|
||||||
|
<RadioGroupItem value='video' />
|
||||||
|
</FormControl>
|
||||||
|
<FormLabel className='font-normal'>{t('form.typeVideo')}</FormLabel>
|
||||||
|
</FormItem>
|
||||||
|
</RadioGroup>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{renderContentField()}
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='description'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('form.description')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<EnhancedInput
|
||||||
|
placeholder={t('form.enterDescription')}
|
||||||
|
value={field.value}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
form.setValue(field.name, value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='target_url'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('form.targetUrl')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<EnhancedInput
|
||||||
|
placeholder={t('form.enterTargetUrl')}
|
||||||
|
value={field.value}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
form.setValue(field.name, value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='start_time'
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('form.startTime')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<EnhancedInput
|
||||||
|
type='datetime-local'
|
||||||
|
placeholder={t('form.enterStartTime')}
|
||||||
|
value={field.value ? new Date(field.value).toISOString().slice(0, 16) : ''}
|
||||||
|
min={Number(new Date().toISOString().slice(0, 16))}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
const timestamp = value ? new Date(value).getTime() : 0;
|
||||||
|
form.setValue(field.name, timestamp);
|
||||||
|
const endTime = form.getValues('end_time');
|
||||||
|
if (endTime && timestamp > endTime) {
|
||||||
|
form.setValue('end_time', '');
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name='end_time'
|
||||||
|
render={({ field }) => {
|
||||||
|
return (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>{t('form.endTime')}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<EnhancedInput
|
||||||
|
type='datetime-local'
|
||||||
|
placeholder={t('form.enterEndTime')}
|
||||||
|
value={
|
||||||
|
field.value ? new Date(field.value).toISOString().slice(0, 16) : ''
|
||||||
|
}
|
||||||
|
min={Number(
|
||||||
|
startTime
|
||||||
|
? new Date(startTime).toISOString().slice(0, 16)
|
||||||
|
: new Date().toISOString().slice(0, 16),
|
||||||
|
)}
|
||||||
|
disabled={!startTime}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
const timestamp = value ? new Date(value).getTime() : 0;
|
||||||
|
if (!startTime || timestamp < startTime) return;
|
||||||
|
form.setValue(field.name, timestamp);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</form>
|
||||||
|
</Form>
|
||||||
|
</ScrollArea>
|
||||||
|
<SheetFooter className='flex-row justify-end gap-2 pt-3'>
|
||||||
|
<Button
|
||||||
|
variant='outline'
|
||||||
|
disabled={loading}
|
||||||
|
onClick={() => {
|
||||||
|
setOpen(false);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{t('form.cancel')}
|
||||||
|
</Button>
|
||||||
|
<Button disabled={loading} onClick={form.handleSubmit(handleSubmit)}>
|
||||||
|
{loading && <Icon icon='mdi:loading' className='mr-2 animate-spin' />}
|
||||||
|
{t('form.confirm')}
|
||||||
|
</Button>
|
||||||
|
</SheetFooter>
|
||||||
|
</SheetContent>
|
||||||
|
</Sheet>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { ProTable, ProTableActions } from '@/components/pro-table';
|
||||||
|
import { createAds, deleteAds, getAdsList, updateAds } from '@/services/admin/ads';
|
||||||
|
import { Badge } from '@workspace/ui/components/badge';
|
||||||
|
import { Button } from '@workspace/ui/components/button';
|
||||||
|
import { Switch } from '@workspace/ui/components/switch';
|
||||||
|
import { ConfirmButton } from '@workspace/ui/custom-components/confirm-button';
|
||||||
|
import { formatDate } from '@workspace/ui/utils';
|
||||||
|
import { useTranslations } from 'next-intl';
|
||||||
|
import { useRef, useState } from 'react';
|
||||||
|
import { toast } from 'sonner';
|
||||||
|
import AdsForm from './ads-form';
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
const t = useTranslations('ads');
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
const ref = useRef<ProTableActions>(null);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ProTable<API.Ads, Record<string, unknown>>
|
||||||
|
action={ref}
|
||||||
|
header={{
|
||||||
|
toolbar: (
|
||||||
|
<AdsForm<API.CreateAdsRequest>
|
||||||
|
trigger={t('create')}
|
||||||
|
title={t('createAds')}
|
||||||
|
loading={loading}
|
||||||
|
onSubmit={async (values) => {
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
await createAds({
|
||||||
|
...values,
|
||||||
|
status: 0,
|
||||||
|
});
|
||||||
|
toast.success(t('createSuccess'));
|
||||||
|
ref.current?.refresh();
|
||||||
|
setLoading(false);
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
setLoading(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
params={[
|
||||||
|
{
|
||||||
|
key: 'search',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'status',
|
||||||
|
placeholder: t('status'),
|
||||||
|
options: [
|
||||||
|
{ label: t('enabled'), value: '1' },
|
||||||
|
{ label: t('disabled'), value: '0' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
request={async (pagination, filters) => {
|
||||||
|
const { data } = await getAdsList({
|
||||||
|
...pagination,
|
||||||
|
...filters,
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
list: data.data?.list || [],
|
||||||
|
total: data.data?.total || 0,
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
accessorKey: 'status',
|
||||||
|
header: t('status'),
|
||||||
|
cell: ({ row }) => {
|
||||||
|
return (
|
||||||
|
<Switch
|
||||||
|
defaultChecked={row.getValue('status') === 1}
|
||||||
|
onCheckedChange={async (checked) => {
|
||||||
|
await updateAds({
|
||||||
|
...row.original,
|
||||||
|
status: checked ? 1 : 0,
|
||||||
|
});
|
||||||
|
ref.current?.refresh();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'title',
|
||||||
|
header: t('title'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'type',
|
||||||
|
header: t('type'),
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const type = row.original.type;
|
||||||
|
return <Badge>{type}</Badge>;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'target_url',
|
||||||
|
header: t('targetUrl'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'description',
|
||||||
|
header: t('form.description'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'period',
|
||||||
|
header: t('validityPeriod'),
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const { start_time, end_time } = row.original;
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{formatDate(start_time)} - {formatDate(end_time)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
actions={{
|
||||||
|
render: (row) => [
|
||||||
|
<AdsForm<API.UpdateAdsRequest>
|
||||||
|
key='edit'
|
||||||
|
trigger={t('edit')}
|
||||||
|
title={t('editAds')}
|
||||||
|
loading={loading}
|
||||||
|
initialValues={row}
|
||||||
|
onSubmit={async (values) => {
|
||||||
|
setLoading(true);
|
||||||
|
try {
|
||||||
|
await updateAds({ ...row, ...values });
|
||||||
|
toast.success(t('updateSuccess'));
|
||||||
|
ref.current?.refresh();
|
||||||
|
setLoading(false);
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
setLoading(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>,
|
||||||
|
<ConfirmButton
|
||||||
|
key='delete'
|
||||||
|
trigger={<Button variant='destructive'>{t('delete')}</Button>}
|
||||||
|
title={t('confirmDelete')}
|
||||||
|
description={t('deleteWarning')}
|
||||||
|
onConfirm={async () => {
|
||||||
|
await deleteAds({ id: row.id });
|
||||||
|
toast.success(t('deleteSuccess'));
|
||||||
|
ref.current?.refresh();
|
||||||
|
}}
|
||||||
|
cancelText={t('cancel')}
|
||||||
|
confirmText={t('confirm')}
|
||||||
|
/>,
|
||||||
|
],
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -23,12 +23,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -5,7 +5,10 @@ import { useQuery } from '@tanstack/react-query';
|
|||||||
import { Label } from '@workspace/ui/components/label';
|
import { Label } from '@workspace/ui/components/label';
|
||||||
import { Switch } from '@workspace/ui/components/switch';
|
import { Switch } from '@workspace/ui/components/switch';
|
||||||
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
|
import { Table, TableBody, TableCell, TableRow } from '@workspace/ui/components/table';
|
||||||
|
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
||||||
|
import { DicesIcon } from 'lucide-react';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
|
import { uid } from 'radash';
|
||||||
import { toast } from 'sonner';
|
import { toast } from 'sonner';
|
||||||
|
|
||||||
export default function Page() {
|
export default function Page() {
|
||||||
@@ -21,12 +24,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -49,6 +52,89 @@ export default function Page() {
|
|||||||
/>
|
/>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell>
|
||||||
|
<Label>{t('showAds')}</Label>
|
||||||
|
<p className='text-muted-foreground text-xs'>{t('showAdsDescription')}</p>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell className='text-right'>
|
||||||
|
<Switch
|
||||||
|
checked={data?.config?.show_ads}
|
||||||
|
onCheckedChange={(checked) => {
|
||||||
|
updateConfig('config', {
|
||||||
|
...data?.config,
|
||||||
|
show_ads: checked,
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell>
|
||||||
|
<Label>{t('blockVirtualMachine')}</Label>
|
||||||
|
<p className='text-muted-foreground text-xs'>{t('blockVirtualMachineDescription')}</p>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell className='text-right'>
|
||||||
|
<Switch
|
||||||
|
checked={data?.config?.only_real_device}
|
||||||
|
onCheckedChange={(checked) => {
|
||||||
|
updateConfig('config', {
|
||||||
|
...data?.config,
|
||||||
|
only_real_device: checked,
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell>
|
||||||
|
<Label>{t('enableSecurity')}</Label>
|
||||||
|
<p className='text-muted-foreground text-xs'>{t('enableSecurityDescription')}</p>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell className='text-right'>
|
||||||
|
<Switch
|
||||||
|
checked={data?.config?.enable_security}
|
||||||
|
onCheckedChange={(checked) => {
|
||||||
|
updateConfig('config', {
|
||||||
|
...data?.config,
|
||||||
|
enable_security: checked,
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell>
|
||||||
|
<Label>{t('communicationKey')}</Label>
|
||||||
|
<p className='text-muted-foreground text-xs'>{t('communicationKeyDescription')}</p>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell className='text-right'>
|
||||||
|
<EnhancedInput
|
||||||
|
value={data?.config?.security_secret}
|
||||||
|
onValueBlur={(value) => {
|
||||||
|
updateConfig('config', {
|
||||||
|
...data?.config,
|
||||||
|
security_secret: value,
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
suffix={
|
||||||
|
<div className='bg-muted flex h-9 items-center text-nowrap px-3'>
|
||||||
|
<DicesIcon
|
||||||
|
onClick={() => {
|
||||||
|
const id = uid(32).toLowerCase();
|
||||||
|
const formatted = `${id.slice(0, 8)}-${id.slice(8, 12)}-${id.slice(12, 16)}-${id.slice(16, 20)}-${id.slice(20)}`;
|
||||||
|
updateConfig('config', {
|
||||||
|
...data?.config,
|
||||||
|
security_secret: formatted,
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
className='cursor-pointer'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
</TableBody>
|
</TableBody>
|
||||||
</Table>
|
</Table>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ export default function Page() {
|
|||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...ref.current,
|
...ref.current,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -159,7 +159,7 @@ export default function Page() {
|
|||||||
updateConfig('config', {
|
updateConfig('config', {
|
||||||
...data?.config,
|
...data?.config,
|
||||||
platform_config: {
|
platform_config: {
|
||||||
...data?.platform_config,
|
...ref.current?.config?.platform_config,
|
||||||
port: value,
|
port: value,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -181,7 +181,7 @@ export default function Page() {
|
|||||||
updateConfig('config', {
|
updateConfig('config', {
|
||||||
...data?.config,
|
...data?.config,
|
||||||
platform_config: {
|
platform_config: {
|
||||||
...data?.platform_config,
|
...ref.current?.config?.platform_config,
|
||||||
ssl: checked,
|
ssl: checked,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -202,7 +202,7 @@ export default function Page() {
|
|||||||
updateConfig('config', {
|
updateConfig('config', {
|
||||||
...data?.config,
|
...data?.config,
|
||||||
platform_config: {
|
platform_config: {
|
||||||
...data?.platform_config,
|
...ref.current?.config?.platform_config,
|
||||||
user: value,
|
user: value,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -224,7 +224,7 @@ export default function Page() {
|
|||||||
updateConfig('config', {
|
updateConfig('config', {
|
||||||
...data?.config,
|
...data?.config,
|
||||||
platform_config: {
|
platform_config: {
|
||||||
...data?.platform_config,
|
...ref.current?.config?.platform_config,
|
||||||
pass: value,
|
pass: value,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -245,7 +245,7 @@ export default function Page() {
|
|||||||
updateConfig('config', {
|
updateConfig('config', {
|
||||||
...data?.config,
|
...data?.config,
|
||||||
platform_config: {
|
platform_config: {
|
||||||
...data?.platform_config,
|
...ref.current?.config?.platform_config,
|
||||||
from: value,
|
from: value,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ export function Verify() {
|
|||||||
<TableCell className='text-right'>
|
<TableCell className='text-right'>
|
||||||
<EnhancedInput
|
<EnhancedInput
|
||||||
placeholder={t('inputPlaceholder')}
|
placeholder={t('inputPlaceholder')}
|
||||||
defaultValue={data?.turnstile_site_key}
|
value={data?.turnstile_site_key}
|
||||||
onValueBlur={(value) => updateConfig('turnstile_site_key', value)}
|
onValueBlur={(value) => updateConfig('turnstile_site_key', value)}
|
||||||
/>
|
/>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
@@ -64,7 +64,7 @@ export function Verify() {
|
|||||||
<TableCell className='text-right'>
|
<TableCell className='text-right'>
|
||||||
<EnhancedInput
|
<EnhancedInput
|
||||||
placeholder={t('inputPlaceholder')}
|
placeholder={t('inputPlaceholder')}
|
||||||
defaultValue={data?.turnstile_secret}
|
value={data?.turnstile_secret}
|
||||||
onValueBlur={(value) => updateConfig('turnstile_secret', value)}
|
onValueBlur={(value) => updateConfig('turnstile_secret', value)}
|
||||||
/>
|
/>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ export default function Page() {
|
|||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('updateSuccess'));
|
toast.success(t('updateSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ export default function Page() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
async function updateConfig(key: keyof API.UpdataAuthMethodConfigRequest, value: unknown) {
|
async function updateConfig(key: keyof API.UpdateAuthMethodConfigRequest, value: unknown) {
|
||||||
try {
|
try {
|
||||||
await updateAuthMethodConfig({
|
await updateAuthMethodConfig({
|
||||||
...data,
|
...data,
|
||||||
[key]: value,
|
[key]: value,
|
||||||
} as API.UpdataAuthMethodConfigRequest);
|
} as API.UpdateAuthMethodConfigRequest);
|
||||||
toast.success(t('saveSuccess'));
|
toast.success(t('saveSuccess'));
|
||||||
refetch();
|
refetch();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ const defaultValues = {
|
|||||||
|
|
||||||
const versionSchema = z.object({
|
const versionSchema = z.object({
|
||||||
url: z.string(),
|
url: z.string(),
|
||||||
version: z.string(),
|
version: z.string().optional(),
|
||||||
description: z.string().optional(),
|
description: z.string().optional(),
|
||||||
is_default: z.boolean().optional(),
|
is_default: z.boolean().optional(),
|
||||||
});
|
});
|
||||||
@@ -221,6 +221,7 @@ export default function SubscribeAppForm<
|
|||||||
name: 'version',
|
name: 'version',
|
||||||
type: 'text',
|
type: 'text',
|
||||||
placeholder: t('version'),
|
placeholder: t('version'),
|
||||||
|
defaultValue: '1.0.0',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'description',
|
name: 'description',
|
||||||
@@ -251,7 +252,10 @@ export default function SubscribeAppForm<
|
|||||||
]}
|
]}
|
||||||
value={field.value}
|
value={field.value}
|
||||||
onChange={(value) => {
|
onChange={(value) => {
|
||||||
form.setValue(field.name, value);
|
form.setValue(
|
||||||
|
field.name,
|
||||||
|
value.filter((item) => item.url),
|
||||||
|
);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ export default function SubscribeConfig() {
|
|||||||
<TableCell className='text-right'>
|
<TableCell className='text-right'>
|
||||||
<Textarea
|
<Textarea
|
||||||
className='h-52'
|
className='h-52'
|
||||||
placeholder={t('subscriptionDomainPlaceholder')}
|
placeholder={`${t('subscriptionDomainPlaceholder')}\nexample.com\nwww.example.com`}
|
||||||
defaultValue={data?.subscribe_domain}
|
defaultValue={data?.subscribe_domain}
|
||||||
onBlur={(e) => {
|
onBlur={(e) => {
|
||||||
updateConfig('subscribe_domain', e.target.value);
|
updateConfig('subscribe_domain', e.target.value);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
|
||||||
import { getTranslations } from 'next-intl/server';
|
import { getTranslations } from 'next-intl/server';
|
||||||
import Currency from './currency';
|
import Currency from './currency';
|
||||||
|
import PrivacyPolicy from './privacy-policy';
|
||||||
import Site from './site';
|
import Site from './site';
|
||||||
import Tos from './tos';
|
import Tos from './tos';
|
||||||
|
|
||||||
@@ -13,6 +14,7 @@ export default async function Page() {
|
|||||||
<TabsTrigger value='site'>{t('tabs.site')}</TabsTrigger>
|
<TabsTrigger value='site'>{t('tabs.site')}</TabsTrigger>
|
||||||
<TabsTrigger value='currency'>{t('tabs.currency')}</TabsTrigger>
|
<TabsTrigger value='currency'>{t('tabs.currency')}</TabsTrigger>
|
||||||
<TabsTrigger value='tos'>{t('tabs.tos')}</TabsTrigger>
|
<TabsTrigger value='tos'>{t('tabs.tos')}</TabsTrigger>
|
||||||
|
<TabsTrigger value='privacy-policy'>{t('privacy-policy.title')}</TabsTrigger>
|
||||||
</TabsList>
|
</TabsList>
|
||||||
<TabsContent value='site'>
|
<TabsContent value='site'>
|
||||||
<Site />
|
<Site />
|
||||||
@@ -23,6 +25,9 @@ export default async function Page() {
|
|||||||
<TabsContent value='tos'>
|
<TabsContent value='tos'>
|
||||||
<Tos />
|
<Tos />
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
<TabsContent value='privacy-policy'>
|
||||||
|
<PrivacyPolicy />
|
||||||
|
</TabsContent>
|
||||||
</Tabs>
|
</Tabs>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { getPrivacyPolicyConfig, updatePrivacyPolicyConfig } from '@/services/admin/system';
|
||||||
|
import { useQuery } from '@tanstack/react-query';
|
||||||
|
import { MarkdownEditor } from '@workspace/ui/custom-components/editor';
|
||||||
|
import { useTranslations } from 'next-intl';
|
||||||
|
import { toast } from 'sonner';
|
||||||
|
|
||||||
|
export default function PrivacyPolicy() {
|
||||||
|
const t = useTranslations('system.privacy-policy');
|
||||||
|
const { data, refetch, isFetched } = useQuery({
|
||||||
|
queryKey: ['getPrivacyPolicyConfig'],
|
||||||
|
queryFn: async () => {
|
||||||
|
const { data } = await getPrivacyPolicyConfig();
|
||||||
|
return data.data;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
async function updateConfig(key: string, value: unknown) {
|
||||||
|
if (data?.[key] === value) return;
|
||||||
|
try {
|
||||||
|
await updatePrivacyPolicyConfig({
|
||||||
|
...data,
|
||||||
|
[key]: value,
|
||||||
|
} as API.PrivacyPolicyConfig);
|
||||||
|
toast.success(t('saveSuccess'));
|
||||||
|
refetch();
|
||||||
|
} catch (error) {
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
isFetched && (
|
||||||
|
<div className='h-[calc(100dvh-132px-env(safe-area-inset-top))] overflow-hidden'>
|
||||||
|
<MarkdownEditor
|
||||||
|
title={t('title')}
|
||||||
|
value={data?.privacy_policy}
|
||||||
|
onBlur={(value) => {
|
||||||
|
if (data?.privacy_policy !== value) {
|
||||||
|
updateConfig('privacy_policy', value);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -85,6 +85,35 @@ export default function Site() {
|
|||||||
/>
|
/>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell>
|
||||||
|
<Label>{t('keywords')}</Label>
|
||||||
|
<p className='text-muted-foreground text-xs'>{t('keywordsDescription')}</p>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell className='text-right'>
|
||||||
|
<EnhancedInput
|
||||||
|
placeholder={t('keywordsDescription')}
|
||||||
|
value={data?.keywords}
|
||||||
|
onValueBlur={(value) => updateConfig('keywords', value)}
|
||||||
|
/>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
<TableRow>
|
||||||
|
<TableCell className='align-top'>
|
||||||
|
<Label>{t('customHtml')}</Label>
|
||||||
|
<p className='text-muted-foreground text-xs'>{t('customHtmlDescription')}</p>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell className='text-right'>
|
||||||
|
<Textarea
|
||||||
|
className='h-52'
|
||||||
|
placeholder={t('customHtmlDescription')}
|
||||||
|
defaultValue={data?.custom_html}
|
||||||
|
onBlur={(e) => {
|
||||||
|
updateConfig('custom_html', e.target.value);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
<TableRow>
|
<TableRow>
|
||||||
<TableCell className='align-top'>
|
<TableCell className='align-top'>
|
||||||
<Label>{t('siteDomain')}</Label>
|
<Label>{t('siteDomain')}</Label>
|
||||||
@@ -93,7 +122,7 @@ export default function Site() {
|
|||||||
<TableCell className='text-right'>
|
<TableCell className='text-right'>
|
||||||
<Textarea
|
<Textarea
|
||||||
className='h-52'
|
className='h-52'
|
||||||
placeholder={t('siteDomainPlaceholder')}
|
placeholder={`${t('siteDomainPlaceholder')}\nexample.com\nwww.example.com`}
|
||||||
defaultValue={data?.host}
|
defaultValue={data?.host}
|
||||||
onBlur={(e) => {
|
onBlur={(e) => {
|
||||||
updateConfig('host', e.target.value);
|
updateConfig('host', e.target.value);
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ export function SubscriptionDetail({
|
|||||||
header: 'ID',
|
header: 'ID',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: 'imei',
|
accessorKey: 'identifier',
|
||||||
header: 'IMEI',
|
header: 'IMEI',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -182,7 +182,7 @@ export function SubscriptionDetail({
|
|||||||
}}
|
}}
|
||||||
actions={{
|
actions={{
|
||||||
render: (row) => {
|
render: (row) => {
|
||||||
if (!row.imei) return [];
|
if (!row.identifier) return [];
|
||||||
return [
|
return [
|
||||||
<ConfirmButton
|
<ConfirmButton
|
||||||
key='offline'
|
key='offline'
|
||||||
|
|||||||
@@ -11,13 +11,38 @@ import {
|
|||||||
} from '@workspace/ui/components/select';
|
} from '@workspace/ui/components/select';
|
||||||
import { Icon } from '@workspace/ui/custom-components/icon';
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { getCountry } from '@workspace/ui/utils';
|
import { getCountry } from '@workspace/ui/utils';
|
||||||
import { useLocale, useTranslations } from 'next-intl';
|
import { useLocale } from 'next-intl';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
|
const languages = {
|
||||||
|
'cs-CZ': 'Čeština',
|
||||||
|
'de-DE': 'Deutsch',
|
||||||
|
'en-US': 'English',
|
||||||
|
'es-ES': 'Español',
|
||||||
|
'es-MX': 'Español (México)',
|
||||||
|
'fa-IR': 'فارسی',
|
||||||
|
'fi-FI': 'Suomi',
|
||||||
|
'fr-FR': 'Français',
|
||||||
|
'hi-IN': 'हिन्दी',
|
||||||
|
'hu-HU': 'Magyar',
|
||||||
|
'ja-JP': '日本語',
|
||||||
|
'ko-KR': '한국어',
|
||||||
|
'no-NO': 'Norsk',
|
||||||
|
'pl-PL': 'Polski',
|
||||||
|
'pt-BR': 'Português (Brasil)',
|
||||||
|
'ro-RO': 'Română',
|
||||||
|
'ru-RU': 'Русский',
|
||||||
|
'th-TH': 'ไทย',
|
||||||
|
'tr-TR': 'Türkçe',
|
||||||
|
'uk-UA': 'Українська',
|
||||||
|
'vi-VN': 'Tiếng Việt',
|
||||||
|
'zh-CN': '简体中文',
|
||||||
|
'zh-HK': '繁體中文',
|
||||||
|
} as const;
|
||||||
|
|
||||||
export default function LanguageSwitch() {
|
export default function LanguageSwitch() {
|
||||||
const locale = useLocale();
|
const locale = useLocale();
|
||||||
const country = getCountry(locale);
|
const country = getCountry(locale);
|
||||||
const t = useTranslations('language');
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const handleLanguageChange = (value: string) => {
|
const handleLanguageChange = (value: string) => {
|
||||||
@@ -31,7 +56,7 @@ export default function LanguageSwitch() {
|
|||||||
<SelectValue>
|
<SelectValue>
|
||||||
<div className='flex items-center'>
|
<div className='flex items-center'>
|
||||||
<Icon icon={`flagpack:${country?.alpha2.toLowerCase()}`} className='!size-5' />
|
<Icon icon={`flagpack:${country?.alpha2.toLowerCase()}`} className='!size-5' />
|
||||||
<span className='sr-only'>{t(`${locale}`)}</span>
|
<span className='sr-only'>{languages[locale as keyof typeof languages]}</span>
|
||||||
</div>
|
</div>
|
||||||
</SelectValue>
|
</SelectValue>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
@@ -40,7 +65,7 @@ export default function LanguageSwitch() {
|
|||||||
<SelectItem key={`${item?.lang}-${item?.alpha2}`} value={`${item?.lang}-${item?.alpha2}`}>
|
<SelectItem key={`${item?.lang}-${item?.alpha2}`} value={`${item?.lang}-${item?.alpha2}`}>
|
||||||
<div className='flex items-center gap-2'>
|
<div className='flex items-center gap-2'>
|
||||||
<Icon icon={`flagpack:${item?.alpha2.toLowerCase()}`} className='!size-5' />
|
<Icon icon={`flagpack:${item?.alpha2.toLowerCase()}`} className='!size-5' />
|
||||||
{t(`${item?.lang}-${item?.alpha2}`)}
|
{languages[`${item?.lang}-${item?.alpha2}` as keyof typeof languages]}
|
||||||
</div>
|
</div>
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -61,6 +61,11 @@ export const navs = [
|
|||||||
icon: 'flat-color-icons:lock-portrait',
|
icon: 'flat-color-icons:lock-portrait',
|
||||||
items: AuthControl,
|
items: AuthControl,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'ADS Config',
|
||||||
|
url: '/dashboard/ads',
|
||||||
|
icon: 'flat-color-icons:electrical-sensor',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: 'Payment Config',
|
title: 'Payment Config',
|
||||||
url: '/dashboard/payment',
|
url: '/dashboard/payment',
|
||||||
@@ -115,7 +120,7 @@ export const navs = [
|
|||||||
{
|
{
|
||||||
title: 'Announcement Management',
|
title: 'Announcement Management',
|
||||||
url: '/dashboard/announcement',
|
url: '/dashboard/announcement',
|
||||||
icon: 'flat-color-icons:news',
|
icon: 'flat-color-icons:advertising',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Ticket Management',
|
title: 'Ticket Management',
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ export const useGlobalStore = create<GlobalStore>((set) => ({
|
|||||||
site_name: '',
|
site_name: '',
|
||||||
site_desc: '',
|
site_desc: '',
|
||||||
site_logo: '',
|
site_logo: '',
|
||||||
|
keywords: '',
|
||||||
|
custom_html: '',
|
||||||
},
|
},
|
||||||
verify: {
|
verify: {
|
||||||
turnstile_site_key: '',
|
turnstile_site_key: '',
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "Zrušit",
|
||||||
|
"confirm": "Potvrdit",
|
||||||
|
"confirmDelete": "Potvrdit smazání",
|
||||||
|
"create": "Vytvořit inzerát",
|
||||||
|
"createAds": "Vytvořit reklamu",
|
||||||
|
"createSuccess": "Úspěšně vytvořeno",
|
||||||
|
"delete": "Smazat",
|
||||||
|
"deleteSuccess": "Úspěšně smazáno",
|
||||||
|
"deleteWarning": "Opravdu chcete smazat tento inzerát?",
|
||||||
|
"disabled": "Deaktivováno",
|
||||||
|
"edit": "Upravit",
|
||||||
|
"editAds": "Upravit reklamu",
|
||||||
|
"enabled": "Aktivováno",
|
||||||
|
"form": {
|
||||||
|
"cancel": "Zrušit",
|
||||||
|
"confirm": "Potvrdit",
|
||||||
|
"content": "Obsah",
|
||||||
|
"description": "Popis",
|
||||||
|
"endTime": "Čas ukončení",
|
||||||
|
"enterContent": "Prosím zadejte obsah inzerátu",
|
||||||
|
"enterDescription": "Prosím zadejte popis inzerátu",
|
||||||
|
"enterEndTime": "Prosím vyberte čas ukončení",
|
||||||
|
"enterStartTime": "Prosím vyberte čas zahájení",
|
||||||
|
"enterTargetUrl": "Prosím zadejte cílovou URL",
|
||||||
|
"enterTitle": "Prosím zadejte název inzerátu",
|
||||||
|
"startTime": "Čas zahájení",
|
||||||
|
"targetUrl": "Cílová URL",
|
||||||
|
"title": "Název",
|
||||||
|
"type": "Typ inzerátu",
|
||||||
|
"typeImage": "Obrázek",
|
||||||
|
"typeVideo": "Video"
|
||||||
|
},
|
||||||
|
"status": "Stav",
|
||||||
|
"targetUrl": "Cílová URL",
|
||||||
|
"title": "Název",
|
||||||
|
"type": "Typ",
|
||||||
|
"updateSuccess": "Úspěšně aktualizováno",
|
||||||
|
"validityPeriod": "Doba platnosti"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "Blokovat virtuální stroj",
|
||||||
|
"blockVirtualMachineDescription": "Pokud je povoleno, zařízení nebudou moci běžet na virtuálních strojích nebo emulátorech",
|
||||||
|
"communicationKey": "Komunikační klíč",
|
||||||
|
"communicationKeyDescription": "Komunikační klíč se používá pro bezpečnou komunikaci mezi zařízeními a servery",
|
||||||
"enable": "Povolit",
|
"enable": "Povolit",
|
||||||
"enableDescription": "Po povolení jsou podporovány různé identifikátory zařízení, jako jsou IMEI/IDFA/IDFV/AndroidID/Mac adresa pro přihlášení a registraci"
|
"enableDescription": "Po povolení jsou podporovány různé identifikátory zařízení, jako jsou IMEI/IDFA/IDFV/AndroidID/Mac adresa pro přihlášení a registraci",
|
||||||
|
"enableSecurity": "Povolit šifrování komunikace",
|
||||||
|
"enableSecurityDescription": "Pokud je povoleno, komunikace mezi zařízeními a servery bude šifrována",
|
||||||
|
"saveFailed": "Uložení se nezdařilo",
|
||||||
|
"saveSuccess": "Uložení bylo úspěšné",
|
||||||
|
"showAds": "Zobrazit reklamy",
|
||||||
|
"showAdsDescription": "Pokud je povoleno, na zařízeních se budou zobrazovat reklamy"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Ověření e-mailu",
|
"emailVerification": "Ověření e-mailu",
|
||||||
"emailVerificationDescription": "Když je povoleno, uživatelé budou muset ověřit svůj e-mail",
|
"emailVerificationDescription": "Když je povoleno, uživatelé budou muset ověřit svůj e-mail",
|
||||||
"enable": "Povolit",
|
"enable": "Povolit",
|
||||||
"enableDescription": "Po povolení budou povoleny funkce registrace, přihlášení, připojení a odpojení mobilního telefonu",
|
"enableDescription": "Po aktivaci budou povoleny funkce registrace e-mailem, přihlášení, propojení a odpojení.",
|
||||||
"expiration_email_template": "Šablona oznámení o vypršení platnosti",
|
"expiration_email_template": "Šablona oznámení o vypršení platnosti",
|
||||||
"expiration_email_templateDescription": "Zástupné symboly {after}.variable{before} budou nahrazeny skutečnými daty. Ujistěte se, že tyto proměnné zachováte.",
|
"expiration_email_templateDescription": "Zástupné symboly {after}.variable{before} budou nahrazeny skutečnými daty. Ujistěte se, že tyto proměnné zachováte.",
|
||||||
"failed": "Neúspěch",
|
"failed": "Neúspěch",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "čeština",
|
|
||||||
"de-DE": "němčina",
|
|
||||||
"en-US": "angličtina",
|
|
||||||
"es-ES": "španělština",
|
|
||||||
"es-MX": "španělština (Mexiko)",
|
|
||||||
"fa-IR": "Perština",
|
|
||||||
"fi-FI": "finština",
|
|
||||||
"fr-FR": "Francouzština",
|
|
||||||
"hi-IN": "hindština",
|
|
||||||
"hu-HU": "maďarština",
|
|
||||||
"ja-JP": "Japonština",
|
|
||||||
"ko-KR": "Korejština",
|
|
||||||
"no-NO": "norština",
|
|
||||||
"pl-PL": "polština",
|
|
||||||
"pt-BR": "portugalština (Brazílie)",
|
|
||||||
"ro-RO": "rumunština",
|
|
||||||
"ru-RU": "ruština",
|
|
||||||
"th-TH": "thajština",
|
|
||||||
"tr-TR": "turečtina",
|
|
||||||
"uk-UA": "Ukrajinština",
|
|
||||||
"vi-VN": "Vietnamština",
|
|
||||||
"zh-CN": "čeština (CS)",
|
|
||||||
"zh-HK": "čínština (tradiční)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "Konfigurace ADS",
|
||||||
"Announcement Management": "Správa oznámení",
|
"Announcement Management": "Správa oznámení",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
"Auth Control": "Řízení ověřování",
|
"Auth Control": "Řízení ověřování",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Pouze pro zobrazení, po změně se změní všechny měnové jednotky v systému",
|
"currencyUnitDescription": "Pouze pro zobrazení, po změně se změní všechny měnové jednotky v systému",
|
||||||
"saveSuccess": "Úspěšně uloženo"
|
"saveSuccess": "Úspěšně uloženo"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Uložení bylo úspěšné",
|
||||||
|
"title": "Zásady ochrany osobních údajů"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Vlastní HTML",
|
||||||
|
"customHtmlDescription": "Vlastní HTML kód, který bude vložen na konec tagu body na stránce.",
|
||||||
|
"keywords": "Klíčová slova",
|
||||||
|
"keywordsDescription": "Používá se pro SEO účely",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Používá se k zobrazení místa, kde je potřeba zobrazit LOGO",
|
"logoDescription": "Používá se k zobrazení místa, kde je potřeba zobrazit LOGO",
|
||||||
"logoPlaceholder": "Zadejte URL adresu LOGA, nekončete '/'",
|
"logoPlaceholder": "Zadejte URL adresu LOGA, nekončete '/'",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "Abbrechen",
|
||||||
|
"confirm": "Bestätigen",
|
||||||
|
"confirmDelete": "Löschen bestätigen",
|
||||||
|
"create": "Anzeige erstellen",
|
||||||
|
"createAds": "Anzeige erstellen",
|
||||||
|
"createSuccess": "Erfolgreich erstellt",
|
||||||
|
"delete": "Löschen",
|
||||||
|
"deleteSuccess": "Erfolgreich gelöscht",
|
||||||
|
"deleteWarning": "Sind Sie sicher, dass Sie diese Anzeige löschen möchten?",
|
||||||
|
"disabled": "Deaktiviert",
|
||||||
|
"edit": "Bearbeiten",
|
||||||
|
"editAds": "Anzeige bearbeiten",
|
||||||
|
"enabled": "Aktiviert",
|
||||||
|
"form": {
|
||||||
|
"cancel": "Abbrechen",
|
||||||
|
"confirm": "Bestätigen",
|
||||||
|
"content": "Inhalt",
|
||||||
|
"description": "Beschreibung",
|
||||||
|
"endTime": "Endzeit",
|
||||||
|
"enterContent": "Bitte geben Sie den Anzeigeninhalt ein",
|
||||||
|
"enterDescription": "Bitte geben Sie die Anzeigenbeschreibung ein",
|
||||||
|
"enterEndTime": "Bitte wählen Sie die Endzeit aus",
|
||||||
|
"enterStartTime": "Bitte wählen Sie die Startzeit aus",
|
||||||
|
"enterTargetUrl": "Bitte geben Sie die Ziel-URL ein",
|
||||||
|
"enterTitle": "Bitte geben Sie den Anzeigentitel ein",
|
||||||
|
"startTime": "Startzeit",
|
||||||
|
"targetUrl": "Ziel-URL",
|
||||||
|
"title": "Titel",
|
||||||
|
"type": "Anzeigentyp",
|
||||||
|
"typeImage": "Bild",
|
||||||
|
"typeVideo": "Video"
|
||||||
|
},
|
||||||
|
"status": "Status",
|
||||||
|
"targetUrl": "Ziel-URL",
|
||||||
|
"title": "Titel",
|
||||||
|
"type": "Typ",
|
||||||
|
"updateSuccess": "Erfolgreich aktualisiert",
|
||||||
|
"validityPeriod": "Gültigkeitsdauer"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "Virtuelle Maschine blockieren",
|
||||||
|
"blockVirtualMachineDescription": "Wenn aktiviert, wird verhindert, dass Geräte auf virtuellen Maschinen oder Emulatoren ausgeführt werden.",
|
||||||
|
"communicationKey": "Kommunikationsschlüssel",
|
||||||
|
"communicationKeyDescription": "Der Kommunikationsschlüssel wird für die sichere Kommunikation zwischen Geräten und Servern verwendet.",
|
||||||
"enable": "Aktivieren",
|
"enable": "Aktivieren",
|
||||||
"enableDescription": "Nach der Aktivierung werden mehrere Geräteidentifikatoren wie IMEI/IDFA/IDFV/AndroidID/Mac-Adresse für die Anmeldung und Registrierung unterstützt."
|
"enableDescription": "Nach der Aktivierung werden mehrere Geräteidentifikatoren wie IMEI/IDFA/IDFV/AndroidID/Mac-Adresse für die Anmeldung und Registrierung unterstützt.",
|
||||||
|
"enableSecurity": "Kommunikationsverschlüsselung aktivieren",
|
||||||
|
"enableSecurityDescription": "Wenn aktiviert, wird die Kommunikation zwischen Geräten und Servern verschlüsselt.",
|
||||||
|
"saveFailed": "Speichern fehlgeschlagen",
|
||||||
|
"saveSuccess": "Speichern erfolgreich",
|
||||||
|
"showAds": "Werbung anzeigen",
|
||||||
|
"showAdsDescription": "Wenn aktiviert, werden auf den Geräten Anzeigen angezeigt."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "E-Mail-Verifizierung",
|
"emailVerification": "E-Mail-Verifizierung",
|
||||||
"emailVerificationDescription": "Wenn aktiviert, müssen Benutzer ihre E-Mail-Adresse verifizieren",
|
"emailVerificationDescription": "Wenn aktiviert, müssen Benutzer ihre E-Mail-Adresse verifizieren",
|
||||||
"enable": "Aktivieren",
|
"enable": "Aktivieren",
|
||||||
"enableDescription": "Nach der Aktivierung werden die Funktionen zur Registrierung, Anmeldung, Bindung und Entbindung von Mobiltelefonen aktiviert",
|
"enableDescription": "Nach der Aktivierung werden die Funktionen zur E-Mail-Registrierung, Anmeldung, Bindung und Entbindung aktiviert.",
|
||||||
"expiration_email_template": "Vorlage für Ablaufbenachrichtigung",
|
"expiration_email_template": "Vorlage für Ablaufbenachrichtigung",
|
||||||
"expiration_email_templateDescription": "Die Platzhalter {after}.variable{before} werden durch tatsächliche Daten ersetzt. Stellen Sie sicher, dass Sie diese Variablen beibehalten.",
|
"expiration_email_templateDescription": "Die Platzhalter {after}.variable{before} werden durch tatsächliche Daten ersetzt. Stellen Sie sicher, dass Sie diese Variablen beibehalten.",
|
||||||
"failed": "Fehlgeschlagen",
|
"failed": "Fehlgeschlagen",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Tschechisch",
|
|
||||||
"de-DE": "Deutsch",
|
|
||||||
"en-US": "Englisch",
|
|
||||||
"es-ES": "Spanisch",
|
|
||||||
"es-MX": "Spanisch (Mexiko)",
|
|
||||||
"fa-IR": "Persisch",
|
|
||||||
"fi-FI": "Finnisch",
|
|
||||||
"fr-FR": "Französisch",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Ungarisch",
|
|
||||||
"ja-JP": "Japanisch",
|
|
||||||
"ko-KR": "Koreanisch",
|
|
||||||
"no-NO": "Norwegisch",
|
|
||||||
"pl-PL": "Polnisch",
|
|
||||||
"pt-BR": "Portugiesisch (Brasilien)",
|
|
||||||
"ro-RO": "Rumänisch",
|
|
||||||
"ru-RU": "Russisch",
|
|
||||||
"th-TH": "Thailändisch",
|
|
||||||
"tr-TR": "Türkisch",
|
|
||||||
"uk-UA": "Ukrainisch",
|
|
||||||
"vi-VN": "Vietnamesisch",
|
|
||||||
"zh-CN": "Chinesisch (vereinfacht)",
|
|
||||||
"zh-HK": "Chinesisch (Traditionell)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "ADS-Konfiguration",
|
||||||
"Announcement Management": "Ankündigungsverwaltung",
|
"Announcement Management": "Ankündigungsverwaltung",
|
||||||
"Apple": "Apple-ID",
|
"Apple": "Apple-ID",
|
||||||
"Auth Control": "Authentifizierungskontrolle",
|
"Auth Control": "Authentifizierungskontrolle",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Nur zur Anzeige verwendet, nach der Änderung werden alle Währungseinheiten im System geändert",
|
"currencyUnitDescription": "Nur zur Anzeige verwendet, nach der Änderung werden alle Währungseinheiten im System geändert",
|
||||||
"saveSuccess": "Erfolgreich gespeichert"
|
"saveSuccess": "Erfolgreich gespeichert"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Erfolgreich gespeichert",
|
||||||
|
"title": "Datenschutzrichtlinie"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Benutzerdefiniertes HTML",
|
||||||
|
"customHtmlDescription": "Benutzerdefinierter HTML-Code, der am Ende des body-Tags der Seite eingefügt werden soll.",
|
||||||
|
"keywords": "Schlüsselwörter",
|
||||||
|
"keywordsDescription": "Für SEO-Zwecke verwendet",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Position zur Anzeige des LOGOs",
|
"logoDescription": "Position zur Anzeige des LOGOs",
|
||||||
"logoPlaceholder": "Bitte geben Sie die URL-Adresse des LOGOs ein, ohne '/' am Ende",
|
"logoPlaceholder": "Bitte geben Sie die URL-Adresse des LOGOs ein, ohne '/' am Ende",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"confirm": "Confirm",
|
||||||
|
"confirmDelete": "Confirm Delete",
|
||||||
|
"create": "Create Ad",
|
||||||
|
"createAds": "Create Advertisement",
|
||||||
|
"createSuccess": "Successfully created",
|
||||||
|
"delete": "Delete",
|
||||||
|
"deleteSuccess": "Successfully deleted",
|
||||||
|
"deleteWarning": "Are you sure you want to delete this ad?",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"edit": "Edit",
|
||||||
|
"editAds": "Edit Advertisement",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"form": {
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"confirm": "Confirm",
|
||||||
|
"content": "Content",
|
||||||
|
"description": "Description",
|
||||||
|
"endTime": "End Time",
|
||||||
|
"enterContent": "Please enter ad content",
|
||||||
|
"enterDescription": "Please enter ad description",
|
||||||
|
"enterEndTime": "Please select end time",
|
||||||
|
"enterStartTime": "Please select start time",
|
||||||
|
"enterTargetUrl": "Please enter target URL",
|
||||||
|
"enterTitle": "Please enter ad title",
|
||||||
|
"startTime": "Start Time",
|
||||||
|
"targetUrl": "Target URL",
|
||||||
|
"title": "Title",
|
||||||
|
"type": "Ad Type",
|
||||||
|
"typeImage": "Image",
|
||||||
|
"typeVideo": "Video"
|
||||||
|
},
|
||||||
|
"status": "Status",
|
||||||
|
"targetUrl": "Target URL",
|
||||||
|
"title": "Title",
|
||||||
|
"type": "Type",
|
||||||
|
"updateSuccess": "Successfully updated",
|
||||||
|
"validityPeriod": "Validity Period"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "Block Virtual Machine",
|
||||||
|
"blockVirtualMachineDescription": "When enabled, devices will be prevented from running on virtual machines or emulators",
|
||||||
|
"communicationKey": "Communication Key",
|
||||||
|
"communicationKeyDescription": "Communication key is used for secure communication between devices and servers",
|
||||||
"enable": "Enable",
|
"enable": "Enable",
|
||||||
"enableDescription": "After enabling, multiple device identifiers such as IMEI/IDFA/IDFV/AndroidID/Mac address are supported for login and registration"
|
"enableDescription": "After enabling, multiple device identifiers such as IMEI/IDFA/IDFV/AndroidID/Mac address are supported for login and registration",
|
||||||
|
"enableSecurity": "Enable Communication Encryption",
|
||||||
|
"enableSecurityDescription": "When enabled, the communication between devices and servers will be encrypted",
|
||||||
|
"saveFailed": "Save failed",
|
||||||
|
"saveSuccess": "Save successful",
|
||||||
|
"showAds": "Show Advertisements",
|
||||||
|
"showAdsDescription": "When enabled, advertisements will be displayed on devices"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Email Verification",
|
"emailVerification": "Email Verification",
|
||||||
"emailVerificationDescription": "When enabled, users will need to verify their email",
|
"emailVerificationDescription": "When enabled, users will need to verify their email",
|
||||||
"enable": "Enable",
|
"enable": "Enable",
|
||||||
"enableDescription": "After enabling, mobile phone registration, login, binding, and unbinding functions will be enabled",
|
"enableDescription": "After enabling, email registration, login, binding, and unbinding functions will be enabled",
|
||||||
"expiration_email_template": "Expiration Notice Template",
|
"expiration_email_template": "Expiration Notice Template",
|
||||||
"expiration_email_templateDescription": "The {after}.variable{before} placeholders will be replaced with actual data. Ensure to keep these variables.",
|
"expiration_email_templateDescription": "The {after}.variable{before} placeholders will be replaced with actual data. Ensure to keep these variables.",
|
||||||
"failed": "Failed",
|
"failed": "Failed",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Czech",
|
|
||||||
"de-DE": "German",
|
|
||||||
"en-US": "English",
|
|
||||||
"es-ES": "Spanish",
|
|
||||||
"es-MX": "Spanish (Mexico)",
|
|
||||||
"fa-IR": "Persian",
|
|
||||||
"fi-FI": "Finnish",
|
|
||||||
"fr-FR": "French",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Hungarian",
|
|
||||||
"ja-JP": "Japanese",
|
|
||||||
"ko-KR": "Korean",
|
|
||||||
"no-NO": "Norwegian",
|
|
||||||
"pl-PL": "Polish",
|
|
||||||
"pt-BR": "Portuguese (Brazil)",
|
|
||||||
"ro-RO": "Romanian",
|
|
||||||
"ru-RU": "Russian",
|
|
||||||
"th-TH": "Thai",
|
|
||||||
"tr-TR": "Turkish",
|
|
||||||
"uk-UA": "Ukrainian",
|
|
||||||
"vi-VN": "Vietnamese",
|
|
||||||
"zh-CN": "Chinese (Simplified)",
|
|
||||||
"zh-HK": "Chinese (Traditional)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "ADS Config",
|
||||||
"Announcement Management": "Announcement Management",
|
"Announcement Management": "Announcement Management",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
"Auth Control": "Auth Control",
|
"Auth Control": "Auth Control",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Used for display purposes only; changing this will affect all currency units in the system",
|
"currencyUnitDescription": "Used for display purposes only; changing this will affect all currency units in the system",
|
||||||
"saveSuccess": "Save Successful"
|
"saveSuccess": "Save Successful"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Save Successful",
|
||||||
|
"title": "Privacy Policy"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Custom HTML",
|
||||||
|
"customHtmlDescription": "Custom HTML code to be injected into the bottom of the site's body tag.",
|
||||||
|
"keywords": "Keywords",
|
||||||
|
"keywordsDescription": "Used for SEO purposes",
|
||||||
"logo": "Logo",
|
"logo": "Logo",
|
||||||
"logoDescription": "Used for displaying the logo in designated locations",
|
"logoDescription": "Used for displaying the logo in designated locations",
|
||||||
"logoPlaceholder": "Enter the URL of the logo, without ending with '/'",
|
"logoPlaceholder": "Enter the URL of the logo, without ending with '/'",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"confirm": "Confirmar",
|
||||||
|
"confirmDelete": "Confirmar eliminación",
|
||||||
|
"create": "Crear anuncio",
|
||||||
|
"createAds": "Crear publicidad",
|
||||||
|
"createSuccess": "Creado con éxito",
|
||||||
|
"delete": "Eliminar",
|
||||||
|
"deleteSuccess": "Eliminado con éxito",
|
||||||
|
"deleteWarning": "¿Está seguro de que desea eliminar este anuncio?",
|
||||||
|
"disabled": "Deshabilitado",
|
||||||
|
"edit": "Editar",
|
||||||
|
"editAds": "Editar publicidad",
|
||||||
|
"enabled": "Habilitado",
|
||||||
|
"form": {
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"confirm": "Confirmar",
|
||||||
|
"content": "Contenido",
|
||||||
|
"description": "Descripción",
|
||||||
|
"endTime": "Hora de finalización",
|
||||||
|
"enterContent": "Por favor, introduzca el contenido del anuncio",
|
||||||
|
"enterDescription": "Por favor, introduzca la descripción del anuncio",
|
||||||
|
"enterEndTime": "Por favor, seleccione la hora de finalización",
|
||||||
|
"enterStartTime": "Por favor, seleccione la hora de inicio",
|
||||||
|
"enterTargetUrl": "Por favor, introduzca la URL de destino",
|
||||||
|
"enterTitle": "Por favor, introduzca el título del anuncio",
|
||||||
|
"startTime": "Hora de inicio",
|
||||||
|
"targetUrl": "URL de destino",
|
||||||
|
"title": "Título",
|
||||||
|
"type": "Tipo de anuncio",
|
||||||
|
"typeImage": "Imagen",
|
||||||
|
"typeVideo": "Vídeo"
|
||||||
|
},
|
||||||
|
"status": "Estado",
|
||||||
|
"targetUrl": "URL de destino",
|
||||||
|
"title": "Título",
|
||||||
|
"type": "Tipo",
|
||||||
|
"updateSuccess": "Actualizado con éxito",
|
||||||
|
"validityPeriod": "Período de validez"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "Bloquear Máquina Virtual",
|
||||||
|
"blockVirtualMachineDescription": "Cuando está habilitado, se evitará que los dispositivos se ejecuten en máquinas virtuales o emuladores",
|
||||||
|
"communicationKey": "Clave de Comunicación",
|
||||||
|
"communicationKeyDescription": "La clave de comunicación se utiliza para la comunicación segura entre dispositivos y servidores",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
"enableDescription": "Después de habilitar, se admiten múltiples identificadores de dispositivos como IMEI/IDFA/IDFV/AndroidID/dirección MAC para el inicio de sesión y el registro"
|
"enableDescription": "Después de habilitar, se admiten múltiples identificadores de dispositivos como IMEI/IDFA/IDFV/AndroidID/dirección MAC para el inicio de sesión y el registro",
|
||||||
|
"enableSecurity": "Habilitar Cifrado de Comunicación",
|
||||||
|
"enableSecurityDescription": "Cuando está habilitado, la comunicación entre dispositivos y servidores será cifrada",
|
||||||
|
"saveFailed": "Error al guardar",
|
||||||
|
"saveSuccess": "Guardado exitoso",
|
||||||
|
"showAds": "Mostrar Anuncios",
|
||||||
|
"showAdsDescription": "Cuando está habilitado, se mostrarán anuncios en los dispositivos"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Verificación de correo electrónico",
|
"emailVerification": "Verificación de correo electrónico",
|
||||||
"emailVerificationDescription": "Cuando esté habilitado, los usuarios deberán verificar su correo electrónico",
|
"emailVerificationDescription": "Cuando esté habilitado, los usuarios deberán verificar su correo electrónico",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
"enableDescription": "Después de habilitar, se activarán las funciones de registro, inicio de sesión, vinculación y desvinculación de teléfonos móviles",
|
"enableDescription": "Después de habilitar, se activarán las funciones de registro por correo electrónico, inicio de sesión, vinculación y desvinculación.",
|
||||||
"expiration_email_template": "Plantilla de Aviso de Vencimiento",
|
"expiration_email_template": "Plantilla de Aviso de Vencimiento",
|
||||||
"expiration_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
|
"expiration_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
|
||||||
"failed": "Fallido",
|
"failed": "Fallido",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Checo",
|
|
||||||
"de-DE": "Alemán",
|
|
||||||
"en-US": "inglés",
|
|
||||||
"es-ES": "español",
|
|
||||||
"es-MX": "Español (México)",
|
|
||||||
"fa-IR": "Persa",
|
|
||||||
"fi-FI": "Finlandés",
|
|
||||||
"fr-FR": "Francés",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "húngaro",
|
|
||||||
"ja-JP": "Japonés",
|
|
||||||
"ko-KR": "Coreano",
|
|
||||||
"no-NO": "Noruego",
|
|
||||||
"pl-PL": "Polaco",
|
|
||||||
"pt-BR": "portugués (Brasil)",
|
|
||||||
"ro-RO": "Rumano",
|
|
||||||
"ru-RU": "Ruso",
|
|
||||||
"th-TH": "Tailandés",
|
|
||||||
"tr-TR": "turco",
|
|
||||||
"uk-UA": "Ucraniano",
|
|
||||||
"vi-VN": "Vietnamita",
|
|
||||||
"zh-CN": "Español (España)",
|
|
||||||
"zh-HK": "chino (tradicional)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "Configuración de ADS",
|
||||||
"Announcement Management": "Gestión de Anuncios",
|
"Announcement Management": "Gestión de Anuncios",
|
||||||
"Apple": "ID de Apple",
|
"Apple": "ID de Apple",
|
||||||
"Auth Control": "Control de Autenticación",
|
"Auth Control": "Control de Autenticación",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Solo para uso de visualización, al cambiarlo se modificarán todas las unidades monetarias en el sistema",
|
"currencyUnitDescription": "Solo para uso de visualización, al cambiarlo se modificarán todas las unidades monetarias en el sistema",
|
||||||
"saveSuccess": "Guardado exitosamente"
|
"saveSuccess": "Guardado exitosamente"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Guardado con éxito",
|
||||||
|
"title": "Política de Privacidad"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML personalizado",
|
||||||
|
"customHtmlDescription": "Código HTML personalizado que se inyectará en la parte inferior de la etiqueta body del sitio.",
|
||||||
|
"keywords": "Palabras clave",
|
||||||
|
"keywordsDescription": "Utilizado para fines de SEO",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Se utiliza para mostrar la ubicación donde se debe mostrar el LOGO",
|
"logoDescription": "Se utiliza para mostrar la ubicación donde se debe mostrar el LOGO",
|
||||||
"logoPlaceholder": "Por favor, introduce la URL del LOGO, no termines con '/'",
|
"logoPlaceholder": "Por favor, introduce la URL del LOGO, no termines con '/'",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"confirm": "Confirmar",
|
||||||
|
"confirmDelete": "Confirmar Eliminación",
|
||||||
|
"create": "Crear Anuncio",
|
||||||
|
"createAds": "Crear Publicidad",
|
||||||
|
"createSuccess": "Creado con éxito",
|
||||||
|
"delete": "Eliminar",
|
||||||
|
"deleteSuccess": "Eliminado con éxito",
|
||||||
|
"deleteWarning": "¿Está seguro de que desea eliminar este anuncio?",
|
||||||
|
"disabled": "Deshabilitado",
|
||||||
|
"edit": "Editar",
|
||||||
|
"editAds": "Editar Publicidad",
|
||||||
|
"enabled": "Habilitado",
|
||||||
|
"form": {
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"confirm": "Confirmar",
|
||||||
|
"content": "Contenido",
|
||||||
|
"description": "Descripción",
|
||||||
|
"endTime": "Hora de Finalización",
|
||||||
|
"enterContent": "Por favor ingrese el contenido del anuncio",
|
||||||
|
"enterDescription": "Por favor ingrese la descripción del anuncio",
|
||||||
|
"enterEndTime": "Por favor seleccione la hora de finalización",
|
||||||
|
"enterStartTime": "Por favor seleccione la hora de inicio",
|
||||||
|
"enterTargetUrl": "Por favor ingrese la URL de destino",
|
||||||
|
"enterTitle": "Por favor ingrese el título del anuncio",
|
||||||
|
"startTime": "Hora de Inicio",
|
||||||
|
"targetUrl": "URL de Destino",
|
||||||
|
"title": "Título",
|
||||||
|
"type": "Tipo de Anuncio",
|
||||||
|
"typeImage": "Imagen",
|
||||||
|
"typeVideo": "Video"
|
||||||
|
},
|
||||||
|
"status": "Estado",
|
||||||
|
"targetUrl": "URL de Destino",
|
||||||
|
"title": "Título",
|
||||||
|
"type": "Tipo",
|
||||||
|
"updateSuccess": "Actualizado con éxito",
|
||||||
|
"validityPeriod": "Período de Validez"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "Bloquear Máquina Virtual",
|
||||||
|
"blockVirtualMachineDescription": "Cuando está habilitado, se evitará que los dispositivos se ejecuten en máquinas virtuales o emuladores",
|
||||||
|
"communicationKey": "Clave de Comunicación",
|
||||||
|
"communicationKeyDescription": "La clave de comunicación se utiliza para la comunicación segura entre dispositivos y servidores",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
"enableDescription": "Después de habilitar, se admiten múltiples identificadores de dispositivos como IMEI/IDFA/IDFV/AndroidID/dirección Mac para iniciar sesión y registrarse"
|
"enableDescription": "Después de habilitar, se admiten múltiples identificadores de dispositivos como IMEI/IDFA/IDFV/AndroidID/dirección Mac para iniciar sesión y registrarse",
|
||||||
|
"enableSecurity": "Habilitar Cifrado de Comunicación",
|
||||||
|
"enableSecurityDescription": "Cuando está habilitado, la comunicación entre dispositivos y servidores será cifrada",
|
||||||
|
"saveFailed": "Error al guardar",
|
||||||
|
"saveSuccess": "Guardado exitoso",
|
||||||
|
"showAds": "Mostrar Anuncios",
|
||||||
|
"showAdsDescription": "Cuando está habilitado, se mostrarán anuncios en los dispositivos"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Verificación de Correo Electrónico",
|
"emailVerification": "Verificación de Correo Electrónico",
|
||||||
"emailVerificationDescription": "Cuando esté habilitado, los usuarios deberán verificar su correo electrónico",
|
"emailVerificationDescription": "Cuando esté habilitado, los usuarios deberán verificar su correo electrónico",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
"enableDescription": "Después de habilitar, se activarán las funciones de registro, inicio de sesión, vinculación y desvinculación de teléfonos móviles",
|
"enableDescription": "Después de habilitar, se activarán las funciones de registro por correo electrónico, inicio de sesión, vinculación y desvinculación.",
|
||||||
"expiration_email_template": "Plantilla de Aviso de Vencimiento",
|
"expiration_email_template": "Plantilla de Aviso de Vencimiento",
|
||||||
"expiration_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
|
"expiration_email_templateDescription": "Los marcadores de posición {after}.variable{before} serán reemplazados con datos reales. Asegúrate de mantener estas variables.",
|
||||||
"failed": "Fallido",
|
"failed": "Fallido",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Checo",
|
|
||||||
"de-DE": "Alemán",
|
|
||||||
"en-US": "inglés",
|
|
||||||
"es-ES": "español",
|
|
||||||
"es-MX": "Español (México)",
|
|
||||||
"fa-IR": "Persa",
|
|
||||||
"fi-FI": "Finlandés",
|
|
||||||
"fr-FR": "Francés",
|
|
||||||
"hi-IN": "Hindi",
|
|
||||||
"hu-HU": "Húngaro",
|
|
||||||
"ja-JP": "Japonés",
|
|
||||||
"ko-KR": "Coreano",
|
|
||||||
"no-NO": "Noruego",
|
|
||||||
"pl-PL": "Polaco",
|
|
||||||
"pt-BR": "portugués (Brasil)",
|
|
||||||
"ro-RO": "Rumano",
|
|
||||||
"ru-RU": "Ruso",
|
|
||||||
"th-TH": "Tailandés",
|
|
||||||
"tr-TR": "turco",
|
|
||||||
"uk-UA": "Ucraniano",
|
|
||||||
"vi-VN": "Vietnamita",
|
|
||||||
"zh-CN": "español (México)",
|
|
||||||
"zh-HK": "Chino (Tradicional)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "Configuración de ADS",
|
||||||
"Announcement Management": "Gestión de Anuncios",
|
"Announcement Management": "Gestión de Anuncios",
|
||||||
"Apple": "ID de Apple",
|
"Apple": "ID de Apple",
|
||||||
"Auth Control": "Control de Autenticación",
|
"Auth Control": "Control de Autenticación",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Solo para fines de visualización, cambiarlo alterará todas las unidades monetarias en el sistema",
|
"currencyUnitDescription": "Solo para fines de visualización, cambiarlo alterará todas las unidades monetarias en el sistema",
|
||||||
"saveSuccess": "Guardado exitosamente"
|
"saveSuccess": "Guardado exitosamente"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Guardado exitoso",
|
||||||
|
"title": "Política de Privacidad"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML personalizado",
|
||||||
|
"customHtmlDescription": "Código HTML personalizado que se inyectará al final de la etiqueta body del sitio.",
|
||||||
|
"keywords": "Palabras clave",
|
||||||
|
"keywordsDescription": "Utilizado para propósitos de SEO",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Usado para mostrar la ubicación donde se debe exhibir el LOGO",
|
"logoDescription": "Usado para mostrar la ubicación donde se debe exhibir el LOGO",
|
||||||
"logoPlaceholder": "Por favor, ingresa la URL del LOGO, no termines con '/'",
|
"logoPlaceholder": "Por favor, ingresa la URL del LOGO, no termines con '/'",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "لغو",
|
||||||
|
"confirm": "تأیید",
|
||||||
|
"confirmDelete": "تأیید حذف",
|
||||||
|
"create": "ایجاد آگهی",
|
||||||
|
"createAds": "ایجاد تبلیغ",
|
||||||
|
"createSuccess": "با موفقیت ایجاد شد",
|
||||||
|
"delete": "حذف",
|
||||||
|
"deleteSuccess": "با موفقیت حذف شد",
|
||||||
|
"deleteWarning": "آیا مطمئن هستید که میخواهید این آگهی را حذف کنید؟",
|
||||||
|
"disabled": "غیرفعال",
|
||||||
|
"edit": "ویرایش",
|
||||||
|
"editAds": "ویرایش تبلیغ",
|
||||||
|
"enabled": "فعال",
|
||||||
|
"form": {
|
||||||
|
"cancel": "لغو",
|
||||||
|
"confirm": "تأیید",
|
||||||
|
"content": "محتوا",
|
||||||
|
"description": "توضیحات",
|
||||||
|
"endTime": "زمان پایان",
|
||||||
|
"enterContent": "لطفاً محتوای آگهی را وارد کنید",
|
||||||
|
"enterDescription": "لطفاً توضیحات آگهی را وارد کنید",
|
||||||
|
"enterEndTime": "لطفاً زمان پایان را انتخاب کنید",
|
||||||
|
"enterStartTime": "لطفاً زمان شروع را انتخاب کنید",
|
||||||
|
"enterTargetUrl": "لطفاً URL هدف را وارد کنید",
|
||||||
|
"enterTitle": "لطفاً عنوان آگهی را وارد کنید",
|
||||||
|
"startTime": "زمان شروع",
|
||||||
|
"targetUrl": "URL هدف",
|
||||||
|
"title": "عنوان",
|
||||||
|
"type": "نوع آگهی",
|
||||||
|
"typeImage": "تصویر",
|
||||||
|
"typeVideo": "ویدیو"
|
||||||
|
},
|
||||||
|
"status": "وضعیت",
|
||||||
|
"targetUrl": "URL هدف",
|
||||||
|
"title": "عنوان",
|
||||||
|
"type": "نوع",
|
||||||
|
"updateSuccess": "با موفقیت بهروزرسانی شد",
|
||||||
|
"validityPeriod": "مدت اعتبار"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "مسدود کردن ماشین مجازی",
|
||||||
|
"blockVirtualMachineDescription": "هنگامی که فعال باشد، دستگاهها از اجرای ماشینهای مجازی یا شبیهسازها جلوگیری خواهند شد",
|
||||||
|
"communicationKey": "کلید ارتباطی",
|
||||||
|
"communicationKeyDescription": "کلید ارتباطی برای ارتباط امن بین دستگاهها و سرورها استفاده میشود",
|
||||||
"enable": "فعال کردن",
|
"enable": "فعال کردن",
|
||||||
"enableDescription": "پس از فعالسازی، شناسههای دستگاههای مختلف مانند IMEI/IDFA/IDFV/AndroidID/آدرس مک برای ورود و ثبتنام پشتیبانی میشوند"
|
"enableDescription": "پس از فعالسازی، شناسههای دستگاههای مختلف مانند IMEI/IDFA/IDFV/AndroidID/آدرس مک برای ورود و ثبتنام پشتیبانی میشوند",
|
||||||
|
"enableSecurity": "فعالسازی رمزنگاری ارتباطات",
|
||||||
|
"enableSecurityDescription": "هنگامی که فعال باشد، ارتباط بین دستگاهها و سرورها رمزنگاری خواهد شد",
|
||||||
|
"saveFailed": "ذخیرهسازی ناموفق بود",
|
||||||
|
"saveSuccess": "ذخیرهسازی با موفقیت انجام شد",
|
||||||
|
"showAds": "نمایش تبلیغات",
|
||||||
|
"showAdsDescription": "هنگامی که فعال باشد، تبلیغات بر روی دستگاهها نمایش داده خواهد شد"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "تأیید ایمیل",
|
"emailVerification": "تأیید ایمیل",
|
||||||
"emailVerificationDescription": "هنگامی که فعال شود، کاربران باید ایمیل خود را تأیید کنند",
|
"emailVerificationDescription": "هنگامی که فعال شود، کاربران باید ایمیل خود را تأیید کنند",
|
||||||
"enable": "فعال کردن",
|
"enable": "فعال کردن",
|
||||||
"enableDescription": "پس از فعالسازی، عملکردهای ثبتنام، ورود، اتصال و قطع اتصال تلفن همراه فعال خواهند شد",
|
"enableDescription": "پس از فعالسازی، ثبتنام ایمیلی، ورود، پیوند و جداسازی عملکردها فعال خواهند شد",
|
||||||
"expiration_email_template": "قالب اطلاعیه انقضا",
|
"expiration_email_template": "قالب اطلاعیه انقضا",
|
||||||
"expiration_email_templateDescription": "جایگذاریهای {after}.variable{before} با دادههای واقعی جایگزین خواهند شد. اطمینان حاصل کنید که این متغیرها را حفظ کنید.",
|
"expiration_email_templateDescription": "جایگذاریهای {after}.variable{before} با دادههای واقعی جایگزین خواهند شد. اطمینان حاصل کنید که این متغیرها را حفظ کنید.",
|
||||||
"failed": "ناموفق",
|
"failed": "ناموفق",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "چکی",
|
|
||||||
"de-DE": "آلمانی",
|
|
||||||
"en-US": "انگلیسی",
|
|
||||||
"es-ES": "اسپانیایی",
|
|
||||||
"es-MX": "اسپانیایی (مکزیک)",
|
|
||||||
"fa-IR": "فارسی",
|
|
||||||
"fi-FI": "فنلاندی",
|
|
||||||
"fr-FR": "فرانسوی",
|
|
||||||
"hi-IN": "هندی",
|
|
||||||
"hu-HU": "مجاری",
|
|
||||||
"ja-JP": "ژاپنی",
|
|
||||||
"ko-KR": "کرهای",
|
|
||||||
"no-NO": "نروژی",
|
|
||||||
"pl-PL": "لهستانی",
|
|
||||||
"pt-BR": "پرتغالی (برزیل)",
|
|
||||||
"ro-RO": "رومانیایی",
|
|
||||||
"ru-RU": "روسی",
|
|
||||||
"th-TH": "تایلندی",
|
|
||||||
"tr-TR": "ترکی",
|
|
||||||
"uk-UA": "اوکراینی",
|
|
||||||
"vi-VN": "ویتنامی",
|
|
||||||
"zh-CN": "چینی (ساده شده)",
|
|
||||||
"zh-HK": "چینی (سنتی)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "تنظیمات ADS",
|
||||||
"Announcement Management": "مدیریت اطلاعیهها",
|
"Announcement Management": "مدیریت اطلاعیهها",
|
||||||
"Apple": "شناسه اپل",
|
"Apple": "شناسه اپل",
|
||||||
"Auth Control": "کنترل احراز هویت",
|
"Auth Control": "کنترل احراز هویت",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "فقط برای نمایش استفاده میشود؛ تغییر این مورد بر تمام واحدهای ارزی در سیستم تأثیر خواهد گذاشت",
|
"currencyUnitDescription": "فقط برای نمایش استفاده میشود؛ تغییر این مورد بر تمام واحدهای ارزی در سیستم تأثیر خواهد گذاشت",
|
||||||
"saveSuccess": "ذخیرهسازی موفقیتآمیز"
|
"saveSuccess": "ذخیرهسازی موفقیتآمیز"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "ذخیره با موفقیت انجام شد",
|
||||||
|
"title": "سیاست حفظ حریم خصوصی"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML سفارشی",
|
||||||
|
"customHtmlDescription": "کد HTML سفارشی که باید در انتهای تگ body سایت وارد شود.",
|
||||||
|
"keywords": "کلمات کلیدی",
|
||||||
|
"keywordsDescription": "برای اهداف سئو استفاده میشود",
|
||||||
"logo": "لوگو",
|
"logo": "لوگو",
|
||||||
"logoDescription": "برای نمایش لوگو در مکانهای تعیینشده استفاده میشود",
|
"logoDescription": "برای نمایش لوگو در مکانهای تعیینشده استفاده میشود",
|
||||||
"logoPlaceholder": "آدرس URL لوگو را وارد کنید، بدون '/' در انتها",
|
"logoPlaceholder": "آدرس URL لوگو را وارد کنید، بدون '/' در انتها",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "Peruuta",
|
||||||
|
"confirm": "Vahvista",
|
||||||
|
"confirmDelete": "Vahvista poisto",
|
||||||
|
"create": "Luo ilmoitus",
|
||||||
|
"createAds": "Luo mainos",
|
||||||
|
"createSuccess": "Luonti onnistui",
|
||||||
|
"delete": "Poista",
|
||||||
|
"deleteSuccess": "Poisto onnistui",
|
||||||
|
"deleteWarning": "Oletko varma, että haluat poistaa tämän ilmoituksen?",
|
||||||
|
"disabled": "Pois käytöstä",
|
||||||
|
"edit": "Muokkaa",
|
||||||
|
"editAds": "Muokkaa mainosta",
|
||||||
|
"enabled": "Käytössä",
|
||||||
|
"form": {
|
||||||
|
"cancel": "Peruuta",
|
||||||
|
"confirm": "Vahvista",
|
||||||
|
"content": "Sisältö",
|
||||||
|
"description": "Kuvaus",
|
||||||
|
"endTime": "Loppuaika",
|
||||||
|
"enterContent": "Ole hyvä ja syötä mainoksen sisältö",
|
||||||
|
"enterDescription": "Ole hyvä ja syötä mainoksen kuvaus",
|
||||||
|
"enterEndTime": "Ole hyvä ja valitse loppuaika",
|
||||||
|
"enterStartTime": "Ole hyvä ja valitse aloitusaika",
|
||||||
|
"enterTargetUrl": "Ole hyvä ja syötä kohde-URL",
|
||||||
|
"enterTitle": "Ole hyvä ja syötä mainoksen otsikko",
|
||||||
|
"startTime": "Aloitusaika",
|
||||||
|
"targetUrl": "Kohde-URL",
|
||||||
|
"title": "Otsikko",
|
||||||
|
"type": "Mainostyyppi",
|
||||||
|
"typeImage": "Kuva",
|
||||||
|
"typeVideo": "Video"
|
||||||
|
},
|
||||||
|
"status": "Tila",
|
||||||
|
"targetUrl": "Kohde-URL",
|
||||||
|
"title": "Otsikko",
|
||||||
|
"type": "Tyyppi",
|
||||||
|
"updateSuccess": "Päivitys onnistui",
|
||||||
|
"validityPeriod": "Voimassaoloaika"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "Estä virtuaalikone",
|
||||||
|
"blockVirtualMachineDescription": "Kun tämä on käytössä, laitteiden käyttö virtuaalikoneissa tai emulaattoreissa estetään",
|
||||||
|
"communicationKey": "Viestintäavain",
|
||||||
|
"communicationKeyDescription": "Viestintäavain käytetään turvalliseen viestintään laitteiden ja palvelimien välillä",
|
||||||
"enable": "Ota käyttöön",
|
"enable": "Ota käyttöön",
|
||||||
"enableDescription": "Kun otat käyttöön, useita laiteidentifikaattoreita, kuten IMEI/IDFA/IDFV/AndroidID/Mac-osoite, tuetaan kirjautumiseen ja rekisteröitymiseen."
|
"enableDescription": "Kun otat käyttöön, useita laiteidentifikaattoreita, kuten IMEI/IDFA/IDFV/AndroidID/Mac-osoite, tuetaan kirjautumiseen ja rekisteröitymiseen.",
|
||||||
|
"enableSecurity": "Ota käyttöön viestinnän salaus",
|
||||||
|
"enableSecurityDescription": "Kun tämä on käytössä, laitteiden ja palvelimien välinen viestintä salataan",
|
||||||
|
"saveFailed": "Tallennus epäonnistui",
|
||||||
|
"saveSuccess": "Tallennus onnistui",
|
||||||
|
"showAds": "Näytä mainoksia",
|
||||||
|
"showAdsDescription": "Kun tämä on käytössä, mainoksia näytetään laitteilla"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Sähköpostin vahvistus",
|
"emailVerification": "Sähköpostin vahvistus",
|
||||||
"emailVerificationDescription": "Kun tämä on käytössä, käyttäjien on vahvistettava sähköpostinsa",
|
"emailVerificationDescription": "Kun tämä on käytössä, käyttäjien on vahvistettava sähköpostinsa",
|
||||||
"enable": "Ota käyttöön",
|
"enable": "Ota käyttöön",
|
||||||
"enableDescription": "Kun otat tämän käyttöön, matkapuhelimen rekisteröinti-, kirjautumis-, sitomis- ja purkutoiminnot otetaan käyttöön",
|
"enableDescription": "Kun tämä on otettu käyttöön, sähköpostirekisteröinti, kirjautuminen, liittäminen ja irrottaminen aktivoituvat.",
|
||||||
"expiration_email_template": "Vanhentumisilmoituksen malli",
|
"expiration_email_template": "Vanhentumisilmoituksen malli",
|
||||||
"expiration_email_templateDescription": "Paikkamerkit {after}.variable{before} korvataan todellisilla tiedoilla. Varmista, että pidät nämä muuttujat.",
|
"expiration_email_templateDescription": "Paikkamerkit {after}.variable{before} korvataan todellisilla tiedoilla. Varmista, että pidät nämä muuttujat.",
|
||||||
"failed": "Epäonnistui",
|
"failed": "Epäonnistui",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "tšekki",
|
|
||||||
"de-DE": "Saksa",
|
|
||||||
"en-US": "englanti",
|
|
||||||
"es-ES": "espanja",
|
|
||||||
"es-MX": "espanja (Meksiko)",
|
|
||||||
"fa-IR": "Persia",
|
|
||||||
"fi-FI": "suomi",
|
|
||||||
"fr-FR": "ranska",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "unkarinkieli",
|
|
||||||
"ja-JP": "japani",
|
|
||||||
"ko-KR": "Korea",
|
|
||||||
"no-NO": "norja",
|
|
||||||
"pl-PL": "puola",
|
|
||||||
"pt-BR": "portugali (Brasilia)",
|
|
||||||
"ro-RO": "romania",
|
|
||||||
"ru-RU": "Venäjä",
|
|
||||||
"th-TH": "thaikieli",
|
|
||||||
"tr-TR": "turkki",
|
|
||||||
"uk-UA": "ukrainaksi",
|
|
||||||
"vi-VN": "vietnamiksi",
|
|
||||||
"zh-CN": "kiina (yksinkertaistettu)",
|
|
||||||
"zh-HK": "kiina (perinteinen)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "ADS-asetukset",
|
||||||
"Announcement Management": "Ilmoitusten hallinta",
|
"Announcement Management": "Ilmoitusten hallinta",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
"Auth Control": "Todennuksen hallinta",
|
"Auth Control": "Todennuksen hallinta",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Käytetään vain näyttötarkoituksiin, muutoksen jälkeen kaikki järjestelmän valuuttayksiköt muuttuvat",
|
"currencyUnitDescription": "Käytetään vain näyttötarkoituksiin, muutoksen jälkeen kaikki järjestelmän valuuttayksiköt muuttuvat",
|
||||||
"saveSuccess": "Tallennus onnistui"
|
"saveSuccess": "Tallennus onnistui"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Tallennus onnistui",
|
||||||
|
"title": "Tietosuojakäytäntö"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Mukautettu HTML",
|
||||||
|
"customHtmlDescription": "Mukautettu HTML-koodi, joka lisätään sivuston body -tagin loppuun.",
|
||||||
|
"keywords": "Avainsanat",
|
||||||
|
"keywordsDescription": "Käytetään SEO-tarkoituksiin",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Näyttääksesi paikan, jossa LOGO tulee näkyä",
|
"logoDescription": "Näyttääksesi paikan, jossa LOGO tulee näkyä",
|
||||||
"logoPlaceholder": "Syötä LOGO:n URL-osoite, älä lopeta '/'-merkillä",
|
"logoPlaceholder": "Syötä LOGO:n URL-osoite, älä lopeta '/'-merkillä",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "Annuler",
|
||||||
|
"confirm": "Confirmer",
|
||||||
|
"confirmDelete": "Confirmer la suppression",
|
||||||
|
"create": "Créer une annonce",
|
||||||
|
"createAds": "Créer une publicité",
|
||||||
|
"createSuccess": "Créé avec succès",
|
||||||
|
"delete": "Supprimer",
|
||||||
|
"deleteSuccess": "Supprimé avec succès",
|
||||||
|
"deleteWarning": "Êtes-vous sûr de vouloir supprimer cette annonce ?",
|
||||||
|
"disabled": "Désactivé",
|
||||||
|
"edit": "Modifier",
|
||||||
|
"editAds": "Modifier la publicité",
|
||||||
|
"enabled": "Activé",
|
||||||
|
"form": {
|
||||||
|
"cancel": "Annuler",
|
||||||
|
"confirm": "Confirmer",
|
||||||
|
"content": "Contenu",
|
||||||
|
"description": "Description",
|
||||||
|
"endTime": "Heure de fin",
|
||||||
|
"enterContent": "Veuillez entrer le contenu de l'annonce",
|
||||||
|
"enterDescription": "Veuillez entrer la description de l'annonce",
|
||||||
|
"enterEndTime": "Veuillez sélectionner l'heure de fin",
|
||||||
|
"enterStartTime": "Veuillez sélectionner l'heure de début",
|
||||||
|
"enterTargetUrl": "Veuillez entrer l'URL cible",
|
||||||
|
"enterTitle": "Veuillez entrer le titre de l'annonce",
|
||||||
|
"startTime": "Heure de début",
|
||||||
|
"targetUrl": "URL cible",
|
||||||
|
"title": "Titre",
|
||||||
|
"type": "Type d'annonce",
|
||||||
|
"typeImage": "Image",
|
||||||
|
"typeVideo": "Vidéo"
|
||||||
|
},
|
||||||
|
"status": "Statut",
|
||||||
|
"targetUrl": "URL cible",
|
||||||
|
"title": "Titre",
|
||||||
|
"type": "Type",
|
||||||
|
"updateSuccess": "Mis à jour avec succès",
|
||||||
|
"validityPeriod": "Période de validité"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "Bloquer la machine virtuelle",
|
||||||
|
"blockVirtualMachineDescription": "Lorsqu'il est activé, les appareils seront empêchés de fonctionner sur des machines virtuelles ou des émulateurs",
|
||||||
|
"communicationKey": "Clé de communication",
|
||||||
|
"communicationKeyDescription": "La clé de communication est utilisée pour une communication sécurisée entre les appareils et les serveurs",
|
||||||
"enable": "Activer",
|
"enable": "Activer",
|
||||||
"enableDescription": "Après activation, plusieurs identifiants de périphériques tels que IMEI/IDFA/IDFV/AndroidID/adresse Mac sont pris en charge pour la connexion et l'enregistrement"
|
"enableDescription": "Après activation, plusieurs identifiants de périphériques tels que IMEI/IDFA/IDFV/AndroidID/adresse Mac sont pris en charge pour la connexion et l'enregistrement",
|
||||||
|
"enableSecurity": "Activer le chiffrement de la communication",
|
||||||
|
"enableSecurityDescription": "Lorsqu'il est activé, la communication entre les appareils et les serveurs sera chiffrée",
|
||||||
|
"saveFailed": "Échec de l'enregistrement",
|
||||||
|
"saveSuccess": "Enregistrement réussi",
|
||||||
|
"showAds": "Afficher les publicités",
|
||||||
|
"showAdsDescription": "Lorsqu'il est activé, des publicités seront affichées sur les appareils"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Vérification de l'email",
|
"emailVerification": "Vérification de l'email",
|
||||||
"emailVerificationDescription": "Lorsqu'elle est activée, les utilisateurs devront vérifier leur adresse e-mail",
|
"emailVerificationDescription": "Lorsqu'elle est activée, les utilisateurs devront vérifier leur adresse e-mail",
|
||||||
"enable": "Activer",
|
"enable": "Activer",
|
||||||
"enableDescription": "Après activation, les fonctions d'enregistrement, de connexion, de liaison et de déliaison par téléphone mobile seront activées",
|
"enableDescription": "Après activation, les fonctions d'enregistrement par e-mail, de connexion, de liaison et de délégation seront activées",
|
||||||
"expiration_email_template": "Modèle d'avis d'expiration",
|
"expiration_email_template": "Modèle d'avis d'expiration",
|
||||||
"expiration_email_templateDescription": "Les espaces réservés {after}.variable{before} seront remplacés par des données réelles. Assurez-vous de conserver ces variables.",
|
"expiration_email_templateDescription": "Les espaces réservés {after}.variable{before} seront remplacés par des données réelles. Assurez-vous de conserver ces variables.",
|
||||||
"failed": "Échoué",
|
"failed": "Échoué",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "Tchèque",
|
|
||||||
"de-DE": "Allemand",
|
|
||||||
"en-US": "anglais",
|
|
||||||
"es-ES": "Espagnol",
|
|
||||||
"es-MX": "Espagnol (Mexique)",
|
|
||||||
"fa-IR": "Persan",
|
|
||||||
"fi-FI": "finnois",
|
|
||||||
"fr-FR": "français",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "Hongrois",
|
|
||||||
"ja-JP": "Japonais",
|
|
||||||
"ko-KR": "coréen",
|
|
||||||
"no-NO": "Norvégien",
|
|
||||||
"pl-PL": "Polonais",
|
|
||||||
"pt-BR": "portugais (Brésil)",
|
|
||||||
"ro-RO": "Roumain",
|
|
||||||
"ru-RU": "Russe",
|
|
||||||
"th-TH": "thaïlandais",
|
|
||||||
"tr-TR": "turc",
|
|
||||||
"uk-UA": "Ukrainien",
|
|
||||||
"vi-VN": "Vietnamien",
|
|
||||||
"zh-CN": "français (France)",
|
|
||||||
"zh-HK": "chinois (traditionnel)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "Configuration ADS",
|
||||||
"Announcement Management": "Gestion des annonces",
|
"Announcement Management": "Gestion des annonces",
|
||||||
"Apple": "Identifiant Apple",
|
"Apple": "Identifiant Apple",
|
||||||
"Auth Control": "Contrôle d'authentification",
|
"Auth Control": "Contrôle d'authentification",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Utilisé uniquement pour l'affichage, toute modification entraînera un changement de toutes les unités monétaires dans le système",
|
"currencyUnitDescription": "Utilisé uniquement pour l'affichage, toute modification entraînera un changement de toutes les unités monétaires dans le système",
|
||||||
"saveSuccess": "Enregistrement réussi"
|
"saveSuccess": "Enregistrement réussi"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Enregistrement réussi",
|
||||||
|
"title": "Politique de confidentialité"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "HTML personnalisé",
|
||||||
|
"customHtmlDescription": "Code HTML personnalisé à injecter dans le bas de la balise body du site.",
|
||||||
|
"keywords": "Mots-clés",
|
||||||
|
"keywordsDescription": "Utilisé à des fins de référencement",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "Utilisé pour afficher l'emplacement où le LOGO doit être montré",
|
"logoDescription": "Utilisé pour afficher l'emplacement où le LOGO doit être montré",
|
||||||
"logoPlaceholder": "Veuillez entrer l'URL du LOGO, ne pas terminer par '/'",
|
"logoPlaceholder": "Veuillez entrer l'URL du LOGO, ne pas terminer par '/'",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "रद्द करें",
|
||||||
|
"confirm": "पुष्टि करें",
|
||||||
|
"confirmDelete": "हटाने की पुष्टि करें",
|
||||||
|
"create": "विज्ञापन बनाएं",
|
||||||
|
"createAds": "विज्ञापन बनाएं",
|
||||||
|
"createSuccess": "सफलता से बनाया गया",
|
||||||
|
"delete": "हटाएं",
|
||||||
|
"deleteSuccess": "सफलता से हटाया गया",
|
||||||
|
"deleteWarning": "क्या आप वास्तव में इस विज्ञापन को हटाना चाहते हैं?",
|
||||||
|
"disabled": "अक्षम",
|
||||||
|
"edit": "संपादित करें",
|
||||||
|
"editAds": "विज्ञापन संपादित करें",
|
||||||
|
"enabled": "सक्षम",
|
||||||
|
"form": {
|
||||||
|
"cancel": "रद्द करें",
|
||||||
|
"confirm": "पुष्टि करें",
|
||||||
|
"content": "सामग्री",
|
||||||
|
"description": "विवरण",
|
||||||
|
"endTime": "समाप्ति समय",
|
||||||
|
"enterContent": "कृपया विज्ञापन सामग्री दर्ज करें",
|
||||||
|
"enterDescription": "कृपया विज्ञापन विवरण दर्ज करें",
|
||||||
|
"enterEndTime": "कृपया समाप्ति समय चुनें",
|
||||||
|
"enterStartTime": "कृपया प्रारंभ समय चुनें",
|
||||||
|
"enterTargetUrl": "कृपया लक्षित URL दर्ज करें",
|
||||||
|
"enterTitle": "कृपया विज्ञापन शीर्षक दर्ज करें",
|
||||||
|
"startTime": "प्रारंभ समय",
|
||||||
|
"targetUrl": "लक्षित URL",
|
||||||
|
"title": "शीर्षक",
|
||||||
|
"type": "विज्ञापन प्रकार",
|
||||||
|
"typeImage": "छवि",
|
||||||
|
"typeVideo": "वीडियो"
|
||||||
|
},
|
||||||
|
"status": "स्थिति",
|
||||||
|
"targetUrl": "लक्षित URL",
|
||||||
|
"title": "शीर्षक",
|
||||||
|
"type": "प्रकार",
|
||||||
|
"updateSuccess": "सफलता से अपडेट किया गया",
|
||||||
|
"validityPeriod": "वैधता अवधि"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "वर्चुअल मशीन को ब्लॉक करें",
|
||||||
|
"blockVirtualMachineDescription": "जब सक्षम किया जाता है, तो उपकरणों को वर्चुअल मशीनों या एमुलेटर्स पर चलने से रोका जाएगा",
|
||||||
|
"communicationKey": "संचार कुंजी",
|
||||||
|
"communicationKeyDescription": "संचार कुंजी का उपयोग उपकरणों और सर्वरों के बीच सुरक्षित संचार के लिए किया जाता है",
|
||||||
"enable": "सक्रिय करें",
|
"enable": "सक्रिय करें",
|
||||||
"enableDescription": "सक्रिय करने के बाद, लॉगिन और पंजीकरण के लिए IMEI/IDFA/IDFV/AndroidID/Mac पता जैसे कई डिवाइस पहचानकर्ताओं का समर्थन किया जाता है"
|
"enableDescription": "सक्रिय करने के बाद, लॉगिन और पंजीकरण के लिए IMEI/IDFA/IDFV/AndroidID/Mac पता जैसे कई डिवाइस पहचानकर्ताओं का समर्थन किया जाता है",
|
||||||
|
"enableSecurity": "संचार एन्क्रिप्शन सक्षम करें",
|
||||||
|
"enableSecurityDescription": "जब सक्षम किया जाता है, तो उपकरणों और सर्वरों के बीच का संचार एन्क्रिप्ट किया जाएगा",
|
||||||
|
"saveFailed": "सहेजना विफल",
|
||||||
|
"saveSuccess": "सहेजना सफल",
|
||||||
|
"showAds": "विज्ञापन दिखाएँ",
|
||||||
|
"showAdsDescription": "जब सक्षम किया जाता है, तो उपकरणों पर विज्ञापन प्रदर्शित किए जाएंगे"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "ईमेल सत्यापन",
|
"emailVerification": "ईमेल सत्यापन",
|
||||||
"emailVerificationDescription": "सक्षम होने पर, उपयोगकर्ताओं को अपने ईमेल की पुष्टि करनी होगी",
|
"emailVerificationDescription": "सक्षम होने पर, उपयोगकर्ताओं को अपने ईमेल की पुष्टि करनी होगी",
|
||||||
"enable": "सक्षम करें",
|
"enable": "सक्षम करें",
|
||||||
"enableDescription": "सक्षम करने के बाद, मोबाइल फोन पंजीकरण, लॉगिन, बाइंडिंग, और अनबाइंडिंग कार्यक्षमताएँ सक्षम हो जाएँगी",
|
"enableDescription": "सक्षम करने के बाद, ईमेल पंजीकरण, लॉगिन, बाइंडिंग और अनबाइंडिंग कार्यक्षमताएँ सक्षम होंगी",
|
||||||
"expiration_email_template": "समाप्ति सूचना टेम्पलेट",
|
"expiration_email_template": "समाप्ति सूचना टेम्पलेट",
|
||||||
"expiration_email_templateDescription": "{after}.variable{before} प्लेसहोल्डर को वास्तविक डेटा से बदला जाएगा। सुनिश्चित करें कि इन वेरिएबल्स को बनाए रखें।",
|
"expiration_email_templateDescription": "{after}.variable{before} प्लेसहोल्डर को वास्तविक डेटा से बदला जाएगा। सुनिश्चित करें कि इन वेरिएबल्स को बनाए रखें।",
|
||||||
"failed": "असफल",
|
"failed": "असफल",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "चेक",
|
|
||||||
"de-DE": "जर्मन",
|
|
||||||
"en-US": "अंग्रेज़ी",
|
|
||||||
"es-ES": "स्पेनिश",
|
|
||||||
"es-MX": "स्पेनिश (मेक्सिको)",
|
|
||||||
"fa-IR": "फ़ारसी",
|
|
||||||
"fi-FI": "फिनिश",
|
|
||||||
"fr-FR": "फ्रेंच",
|
|
||||||
"hi-IN": "हिंदी",
|
|
||||||
"hu-HU": "हंगेरियन",
|
|
||||||
"ja-JP": "जापानी",
|
|
||||||
"ko-KR": "कोरियाई",
|
|
||||||
"no-NO": "नॉर्वेजियन",
|
|
||||||
"pl-PL": "पोलिश",
|
|
||||||
"pt-BR": "पुर्तगाली (ब्राज़ील)",
|
|
||||||
"ro-RO": "रोमानियाई",
|
|
||||||
"ru-RU": "रूसी",
|
|
||||||
"th-TH": "थाई",
|
|
||||||
"tr-TR": "तुर्की",
|
|
||||||
"uk-UA": "यूक्रेनी",
|
|
||||||
"vi-VN": "वियतनामी",
|
|
||||||
"zh-CN": "चीनी (सरल)",
|
|
||||||
"zh-HK": "चीनी (पारंपरिक)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "एडीएस कॉन्फ़िग",
|
||||||
"Announcement Management": "घोषणा प्रबंधन",
|
"Announcement Management": "घोषणा प्रबंधन",
|
||||||
"Apple": "एप्पल आईडी",
|
"Apple": "एप्पल आईडी",
|
||||||
"Auth Control": "प्रमाणिकरण नियंत्रण",
|
"Auth Control": "प्रमाणिकरण नियंत्रण",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "केवल प्रदर्शन के लिए उपयोग किया जाता है, परिवर्तन के बाद सिस्टम में सभी मुद्रा इकाइयाँ बदल जाएँगी",
|
"currencyUnitDescription": "केवल प्रदर्शन के लिए उपयोग किया जाता है, परिवर्तन के बाद सिस्टम में सभी मुद्रा इकाइयाँ बदल जाएँगी",
|
||||||
"saveSuccess": "सफलतापूर्वक सहेजा गया"
|
"saveSuccess": "सफलतापूर्वक सहेजा गया"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "सफलता से सहेजा गया",
|
||||||
|
"title": "गोपनीयता नीति"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "कस्टम HTML",
|
||||||
|
"customHtmlDescription": "साइट के bodyैग के नीचे इंजेक्ट करने के लिए कस्टम HTML कोड।",
|
||||||
|
"keywords": "कीवर्ड",
|
||||||
|
"keywordsDescription": "SEO उद्देश्यों के लिए उपयोग किया जाता है",
|
||||||
"logo": "लोगो",
|
"logo": "लोगो",
|
||||||
"logoDescription": "लोगो प्रदर्शित करने के लिए आवश्यक स्थान",
|
"logoDescription": "लोगो प्रदर्शित करने के लिए आवश्यक स्थान",
|
||||||
"logoPlaceholder": "कृपया लोगो का URL पता दर्ज करें, '/' के साथ समाप्त न करें",
|
"logoPlaceholder": "कृपया लोगो का URL पता दर्ज करें, '/' के साथ समाप्त न करें",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "Mégse",
|
||||||
|
"confirm": "Megerősítés",
|
||||||
|
"confirmDelete": "Törlés megerősítése",
|
||||||
|
"create": "Hirdetés létrehozása",
|
||||||
|
"createAds": "Hirdetés létrehozása",
|
||||||
|
"createSuccess": "Sikeresen létrehozva",
|
||||||
|
"delete": "Törlés",
|
||||||
|
"deleteSuccess": "Sikeresen törölve",
|
||||||
|
"deleteWarning": "Biztosan törölni szeretné ezt a hirdetést?",
|
||||||
|
"disabled": "Letiltva",
|
||||||
|
"edit": "Szerkesztés",
|
||||||
|
"editAds": "Hirdetés szerkesztése",
|
||||||
|
"enabled": "Engedélyezve",
|
||||||
|
"form": {
|
||||||
|
"cancel": "Mégse",
|
||||||
|
"confirm": "Megerősítés",
|
||||||
|
"content": "Tartalom",
|
||||||
|
"description": "Leírás",
|
||||||
|
"endTime": "Befejezési idő",
|
||||||
|
"enterContent": "Kérjük, adja meg a hirdetés tartalmát",
|
||||||
|
"enterDescription": "Kérjük, adja meg a hirdetés leírását",
|
||||||
|
"enterEndTime": "Kérjük, válassza ki a befejezési időt",
|
||||||
|
"enterStartTime": "Kérjük, válassza ki a kezdési időt",
|
||||||
|
"enterTargetUrl": "Kérjük, adja meg a cél URL-t",
|
||||||
|
"enterTitle": "Kérjük, adja meg a hirdetés címét",
|
||||||
|
"startTime": "Kezdési idő",
|
||||||
|
"targetUrl": "Cél URL",
|
||||||
|
"title": "Cím",
|
||||||
|
"type": "Hirdetés típusa",
|
||||||
|
"typeImage": "Kép",
|
||||||
|
"typeVideo": "Videó"
|
||||||
|
},
|
||||||
|
"status": "Állapot",
|
||||||
|
"targetUrl": "Cél URL",
|
||||||
|
"title": "Cím",
|
||||||
|
"type": "Típus",
|
||||||
|
"updateSuccess": "Sikeresen frissítve",
|
||||||
|
"validityPeriod": "Érvényességi időszak"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "Virtuális gép blokkolása",
|
||||||
|
"blockVirtualMachineDescription": "Ha engedélyezve van, az eszközök nem fognak tudni virtuális gépeken vagy emulátorokon futni",
|
||||||
|
"communicationKey": "Kommunikációs kulcs",
|
||||||
|
"communicationKeyDescription": "A kommunikációs kulcs a biztonságos kommunikációhoz szükséges az eszközök és a szerverek között",
|
||||||
"enable": "Engedélyezés",
|
"enable": "Engedélyezés",
|
||||||
"enableDescription": "Engedélyezés után több eszközazonosító, például IMEI/IDFA/IDFV/AndroidID/Mac-cím támogatott a bejelentkezéshez és a regisztrációhoz."
|
"enableDescription": "Engedélyezés után több eszközazonosító, például IMEI/IDFA/IDFV/AndroidID/Mac-cím támogatott a bejelentkezéshez és a regisztrációhoz.",
|
||||||
|
"enableSecurity": "Kommunikációs titkosítás engedélyezése",
|
||||||
|
"enableSecurityDescription": "Ha engedélyezve van, az eszközök és a szerverek közötti kommunikáció titkosítva lesz",
|
||||||
|
"saveFailed": "Mentés sikertelen",
|
||||||
|
"saveSuccess": "Mentés sikeres",
|
||||||
|
"showAds": "Hirdetések megjelenítése",
|
||||||
|
"showAdsDescription": "Ha engedélyezve van, hirdetések fognak megjelenni az eszközökön"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "Email ellenőrzés",
|
"emailVerification": "Email ellenőrzés",
|
||||||
"emailVerificationDescription": "Ha engedélyezve van, a felhasználóknak ellenőrizniük kell az e-mail címüket",
|
"emailVerificationDescription": "Ha engedélyezve van, a felhasználóknak ellenőrizniük kell az e-mail címüket",
|
||||||
"enable": "Engedélyez",
|
"enable": "Engedélyez",
|
||||||
"enableDescription": "A bekapcsolás után a mobiltelefon regisztráció, bejelentkezés, kötés és oldás funkciók elérhetővé válnak",
|
"enableDescription": "A funkció engedélyezése után az e-mailes regisztráció, bejelentkezés, kötés és leválasztás lehetőségei elérhetővé válnak.",
|
||||||
"expiration_email_template": "Lejárati Értesítő Sablon",
|
"expiration_email_template": "Lejárati Értesítő Sablon",
|
||||||
"expiration_email_templateDescription": "A {after}.variable{before} helyőrzőket tényleges adatokkal fogjuk helyettesíteni. Ügyeljen arra, hogy ezeket a változókat megtartsa.",
|
"expiration_email_templateDescription": "A {after}.variable{before} helyőrzőket tényleges adatokkal fogjuk helyettesíteni. Ügyeljen arra, hogy ezeket a változókat megtartsa.",
|
||||||
"failed": "Sikertelen",
|
"failed": "Sikertelen",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "cseh",
|
|
||||||
"de-DE": "német",
|
|
||||||
"en-US": "angol",
|
|
||||||
"es-ES": "spanyol",
|
|
||||||
"es-MX": "spanyol (Mexikó)",
|
|
||||||
"fa-IR": "Perzsa",
|
|
||||||
"fi-FI": "finn",
|
|
||||||
"fr-FR": "francia",
|
|
||||||
"hi-IN": "hindi",
|
|
||||||
"hu-HU": "magyar",
|
|
||||||
"ja-JP": "japán",
|
|
||||||
"ko-KR": "Koreai",
|
|
||||||
"no-NO": "norvég",
|
|
||||||
"pl-PL": "lengyel",
|
|
||||||
"pt-BR": "portugál (Brazília)",
|
|
||||||
"ro-RO": "román nyelv",
|
|
||||||
"ru-RU": "Orosz",
|
|
||||||
"th-TH": "thai nyelv",
|
|
||||||
"tr-TR": "török",
|
|
||||||
"uk-UA": "ukrán",
|
|
||||||
"vi-VN": "vietnámi",
|
|
||||||
"zh-CN": "kínai (egyszerűsített)",
|
|
||||||
"zh-HK": "Kínai (hagyományos)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "ADS konfiguráció",
|
||||||
"Announcement Management": "Hirdetménykezelés",
|
"Announcement Management": "Hirdetménykezelés",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
"Auth Control": "Hitelesítési vezérlés",
|
"Auth Control": "Hitelesítési vezérlés",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "Csak megjelenítésre használatos, a módosítás után a rendszer összes pénznem egysége megváltozik",
|
"currencyUnitDescription": "Csak megjelenítésre használatos, a módosítás után a rendszer összes pénznem egysége megváltozik",
|
||||||
"saveSuccess": "Sikeres mentés"
|
"saveSuccess": "Sikeres mentés"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "Mentés sikeres",
|
||||||
|
"title": "Adatvédelmi irányelvek"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "Egyedi HTML",
|
||||||
|
"customHtmlDescription": "Egyedi HTML kód, amelyet a webhely bodyímkéjének aljára kell beilleszteni.",
|
||||||
|
"keywords": "Kulcsszavak",
|
||||||
|
"keywordsDescription": "SEO célokra használva",
|
||||||
"logo": "LOGÓ",
|
"logo": "LOGÓ",
|
||||||
"logoDescription": "A LOGÓ megjelenítésére szolgáló hely",
|
"logoDescription": "A LOGÓ megjelenítésére szolgáló hely",
|
||||||
"logoPlaceholder": "Kérjük, adja meg a LOGÓ URL-címét, ne végződjön '/' jellel",
|
"logoPlaceholder": "Kérjük, adja meg a LOGÓ URL-címét, ne végződjön '/' jellel",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "キャンセル",
|
||||||
|
"confirm": "確認",
|
||||||
|
"confirmDelete": "削除を確認",
|
||||||
|
"create": "広告を作成",
|
||||||
|
"createAds": "広告を作成",
|
||||||
|
"createSuccess": "作成に成功しました",
|
||||||
|
"delete": "削除",
|
||||||
|
"deleteSuccess": "削除に成功しました",
|
||||||
|
"deleteWarning": "この広告を削除してもよろしいですか?",
|
||||||
|
"disabled": "無効",
|
||||||
|
"edit": "編集",
|
||||||
|
"editAds": "広告を編集",
|
||||||
|
"enabled": "有効",
|
||||||
|
"form": {
|
||||||
|
"cancel": "キャンセル",
|
||||||
|
"confirm": "確認",
|
||||||
|
"content": "コンテンツ",
|
||||||
|
"description": "説明",
|
||||||
|
"endTime": "終了時間",
|
||||||
|
"enterContent": "広告の内容を入力してください",
|
||||||
|
"enterDescription": "広告の説明を入力してください",
|
||||||
|
"enterEndTime": "終了時間を選択してください",
|
||||||
|
"enterStartTime": "開始時間を選択してください",
|
||||||
|
"enterTargetUrl": "ターゲットURLを入力してください",
|
||||||
|
"enterTitle": "広告のタイトルを入力してください",
|
||||||
|
"startTime": "開始時間",
|
||||||
|
"targetUrl": "ターゲットURL",
|
||||||
|
"title": "タイトル",
|
||||||
|
"type": "広告の種類",
|
||||||
|
"typeImage": "画像",
|
||||||
|
"typeVideo": "動画"
|
||||||
|
},
|
||||||
|
"status": "ステータス",
|
||||||
|
"targetUrl": "ターゲットURL",
|
||||||
|
"title": "タイトル",
|
||||||
|
"type": "種類",
|
||||||
|
"updateSuccess": "更新に成功しました",
|
||||||
|
"validityPeriod": "有効期限"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "仮想マシンをブロック",
|
||||||
|
"blockVirtualMachineDescription": "有効にすると、デバイスは仮想マシンやエミュレーター上での実行が禁止されます",
|
||||||
|
"communicationKey": "通信キー",
|
||||||
|
"communicationKeyDescription": "通信キーは、デバイスとサーバー間の安全な通信に使用されます",
|
||||||
"enable": "有効化",
|
"enable": "有効化",
|
||||||
"enableDescription": "有効化後、ログインおよび登録のために、IMEI/IDFA/IDFV/AndroidID/Macアドレスなどの複数のデバイス識別子がサポートされます。"
|
"enableDescription": "有効化後、ログインおよび登録のために、IMEI/IDFA/IDFV/AndroidID/Macアドレスなどの複数のデバイス識別子がサポートされます。",
|
||||||
|
"enableSecurity": "通信暗号化を有効にする",
|
||||||
|
"enableSecurityDescription": "有効にすると、デバイスとサーバー間の通信が暗号化されます",
|
||||||
|
"saveFailed": "保存に失敗しました",
|
||||||
|
"saveSuccess": "保存に成功しました",
|
||||||
|
"showAds": "広告を表示",
|
||||||
|
"showAdsDescription": "有効にすると、デバイスに広告が表示されます"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "メール確認",
|
"emailVerification": "メール確認",
|
||||||
"emailVerificationDescription": "有効にすると、ユーザーはメールを確認する必要があります",
|
"emailVerificationDescription": "有効にすると、ユーザーはメールを確認する必要があります",
|
||||||
"enable": "有効にする",
|
"enable": "有効にする",
|
||||||
"enableDescription": "有効にすると、携帯電話の登録、ログイン、バインディング、バインディング解除の機能が有効になります",
|
"enableDescription": "有効にすると、メールによる登録、ログイン、バインディング、およびバインディング解除の機能が有効になります",
|
||||||
"expiration_email_template": "有効期限通知テンプレート",
|
"expiration_email_template": "有効期限通知テンプレート",
|
||||||
"expiration_email_templateDescription": "{after}.variable{before} のプレースホルダーは実際のデータに置き換えられます。これらの変数を必ず保持してください。",
|
"expiration_email_templateDescription": "{after}.variable{before} のプレースホルダーは実際のデータに置き換えられます。これらの変数を必ず保持してください。",
|
||||||
"failed": "失敗しました",
|
"failed": "失敗しました",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "チェコ語",
|
|
||||||
"de-DE": "ドイツ語",
|
|
||||||
"en-US": "英語",
|
|
||||||
"es-ES": "スペイン語",
|
|
||||||
"es-MX": "スペイン語(メキシコ)",
|
|
||||||
"fa-IR": "ペルシャ語",
|
|
||||||
"fi-FI": "フィンランド語",
|
|
||||||
"fr-FR": "フランス語",
|
|
||||||
"hi-IN": "ヒンディー語",
|
|
||||||
"hu-HU": "ハンガリー語",
|
|
||||||
"ja-JP": "日本語",
|
|
||||||
"ko-KR": "韓国語",
|
|
||||||
"no-NO": "ノルウェー語",
|
|
||||||
"pl-PL": "ポーランド語",
|
|
||||||
"pt-BR": "ポルトガル語(ブラジル)",
|
|
||||||
"ro-RO": "ルーマニア語",
|
|
||||||
"ru-RU": "ロシア語",
|
|
||||||
"th-TH": "タイ語",
|
|
||||||
"tr-TR": "トルコ語",
|
|
||||||
"uk-UA": "ウクライナ語",
|
|
||||||
"vi-VN": "ベトナム語",
|
|
||||||
"zh-CN": "日本語",
|
|
||||||
"zh-HK": "中国語(繁体字)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "ADS設定",
|
||||||
"Announcement Management": "お知らせ管理",
|
"Announcement Management": "お知らせ管理",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
"Auth Control": "認証管理",
|
"Auth Control": "認証管理",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "表示のみに使用され、変更するとシステム内のすべての通貨単位が変更されます",
|
"currencyUnitDescription": "表示のみに使用され、変更するとシステム内のすべての通貨単位が変更されます",
|
||||||
"saveSuccess": "保存に成功しました"
|
"saveSuccess": "保存に成功しました"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "保存に成功しました",
|
||||||
|
"title": "プライバシーポリシー"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "カスタムHTML",
|
||||||
|
"customHtmlDescription": "サイトの body タグの下部に挿入されるカスタム HTML コード。",
|
||||||
|
"keywords": "キーワード",
|
||||||
|
"keywordsDescription": "SEO目的で使用されます",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "LOGOを表示する必要がある場所に使用されます",
|
"logoDescription": "LOGOを表示する必要がある場所に使用されます",
|
||||||
"logoPlaceholder": "LOGOのURLアドレスを入力してください。末尾に'/'を付けないでください",
|
"logoPlaceholder": "LOGOのURLアドレスを入力してください。末尾に'/'を付けないでください",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "취소",
|
||||||
|
"confirm": "확인",
|
||||||
|
"confirmDelete": "삭제 확인",
|
||||||
|
"create": "광고 만들기",
|
||||||
|
"createAds": "광고 생성",
|
||||||
|
"createSuccess": "성공적으로 생성되었습니다",
|
||||||
|
"delete": "삭제",
|
||||||
|
"deleteSuccess": "성공적으로 삭제되었습니다",
|
||||||
|
"deleteWarning": "이 광고를 삭제하시겠습니까?",
|
||||||
|
"disabled": "비활성화됨",
|
||||||
|
"edit": "편집",
|
||||||
|
"editAds": "광고 편집",
|
||||||
|
"enabled": "활성화됨",
|
||||||
|
"form": {
|
||||||
|
"cancel": "취소",
|
||||||
|
"confirm": "확인",
|
||||||
|
"content": "내용",
|
||||||
|
"description": "설명",
|
||||||
|
"endTime": "종료 시간",
|
||||||
|
"enterContent": "광고 내용을 입력하세요",
|
||||||
|
"enterDescription": "광고 설명을 입력하세요",
|
||||||
|
"enterEndTime": "종료 시간을 선택하세요",
|
||||||
|
"enterStartTime": "시작 시간을 선택하세요",
|
||||||
|
"enterTargetUrl": "대상 URL을 입력하세요",
|
||||||
|
"enterTitle": "광고 제목을 입력하세요",
|
||||||
|
"startTime": "시작 시간",
|
||||||
|
"targetUrl": "대상 URL",
|
||||||
|
"title": "제목",
|
||||||
|
"type": "광고 유형",
|
||||||
|
"typeImage": "이미지",
|
||||||
|
"typeVideo": "비디오"
|
||||||
|
},
|
||||||
|
"status": "상태",
|
||||||
|
"targetUrl": "대상 URL",
|
||||||
|
"title": "제목",
|
||||||
|
"type": "유형",
|
||||||
|
"updateSuccess": "성공적으로 업데이트되었습니다",
|
||||||
|
"validityPeriod": "유효 기간"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "가상 머신 차단",
|
||||||
|
"blockVirtualMachineDescription": "활성화되면, 장치가 가상 머신이나 에뮬레이터에서 실행되는 것을 방지합니다.",
|
||||||
|
"communicationKey": "통신 키",
|
||||||
|
"communicationKeyDescription": "통신 키는 장치와 서버 간의 안전한 통신을 위해 사용됩니다.",
|
||||||
"enable": "활성화",
|
"enable": "활성화",
|
||||||
"enableDescription": "활성화 후 IMEI/IDFA/IDFV/AndroidID/Mac 주소와 같은 여러 장치 식별자를 사용하여 로그인 및 등록할 수 있습니다."
|
"enableDescription": "활성화 후 IMEI/IDFA/IDFV/AndroidID/Mac 주소와 같은 여러 장치 식별자를 사용하여 로그인 및 등록할 수 있습니다.",
|
||||||
|
"enableSecurity": "통신 암호화 활성화",
|
||||||
|
"enableSecurityDescription": "활성화되면, 장치와 서버 간의 통신이 암호화됩니다.",
|
||||||
|
"saveFailed": "저장 실패",
|
||||||
|
"saveSuccess": "저장 성공",
|
||||||
|
"showAds": "광고 표시",
|
||||||
|
"showAdsDescription": "활성화되면, 장치에 광고가 표시됩니다."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "이메일 인증",
|
"emailVerification": "이메일 인증",
|
||||||
"emailVerificationDescription": "활성화되면 사용자는 이메일을 인증해야 합니다",
|
"emailVerificationDescription": "활성화되면 사용자는 이메일을 인증해야 합니다",
|
||||||
"enable": "사용",
|
"enable": "사용",
|
||||||
"enableDescription": "활성화 후, 휴대폰 등록, 로그인, 연결 및 연결 해제 기능이 활성화됩니다",
|
"enableDescription": "활성화하면 이메일 등록, 로그인, 바인딩 및 바인딩 해제 기능이 활성화됩니다.",
|
||||||
"expiration_email_template": "만료 알림 템플릿",
|
"expiration_email_template": "만료 알림 템플릿",
|
||||||
"expiration_email_templateDescription": "{after}.variable{before} 자리표시는 실제 데이터로 대체됩니다. 이 변수를 반드시 유지하십시오.",
|
"expiration_email_templateDescription": "{after}.variable{before} 자리표시는 실제 데이터로 대체됩니다. 이 변수를 반드시 유지하십시오.",
|
||||||
"failed": "실패",
|
"failed": "실패",
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"cs-CZ": "체코어",
|
|
||||||
"de-DE": "독일어",
|
|
||||||
"en-US": "영어",
|
|
||||||
"es-ES": "스페인어",
|
|
||||||
"es-MX": "스페인어(멕시코)",
|
|
||||||
"fa-IR": "페르시아어",
|
|
||||||
"fi-FI": "핀란드어",
|
|
||||||
"fr-FR": "프랑스어",
|
|
||||||
"hi-IN": "힌디어",
|
|
||||||
"hu-HU": "헝가리어",
|
|
||||||
"ja-JP": "일본어",
|
|
||||||
"ko-KR": "한국어",
|
|
||||||
"no-NO": "노르웨이어",
|
|
||||||
"pl-PL": "폴란드어",
|
|
||||||
"pt-BR": "포르투갈어(브라질)",
|
|
||||||
"ro-RO": "루마니아어",
|
|
||||||
"ru-RU": "러시아어",
|
|
||||||
"th-TH": "태국어",
|
|
||||||
"tr-TR": "터키어",
|
|
||||||
"uk-UA": "우크라이나어",
|
|
||||||
"vi-VN": "베트남어",
|
|
||||||
"zh-CN": "중국어(간체)",
|
|
||||||
"zh-HK": "중국어(번체)"
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"ADS Config": "ADS 구성",
|
||||||
"Announcement Management": "공지 관리",
|
"Announcement Management": "공지 관리",
|
||||||
"Apple": "Apple ID",
|
"Apple": "Apple ID",
|
||||||
"Auth Control": "인증 제어",
|
"Auth Control": "인증 제어",
|
||||||
|
|||||||
@@ -8,7 +8,15 @@
|
|||||||
"currencyUnitDescription": "표시용으로만 사용되며, 변경 시 시스템 내 모든 통화 단위가 변경됩니다",
|
"currencyUnitDescription": "표시용으로만 사용되며, 변경 시 시스템 내 모든 통화 단위가 변경됩니다",
|
||||||
"saveSuccess": "저장 성공"
|
"saveSuccess": "저장 성공"
|
||||||
},
|
},
|
||||||
|
"privacy-policy": {
|
||||||
|
"saveSuccess": "저장 성공",
|
||||||
|
"title": "개인정보 처리방침"
|
||||||
|
},
|
||||||
"site": {
|
"site": {
|
||||||
|
"customHtml": "사용자 정의 HTML",
|
||||||
|
"customHtmlDescription": "사이트의 body그 하단에 삽입될 사용자 정의 HTML 코드입니다.",
|
||||||
|
"keywords": "키워드",
|
||||||
|
"keywordsDescription": "SEO 목적으로 사용됨",
|
||||||
"logo": "LOGO",
|
"logo": "LOGO",
|
||||||
"logoDescription": "LOGO를 표시해야 하는 위치에 사용됩니다",
|
"logoDescription": "LOGO를 표시해야 하는 위치에 사용됩니다",
|
||||||
"logoPlaceholder": "LOGO의 URL 주소를 입력하세요. '/'로 끝나지 않도록 하세요",
|
"logoPlaceholder": "LOGO의 URL 주소를 입력하세요. '/'로 끝나지 않도록 하세요",
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"confirm": "Bekreft",
|
||||||
|
"confirmDelete": "Bekreft sletting",
|
||||||
|
"create": "Opprett annonse",
|
||||||
|
"createAds": "Opprett annonse",
|
||||||
|
"createSuccess": "Opprettet med suksess",
|
||||||
|
"delete": "Slett",
|
||||||
|
"deleteSuccess": "Slettet med suksess",
|
||||||
|
"deleteWarning": "Er du sikker på at du vil slette denne annonsen?",
|
||||||
|
"disabled": "Deaktivert",
|
||||||
|
"edit": "Rediger",
|
||||||
|
"editAds": "Rediger annonse",
|
||||||
|
"enabled": "Aktivert",
|
||||||
|
"form": {
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"confirm": "Bekreft",
|
||||||
|
"content": "Innhold",
|
||||||
|
"description": "Beskrivelse",
|
||||||
|
"endTime": "Sluttid",
|
||||||
|
"enterContent": "Vennligst skriv inn annonseinnhold",
|
||||||
|
"enterDescription": "Vennligst skriv inn annonsebeskrivelse",
|
||||||
|
"enterEndTime": "Vennligst velg sluttid",
|
||||||
|
"enterStartTime": "Vennligst velg starttid",
|
||||||
|
"enterTargetUrl": "Vennligst skriv inn mål-URL",
|
||||||
|
"enterTitle": "Vennligst skriv inn annonsetittel",
|
||||||
|
"startTime": "Starttid",
|
||||||
|
"targetUrl": "Mål-URL",
|
||||||
|
"title": "Tittel",
|
||||||
|
"type": "Annonsetype",
|
||||||
|
"typeImage": "Bilde",
|
||||||
|
"typeVideo": "Video"
|
||||||
|
},
|
||||||
|
"status": "Status",
|
||||||
|
"targetUrl": "Mål-URL",
|
||||||
|
"title": "Tittel",
|
||||||
|
"type": "Type",
|
||||||
|
"updateSuccess": "Oppdatert med suksess",
|
||||||
|
"validityPeriod": "Gyldighetsperiode"
|
||||||
|
}
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
{
|
{
|
||||||
|
"blockVirtualMachine": "Blokker virtuell maskin",
|
||||||
|
"blockVirtualMachineDescription": "Når aktivert, vil enheter bli forhindret fra å kjøre på virtuelle maskiner eller emulatorer",
|
||||||
|
"communicationKey": "Kommunikasjonsnøkkel",
|
||||||
|
"communicationKeyDescription": "Kommunikasjonsnøkkelen brukes for sikker kommunikasjon mellom enheter og servere",
|
||||||
"enable": "Aktiver",
|
"enable": "Aktiver",
|
||||||
"enableDescription": "Etter aktivering støttes flere enhetsidentifikatorer som IMEI/IDFA/IDFV/AndroidID/Mac-adresse for pålogging og registrering"
|
"enableDescription": "Etter aktivering støttes flere enhetsidentifikatorer som IMEI/IDFA/IDFV/AndroidID/Mac-adresse for pålogging og registrering",
|
||||||
|
"enableSecurity": "Aktiver kommunikasjonskryptering",
|
||||||
|
"enableSecurityDescription": "Når aktivert, vil kommunikasjonen mellom enheter og servere bli kryptert",
|
||||||
|
"saveFailed": "Lagring mislyktes",
|
||||||
|
"saveSuccess": "Lagring vellykket",
|
||||||
|
"showAds": "Vis annonser",
|
||||||
|
"showAdsDescription": "Når aktivert, vil annonser bli vist på enhetene"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"emailVerification": "E-postbekreftelse",
|
"emailVerification": "E-postbekreftelse",
|
||||||
"emailVerificationDescription": "Når aktivert, må brukere bekrefte e-posten sin",
|
"emailVerificationDescription": "Når aktivert, må brukere bekrefte e-posten sin",
|
||||||
"enable": "Aktiver",
|
"enable": "Aktiver",
|
||||||
"enableDescription": "Etter aktivering vil funksjonene for registrering, innlogging, binding og frakobling av mobiltelefon bli aktivert",
|
"enableDescription": "Etter aktivering vil funksjonene for e-postregistrering, innlogging, binding og avbinding bli aktivert",
|
||||||
"expiration_email_template": "Utløpsvarsel Mal",
|
"expiration_email_template": "Utløpsvarsel Mal",
|
||||||
"expiration_email_templateDescription": "Plassholderne {after}.variable{before} vil bli erstattet med faktiske data. Sørg for å beholde disse variablene.",
|
"expiration_email_templateDescription": "Plassholderne {after}.variable{before} vil bli erstattet med faktiske data. Sørg for å beholde disse variablene.",
|
||||||
"failed": "Mislyktes",
|
"failed": "Mislyktes",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user