@ -0,0 +1,3 @@ |
|||
# Account Module |
|||
|
|||
TODO |
|||
@ -0,0 +1,3 @@ |
|||
## Basic Theme |
|||
|
|||
TODO |
|||
@ -0,0 +1,290 @@ |
|||
# Config State |
|||
|
|||
`ConfigStateService` is a singleton service, i.e. provided in root level of your application, and is actually a façade for interacting with application configuration state in the `Store`. |
|||
|
|||
## Before Use |
|||
|
|||
In order to use the `ConfigStateService` you must inject it in your class as a dependency. |
|||
|
|||
```js |
|||
import { ConfigStateService } from '@abp/ng.core'; |
|||
|
|||
@Component({ |
|||
/* class metadata here */ |
|||
}) |
|||
class DemoComponent { |
|||
constructor(private config: ConfigStateService) {} |
|||
} |
|||
``` |
|||
|
|||
You do not have to provide the `ConfigStateService` at module or component/directive level, because it is already **provided in root**. |
|||
|
|||
## Selector Methods |
|||
|
|||
`ConfigStateService` has numerous selector methods which allow you to get a specific configuration or all configurations from the `Store`. |
|||
|
|||
### How to Get All Configurations From the Store |
|||
|
|||
You can use the `getAll` method of `ConfigStateService` to get all of the configuration object from the store. It is used as follows: |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const config = this.config.getAll(); |
|||
``` |
|||
|
|||
### How to Get a Specific Configuration From the Store |
|||
|
|||
You can use the `getOne` method of `ConfigStateService` to get a specific configuration property from the store. For that, the property name should be passed to the method as parameter. |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const currentUser = this.config.getOne("currentUser"); |
|||
``` |
|||
|
|||
On occasion, you will probably want to be more specific than getting just the current user. For example, here is how you can get the `tenantId`: |
|||
|
|||
```js |
|||
const tenantId = this.config.getDeep("currentUser.tenantId"); |
|||
``` |
|||
|
|||
or by giving an array of keys as parameter: |
|||
|
|||
```js |
|||
const tenantId = this.config.getDeep(["currentUser", "tenantId"]); |
|||
``` |
|||
|
|||
FYI, `getDeep` is able to do everything `getOne` does. Just keep in mind that `getOne` is slightly faster. |
|||
|
|||
#### Config State Properties |
|||
|
|||
Please refer to `Config.State` type for all the properties you can get with `getOne` and `getDeep`. It can be found in the [config.ts file](https://github.com/abpframework/abp/blob/dev/npm/ng-packs/packages/core/src/lib/models/config.ts#L7). |
|||
|
|||
### How to Get the Application Information From the Store |
|||
|
|||
The `getApplicationInfo` method is used to get the application information from the environment variables stored as the config state. This is how you can use it: |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const appInfo = this.config.getApplicationInfo(); |
|||
``` |
|||
|
|||
This method never returns `undefined` or `null` and returns an empty object literal (`{}`) instead. In other words, you will never get an error when referring to the properties of `appInfo` above. |
|||
|
|||
#### Application Information Properties |
|||
|
|||
Please refer to `Config.Application` type for all the properties you can get with `getApplicationInfo`. It can be found in the [config.ts file](https://github.com/abpframework/abp/blob/dev/npm/ng-packs/packages/core/src/lib/models/config.ts#L21). |
|||
|
|||
### How to Get API URL From the Store |
|||
|
|||
The `getApplicationInfo` method is used to get a specific API URL from the environment variables stored as the config state. This is how you can use it: |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const apiUrl = this.config.getApiUrl(); |
|||
// environment.apis.default.url |
|||
|
|||
const searchUrl = this.config.getApiUrl("search"); |
|||
// environment.apis.search.url |
|||
``` |
|||
|
|||
This method returns the `url` of a specific API based on the key given as its only parameter. If there is no key, `'default'` is used. |
|||
|
|||
### How to Get All Settings From the Store |
|||
|
|||
You can use the `getSettings` method of `ConfigStateService` to get all of the settings object from the configuration state. Here is how you get all settings: |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const settings = this.config.getSettings(); |
|||
``` |
|||
|
|||
In addition, the method lets you search settings by **passing a keyword** to it. |
|||
|
|||
```js |
|||
const localizationSettings = this.config.getSettings("Localization"); |
|||
/* |
|||
{ |
|||
'Abp.Localization.DefaultLanguage': 'en' |
|||
} |
|||
*/ |
|||
``` |
|||
|
|||
Beware though, **settings search is case sensitive**. |
|||
|
|||
### How to Get a Specific Setting From the Store |
|||
|
|||
You can use the `getSetting` method of `ConfigStateService` to get a specific setting from the configuration state. Here is an example: |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const defaultLang = this.config.getSetting("Abp.Localization.DefaultLanguage"); |
|||
// 'en' |
|||
``` |
|||
|
|||
### How to Get a Specific Permission From the Store |
|||
|
|||
You can use the `getGrantedPolicy` method of `ConfigStateService` to get a specific permission from the configuration state. For that, you should pass a policy key as parameter to the method. |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const hasIdentityPermission = this.config.getGrantedPolicy("Abp.Identity"); |
|||
// true |
|||
``` |
|||
|
|||
You may also **combine policy keys** to fine tune your selection: |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const hasIdentityAndAccountPermission = this.config.getGrantedPolicy( |
|||
"Abp.Identity && Abp.Account" |
|||
); |
|||
// false |
|||
|
|||
const hasIdentityOrAccountPermission = this.config.getGrantedPolicy( |
|||
"Abp.Identity || Abp.Account" |
|||
); |
|||
// true |
|||
``` |
|||
|
|||
Please consider the following **rules** when creating your permission selectors: |
|||
|
|||
- Maximum 2 keys can be combined. |
|||
- `&&` operator looks for both keys. |
|||
- `||` operator looks for either key. |
|||
- Empty string `''` as key will return `true` |
|||
- Using an operator without a second key will return `false` |
|||
|
|||
### How to Get Translations From the Store |
|||
|
|||
The `getLocalization` method of `ConfigStateService` is used for translations. Here are some examples: |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const identity = this.config.getLocalization("AbpIdentity::Identity"); |
|||
// 'identity' |
|||
|
|||
const notFound = this.config.getLocalization("AbpIdentity::IDENTITY"); |
|||
// 'AbpIdentity::IDENTITY' |
|||
|
|||
const defaultValue = this.config.getLocalization({ |
|||
key: "AbpIdentity::IDENTITY", |
|||
defaultValue: "IDENTITY" |
|||
}); |
|||
// 'IDENTITY' |
|||
``` |
|||
|
|||
Please check out the [localization documentation](./Localization.md) for details. |
|||
|
|||
## Dispatch Methods |
|||
|
|||
`ConfigStateService` has several dispatch methods which allow you to conveniently dispatch predefined actions to the `Store`. |
|||
|
|||
### How to Get Application Configuration From Server |
|||
|
|||
The `dispatchGetAppConfiguration` triggers a request to an endpoint that responds with the application state and then places this response to the `Store` as configuration state. |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
this.config.dispatchGetAppConfiguration(); |
|||
// returns a state stream which emits after dispatch action is complete |
|||
``` |
|||
|
|||
Note that **you do not have to call this method at application initiation**, because the application configuration is already being received from the server at start. |
|||
|
|||
### How to Patch Route Configuration |
|||
|
|||
The `dispatchPatchRouteByName` finds a route by its name and replaces its configuration in the `Store` with the new configuration passed as the second parameter. |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const newRouteConfig: Partial<ABP.Route> = { |
|||
name: "Home", |
|||
path: "home", |
|||
children: [ |
|||
{ |
|||
name: "Dashboard", |
|||
path: "dashboard" |
|||
} |
|||
] |
|||
}; |
|||
|
|||
this.config.dispatchPatchRouteByName("::Menu:Home", newRouteConfig); |
|||
// returns a state stream which emits after dispatch action is complete |
|||
``` |
|||
|
|||
### How to Add a New Route Configuration |
|||
|
|||
The `dispatchAddRoute` adds a new route to the configuration state in the `Store`. For this, the route config should be passed as the parameter of the method. |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const newRoute: ABP.Route = { |
|||
name: "My New Page", |
|||
iconClass: "fa fa-dashboard", |
|||
path: "page", |
|||
invisible: false, |
|||
order: 2, |
|||
requiredPolicy: "MyProjectName::MyNewPage" |
|||
}; |
|||
|
|||
this.config.dispatchAddRoute(newRoute); |
|||
// returns a state stream which emits after dispatch action is complete |
|||
``` |
|||
|
|||
The `newRoute` will be placed as at root level, i.e. without any parent routes and its url will be stored as `'/path'`. |
|||
|
|||
If you want **to add a child route, you can do this:** |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
const newRoute: ABP.Route = { |
|||
parentName: "AbpAccount::Login", |
|||
name: "My New Page", |
|||
iconClass: "fa fa-dashboard", |
|||
path: "page", |
|||
invisible: false, |
|||
order: 2, |
|||
requiredPolicy: "MyProjectName::MyNewPage" |
|||
}; |
|||
|
|||
this.config.dispatchAddRoute(newRoute); |
|||
// returns a state stream which emits after dispatch action is complete |
|||
``` |
|||
|
|||
The `newRoute` will then be placed as a child of the parent route named `'AbpAccount::Login'` and its url will be set as `'/account/login/page'`. |
|||
|
|||
#### Route Configuration Properties |
|||
|
|||
Please refer to `ABP.Route` type for all the properties you can pass to `dispatchSetEnvironment` in its parameter. It can be found in the [common.ts file](https://github.com/abpframework/abp/blob/dev/npm/ng-packs/packages/core/src/lib/models/common.ts#L27). |
|||
|
|||
### How to Set the Environment |
|||
|
|||
The `dispatchSetEnvironment` places environment variables passed to it in the `Store` under the configuration state. Here is how it is used: |
|||
|
|||
```js |
|||
// this.config is instance of ConfigStateService |
|||
|
|||
this.config.dispatchSetEnvironment({ |
|||
/* environment properties here */ |
|||
}); |
|||
// returns a state stream which emits after dispatch action is complete |
|||
``` |
|||
|
|||
Note that **you do not have to call this method at application initiation**, because the environment variables are already being stored at start. |
|||
|
|||
#### Environment Properties |
|||
|
|||
Please refer to `Config.Environment` type for all the properties you can pass to `dispatchSetEnvironment` as parameter. It can be found in the [config.ts file](https://github.com/abpframework/abp/blob/dev/npm/ng-packs/packages/core/src/lib/models/config.ts#L13). |
|||
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 8.1 KiB |
@ -0,0 +1,3 @@ |
|||
# Layout Hooks |
|||
|
|||
TODO |
|||
@ -0,0 +1,3 @@ |
|||
# Navigation Menu |
|||
|
|||
TODO |
|||
@ -1,3 +1,26 @@ |
|||
## ABP Tag Helpers |
|||
# ABP Tag Helpers |
|||
|
|||
"ABP tag helpers" documentation is creating now. You can see a [demo of components](http://bootstrap-taghelpers.abp.io/) for now. |
|||
ABP Framework defines a set of **tag helper components** to simply the user interface development for ASP.NET Core (MVC / Razor Pages) applications. |
|||
|
|||
## Bootstrap Component Wrappers |
|||
|
|||
Most of the tag helpers are [Bootstrap](https://getbootstrap.com/) (v4+) wrappers. Coding bootstrap is not so easy, not so type-safe and contains too much repetitive HTML tags. ABP Tag Helpers makes it **easier** and **type safe**. |
|||
|
|||
We don't aim to wrap bootstrap components 100%. Writing **native bootstrap style code** is still possible (actually, tag helpers generates native bootstrap code in the end), but we suggest to use the tag helpers wherever possible. |
|||
|
|||
ABP Framework also adds some **useful features** to the standard bootstrap components. |
|||
|
|||
Here, the list of components those are wrapped by the ABP Framework: |
|||
|
|||
* [Buttons](Buttons.md) |
|||
* ... |
|||
|
|||
> Until all the tag helpers are documented, you can visit https://bootstrap-taghelpers.abp.io/ to see them with live samples. |
|||
|
|||
## Form Elements |
|||
|
|||
See [demo](https://bootstrap-taghelpers.abp.io/Components/FormElements). |
|||
|
|||
## Dynamic Inputs |
|||
|
|||
See [demo](https://bootstrap-taghelpers.abp.io/Components/DynamicForms). |
|||
|
Before Width: | Height: | Size: 1.2 KiB |
@ -1,3 +1,3 @@ |
|||
# Theming |
|||
# ASP.NET Core MVC / Razor Pages Theming |
|||
|
|||
TODO |
|||
@ -0,0 +1,3 @@ |
|||
# Toolbars |
|||
|
|||
TODO |
|||
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
@ -0,0 +1,198 @@ |
|||
using System.Collections.Generic; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Threading.Tasks; |
|||
using Newtonsoft.Json; |
|||
using Newtonsoft.Json.Linq; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Cli.ProjectModification |
|||
{ |
|||
public class AngularModuleSourceCodeAdder : ITransientDependency |
|||
{ |
|||
public async Task AddAsync(string solutionFilePath, string angularPath) |
|||
{ |
|||
var angularProjectsPath = Path.Combine(angularPath, "projects"); |
|||
|
|||
var projects = await CopyAndGetNamesOfAngularProjectsAsync(solutionFilePath, angularProjectsPath); |
|||
|
|||
if (!projects.Any()) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
await ReplaceProjectNamesAndCopySourCodeRequirementsToProjectsAsync(angularProjectsPath, projects); |
|||
|
|||
await RemoveRedundantFilesAsync(angularProjectsPath, projects); |
|||
|
|||
await AddPathsToTsConfigAsync(angularPath, angularProjectsPath, projects); |
|||
|
|||
await AddProjectToAngularJsonAsync(angularPath, projects); |
|||
} |
|||
|
|||
private async Task AddProjectToAngularJsonAsync(string angularPath, List<string> projects) |
|||
{ |
|||
var angularJsonFilePath = Path.Combine(angularPath, "angular.json"); |
|||
var fileContent = File.ReadAllText(angularJsonFilePath); |
|||
|
|||
var json = JObject.Parse(fileContent); |
|||
|
|||
var projectsJobject = (JObject)json["projects"]; |
|||
|
|||
foreach (var project in projects) |
|||
{ |
|||
projectsJobject.Add(project, new JObject( |
|||
new JProperty("projectType", "library"), |
|||
new JProperty("root", $"projects/{project}"), |
|||
new JProperty("sourceRoot", $"projects/{project}/src"), |
|||
new JProperty("prefix", "lib"), |
|||
new JProperty("architect", new JObject( |
|||
new JProperty("build", new JObject( |
|||
new JProperty("builder", "@angular-devkit/build-ng-package:build"), |
|||
new JProperty("options", new JObject( |
|||
new JProperty("tsConfig", $"projects/{project}/tsconfig.lib.json"), |
|||
new JProperty("project", $"projects/{project}/ng-package.json") |
|||
)), |
|||
new JProperty("configurations", new JObject( |
|||
new JProperty("production", new JObject( |
|||
new JProperty("tsConfig", $"projects/{project}/tsconfig.lib.prod.json"))) |
|||
)))), |
|||
new JProperty("test", new JObject( |
|||
new JProperty("builder", "@angular-devkit/build-angular:karma"), |
|||
new JProperty("options", new JObject( |
|||
new JProperty("main", $"projects/{project}/src/test.ts"), |
|||
new JProperty("tsConfig", $"projects/{project}/tsconfig.spec.json"), |
|||
new JProperty("karmaConfig", $"projects/{project}/karma.conf.js") |
|||
) |
|||
))), |
|||
new JProperty("lint", new JObject( |
|||
new JProperty("builder", "@angular-devkit/build-angular:tslint"), |
|||
new JProperty("options", new JObject( |
|||
new JProperty("tsConfig", new JArray(new JValue($"projects/{project}/tsconfig.lib.json"), new JValue($"projects/{project}/tsconfig.spec.json"))), |
|||
new JProperty("exclude", new JArray(new JValue("**/node_modules/**"))) |
|||
)) |
|||
)) |
|||
)) |
|||
)); |
|||
} |
|||
|
|||
File.WriteAllText(angularJsonFilePath, json.ToString(Formatting.Indented)); |
|||
} |
|||
|
|||
private async Task AddPathsToTsConfigAsync(string angularPath, string angularProjectsPath, List<string> projects) |
|||
{ |
|||
var tsConfigPath = Path.Combine(angularPath, "tsconfig.json"); |
|||
var fileContent = File.ReadAllText(tsConfigPath); |
|||
|
|||
var tsConfigAsJson = JObject.Parse(fileContent); |
|||
|
|||
var compilerOptions = (JObject)tsConfigAsJson["compilerOptions"]; |
|||
|
|||
foreach (var project in projects) |
|||
{ |
|||
var projectPackageName = await GetProjectPackageNameAsync(angularProjectsPath, project); |
|||
|
|||
var property = new JProperty($"{projectPackageName}", |
|||
new JArray(new object[] { $"projects/{project}/src/public-api.ts" }) |
|||
); |
|||
var property2 = new JProperty($"{projectPackageName}/*", |
|||
new JArray(new object[] { $"projects/{project}/src/lib/*" }) |
|||
); |
|||
|
|||
if (compilerOptions["paths"] == null) |
|||
{ |
|||
|
|||
compilerOptions.Add("paths", new JObject()); |
|||
} |
|||
|
|||
((JObject)compilerOptions["paths"]).Add(property); |
|||
((JObject)compilerOptions["paths"]).Add(property2); |
|||
} |
|||
|
|||
File.WriteAllText(tsConfigPath, tsConfigAsJson.ToString(Formatting.Indented)); |
|||
} |
|||
|
|||
private async Task<string> GetProjectPackageNameAsync(string angularProjectsPath, string project) |
|||
{ |
|||
var packageJsonPath = Path.Combine(angularProjectsPath, project, "package.json"); |
|||
|
|||
var fileContent = File.ReadAllText(packageJsonPath); |
|||
|
|||
return (string)JObject.Parse(fileContent)["name"]; |
|||
} |
|||
|
|||
private async Task RemoveRedundantFilesAsync(string angularProjectsPath, List<string> projects) |
|||
{ |
|||
foreach (var project in projects) |
|||
{ |
|||
var jestConfigPath = Path.Combine(angularProjectsPath, project, "jest.config.js"); |
|||
|
|||
File.Delete(jestConfigPath); |
|||
|
|||
var testPath = Path.Combine(angularProjectsPath, project, "src", "test.ts"); |
|||
|
|||
File.Delete(testPath); |
|||
} |
|||
} |
|||
|
|||
private async Task ReplaceProjectNamesAndCopySourCodeRequirementsToProjectsAsync(string angularProjectsPath, List<string> projects) |
|||
{ |
|||
foreach (var project in projects) |
|||
{ |
|||
var sourceCodeReqFolder = Path.Combine(angularProjectsPath, project, "source-code-requirements"); |
|||
|
|||
Directory.CreateDirectory(sourceCodeReqFolder); |
|||
|
|||
var filesUnderSourceCodeReqFolder = Directory.GetFiles(sourceCodeReqFolder); |
|||
|
|||
foreach (var fileUnderSourceCodeReqFolder in filesUnderSourceCodeReqFolder) |
|||
{ |
|||
var newDest = Path.Combine(angularProjectsPath, project, Path.GetFileName(fileUnderSourceCodeReqFolder)); |
|||
File.Move(fileUnderSourceCodeReqFolder, newDest); |
|||
|
|||
var fileContent = File.ReadAllText(newDest); |
|||
fileContent = fileContent.Replace("{{project-name}}", project); |
|||
fileContent = fileContent.Replace("{{library-name-kebab-case}}", project); |
|||
File.WriteAllText(newDest, fileContent); |
|||
} |
|||
} |
|||
} |
|||
|
|||
private async Task<List<string>> CopyAndGetNamesOfAngularProjectsAsync(string solutionFilePath, string angularProjectsPath) |
|||
{ |
|||
var projects = new List<string>(); |
|||
|
|||
if (!Directory.Exists(angularProjectsPath)) |
|||
{ |
|||
Directory.CreateDirectory(angularProjectsPath); |
|||
} |
|||
|
|||
var angularPathsInDownloadedSourceCode = Directory.GetDirectories(Path.Combine(Path.Combine(Path.GetDirectoryName(solutionFilePath), "modules"))).Select(p => Path.Combine(p, "angular")) |
|||
.Where(Directory.Exists); |
|||
|
|||
|
|||
foreach (var folder in angularPathsInDownloadedSourceCode) |
|||
{ |
|||
var projectsInFolder = Directory.GetDirectories(folder); |
|||
foreach (var projectInFolder in projectsInFolder) |
|||
{ |
|||
var projectName = Path.GetFileName(projectInFolder.TrimEnd('\\').TrimEnd('/')); |
|||
|
|||
var destDirName = Path.Combine(angularProjectsPath, projectName); |
|||
if (Directory.Exists(destDirName)) |
|||
{ |
|||
Directory.Delete(projectInFolder, true); |
|||
continue; |
|||
} |
|||
|
|||
|
|||
projects.Add(projectName); |
|||
|
|||
Directory.Move(projectInFolder, destDirName); |
|||
} |
|||
} |
|||
|
|||
return projects; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,62 @@ |
|||
{ |
|||
"culture": "ar", |
|||
"texts": { |
|||
"InternalServerErrorMessage": "حدث خطأ داخلي أثناء طلبك!", |
|||
"ValidationErrorMessage": "طلبك غير صحيح!", |
|||
"ValidationNarrativeErrorMessageTitle": "تم الكشف عن الأخطاء التالية أثناء التحقق .", |
|||
"DefaultErrorMessage": "حدث خطأ!", |
|||
"DefaultErrorMessageDetail": "لم يتم إرسال تفاصيل الخطأ بواسطة الخادم.", |
|||
"DefaultErrorMessage401": "أنت غير مصدق!", |
|||
"DefaultErrorMessage401Detail": "يجب عليك تسجيل الدخول لأداء هذه العملية.", |
|||
"DefaultErrorMessage403": "أنك غير مخول!", |
|||
"DefaultErrorMessage403Detail": "لا يسمح لك بإجراء هذه العملية!", |
|||
"DefaultErrorMessage404": "المورد غير موجود!", |
|||
"DefaultErrorMessage404Detail": "لم يتم العثور على المورد المطلوب على الخادم!", |
|||
"EntityNotFoundErrorMessage": "لا يوجد كيان {0} بالمعرف = {1}!", |
|||
"Languages": "اللغات", |
|||
"Error": "خطأ", |
|||
"AreYouSure": "هل أنت متأكد؟", |
|||
"Cancel": "إلغاء", |
|||
"Yes": "نعم", |
|||
"No": "لا", |
|||
"Ok": "حسنا", |
|||
"Close": "أغلق", |
|||
"Save": "حفظ", |
|||
"SavingWithThreeDot": "حفظ...", |
|||
"Actions": "أجراءات", |
|||
"Delete": "حذف", |
|||
"Edit": "تعديل", |
|||
"Refresh": "تحديث", |
|||
"Language": "لغة", |
|||
"LoadMore": "تحميل المزيد", |
|||
"ProcessingWithThreeDot": "معالجة...", |
|||
"LoadingWithThreeDot": "جار التحميل...", |
|||
"Welcome": "أهلا بك", |
|||
"Login": "تسجيل الدخول", |
|||
"Register": "تسجيل", |
|||
"Logout": "تسجيل خروج", |
|||
"Submit": "إرسال", |
|||
"Back": "عودة", |
|||
"PagerSearch": "بحث", |
|||
"PagerNext": "التالى", |
|||
"PagerPrevious": "السابق", |
|||
"PagerFirst": "الأول", |
|||
"PagerLast": "الاخير", |
|||
"PagerInfo": "عرض _START_ الي _END_ من _TOTAL_ إدخالات", |
|||
"PagerInfoEmpty": "عرض 0 الي 0 من 0 إدخالات", |
|||
"PagerInfoFiltered": "(تمت تصفيته من _MAX_ مجموع الإدخالات)", |
|||
"NoDataAvailableInDatatable": "لا توجد بيانات متاحة في الجدول", |
|||
"PagerShowMenuEntries": "عرض _MENU_ إدخالات", |
|||
"DatatableActionDropdownDefaultText": "أجراءات", |
|||
"ChangePassword": "تغيير كلمة السر", |
|||
"PersonalInfo": "ملفي الشخصي", |
|||
"AreYouSureYouWantToCancelEditingWarningMessage": "لم تحفظ التغييرات.", |
|||
"UnhandledException": "استثناء غير معالج!", |
|||
"401Message": "غير مصرح", |
|||
"403Message": "ممنوع", |
|||
"404Message": "الصفحة غير موجودة", |
|||
"500Message": "خطأ في الخادم الداخلي", |
|||
"GoHomePage": "اذهب الى الصفحة الرئيسية", |
|||
"GoBack": "عد" |
|||
} |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
{ |
|||
"culture": "sl", |
|||
"texts": { |
|||
"ManageYourProfile": "Upravljajte svojim profilom" |
|||
} |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
{ |
|||
"culture": "zh-Hans", |
|||
"texts": { |
|||
"ManageYourProfile": "管理个人资料" |
|||
} |
|||
} |
|||
@ -0,0 +1,6 @@ |
|||
{ |
|||
"culture": "zh-Hant", |
|||
"texts": { |
|||
"ManageYourProfile": "管理個人資料" |
|||
} |
|||
} |
|||