Browse Source

feat(localization): add language&resource management ui support.

pull/772/head
cKey 3 years ago
parent
commit
7a5ae418d5
  1. 52
      apps/vue/src/api/localization/languages.ts
  2. 9
      apps/vue/src/api/localization/model/languagesModel.ts
  3. 12
      apps/vue/src/api/localization/model/resourcesModel.ts
  4. 8
      apps/vue/src/api/localization/model/textsModel.ts
  5. 52
      apps/vue/src/api/localization/resources.ts
  6. 56
      apps/vue/src/views/localization/languages/components/LanguageModal.vue
  7. 77
      apps/vue/src/views/localization/languages/components/LanguageTable.vue
  8. 6
      apps/vue/src/views/localization/resources/components/ModalData.ts
  9. 56
      apps/vue/src/views/localization/resources/components/ResourceModal.vue
  10. 77
      apps/vue/src/views/localization/resources/components/ResourceTable.vue
  11. 10
      apps/vue/src/views/localization/resources/components/TableData.ts
  12. 2
      apps/vue/src/views/localization/texts/components/TextModal.vue
  13. 3
      aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/en.json
  14. 3
      aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/zh-Hans.json
  15. 2
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs
  16. 2
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs
  17. 14
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs
  18. 13
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs
  19. 4
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json
  20. 4
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json
  21. 7
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs
  22. 7
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs

52
apps/vue/src/api/localization/languages.ts

@ -1,5 +1,8 @@
import { defAbpHttp } from '/@/utils/http/abp';
import { LanguageListResult } from './model/languagesModel';
import { LanguageListResult, LanguageCreate, LanguageUpdate, Language } from './model/languagesModel';
const remoteServiceName = 'LocalizationManagement';
const controllerName = 'Language';
enum Api {
GetList = '/api/abp/localization/languages',
@ -10,3 +13,50 @@ export const getList = () => {
url: Api.GetList,
});
};
export const GetAsyncByName = (name: string) => {
return defAbpHttp.request<Language>({
service: remoteServiceName,
controller: controllerName,
action: 'GetAsync',
uniqueName: 'GetAsyncByName',
params: {
name: name,
},
});
};
export const CreateAsyncByInput = (input: LanguageCreate) => {
return defAbpHttp.request<Language>({
service: remoteServiceName,
controller: controllerName,
action: 'CreateAsync',
uniqueName: 'CreateAsyncByInput',
data: input,
});
};
export const UpdateAsyncByNameAndInput = (name: string, input: LanguageUpdate) => {
return defAbpHttp.request<Language>({
service: remoteServiceName,
controller: controllerName,
action: 'UpdateAsync',
uniqueName: 'UpdateAsyncByNameAndInput',
params: {
name: name,
},
data: input,
});
};
export const DeleteAsyncByName = (name: string) => {
return defAbpHttp.request<void>({
service: remoteServiceName,
controller: controllerName,
action: 'DeleteAsync',
uniqueName: 'DeleteAsyncByName',
params: {
name: name,
},
});
};

9
apps/vue/src/api/localization/model/languagesModel.ts

@ -8,12 +8,17 @@ export interface Language extends AuditedEntityDto<string> {
export interface LanguageCreateOrUpdate {
enable: boolean;
cultureName: string;
uiCultureName: string;
displayName: string;
flagIcon: string;
}
export interface LanguageCreate extends LanguageCreateOrUpdate {
cultureName: string;
uiCultureName: string;
}
export interface LanguageUpdate extends LanguageCreateOrUpdate {}
export interface LanguageListResult extends ListResultDto<Language> {}
export interface LanguagePagedResult extends PagedResultDto<Language> {}

12
apps/vue/src/api/localization/model/resourcesModel.ts

@ -1,4 +1,5 @@
export interface Resource {
id: string;
name: string;
displayName: string;
description: string;
@ -6,11 +7,18 @@ export interface Resource {
export interface ResourceCreateOrUpdate {
enable: boolean;
name: string;
displayName: string;
description: string;
description?: string;
defaultCultureName?: string;
}
export interface ResourceCreate extends ResourceCreateOrUpdate {
name: string;
}
export interface ResourceUpdate extends ResourceCreateOrUpdate {}
export interface ResourceListResult extends ListResultDto<Resource> {}
export interface ResourcePagedResult extends PagedResultDto<Resource> {}

8
apps/vue/src/api/localization/model/textsModel.ts

@ -1,12 +1,12 @@
export interface Text {
key: boolean;
key: string;
value: string;
cultureName: string;
resourceName: string;
}
export interface TextDifference {
key: boolean;
key: string;
value: string;
cultureName: string;
resourceName: string;
@ -15,7 +15,7 @@ export interface TextDifference {
}
export interface SetTextInput {
key: boolean;
key: string;
value: string;
cultureName: string;
resourceName: string;
@ -24,7 +24,7 @@ export interface SetTextInput {
export interface TextListResult extends ListResultDto<TextDifference> {}
export interface GetTextByKey {
key: boolean;
key: string;
cultureName: string;
resourceName: string;
}

52
apps/vue/src/api/localization/resources.ts

@ -1,5 +1,8 @@
import { defAbpHttp } from '/@/utils/http/abp';
import { ResourceListResult } from './model/resourcesModel';
import { ResourceListResult, Resource, ResourceCreate, ResourceUpdate } from './model/resourcesModel';
const remoteServiceName = 'LocalizationManagement';
const controllerName = 'Resource';
enum Api {
GetList = '/api/abp/localization/resources',
@ -10,3 +13,50 @@ export const getList = () => {
url: Api.GetList,
});
};
export const GetAsyncByName = (name: string) => {
return defAbpHttp.request<Resource>({
service: remoteServiceName,
controller: controllerName,
action: 'GetAsync',
uniqueName: 'GetAsyncByName',
params: {
name: name,
},
});
};
export const CreateAsyncByInput = (input: ResourceCreate) => {
return defAbpHttp.request<Resource>({
service: remoteServiceName,
controller: controllerName,
action: 'CreateAsync',
uniqueName: 'CreateAsyncByInput',
data: input,
});
};
export const UpdateAsyncByNameAndInput = (name: string, input: ResourceUpdate) => {
return defAbpHttp.request<Resource>({
service: remoteServiceName,
controller: controllerName,
action: 'UpdateAsync',
uniqueName: 'UpdateAsyncByNameAndInput',
params: {
name: name,
},
data: input,
});
};
export const DeleteAsyncByName = (name: string) => {
return defAbpHttp.request<void>({
service: remoteServiceName,
controller: controllerName,
action: 'DeleteAsync',
uniqueName: 'DeleteAsyncByName',
params: {
name: name,
},
});
};

56
apps/vue/src/views/localization/languages/components/LanguageModal.vue

@ -0,0 +1,56 @@
<template>
<BasicModal
@register="registerModal"
:title="L('Languages')"
:can-fullscreen="false"
:width="800"
:height="500"
@ok="handleSubmit"
>
<BasicForm @register="registerForm" />
</BasicModal>
</template>
<script lang="ts" setup>
import { nextTick } from 'vue';
import { BasicForm, useForm } from '/@/components/Form';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { getModalFormSchemas } from './ModalData';
import { formatToDateTime } from '/@/utils/dateUtil';
import { Language } from '/@/api/localization/model/languagesModel';
import { CreateAsyncByInput, UpdateAsyncByNameAndInput } from '/@/api/localization/languages';
const emits = defineEmits(['change', 'register']);
const { createMessage } = useMessage();
const { L } = useLocalization(['LocalizationManagement', 'AbpLocalization', 'AbpUi']);
const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({
layout: 'vertical',
showActionButtonGroup: false,
schemas: getModalFormSchemas(),
transformDateFunc: (date) => {
return date ? formatToDateTime(date) : '';
},
});
const [registerModal, { closeModal }] = useModalInner((data: Language) => {
nextTick(() => {
resetFields();
setFieldsValue(data);
});
});
function handleSubmit() {
validate().then((input) => {
const api = input.id
? UpdateAsyncByNameAndInput(input.cultureName, input)
: CreateAsyncByInput(input);
api.then((dto) => {
createMessage.success(L('SuccessfullySaved'));
emits('change', dto);
closeModal();
});
});
}
</script>

77
apps/vue/src/views/localization/languages/components/LanguageTable.vue

@ -1,18 +1,58 @@
<template>
<div class="content">
<BasicTable @register="registerTable" />
<BasicTable @register="registerTable">
<template #toolbar>
<Button
v-auth="['LocalizationManagement.Language.Create']"
type="primary"
@click="handleAddNew"
>
{{ L('Language:AddNew') }}
</Button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:stop-button-propagation="true"
:actions="[
{
auth: 'LocalizationManagement.Language.Update',
label: L('Edit'),
icon: 'ant-design:edit-outlined',
onClick: handleEdit.bind(null, record),
},
{
auth: 'LocalizationManagement.Language.Delete',
label: L('Delete'),
color: 'error',
icon: 'ant-design:delete-outlined',
onClick: handleDelete.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
<LanguageModal @register="registerModal" />
</div>
</template>
<script lang="ts" setup>
import { onMounted } from 'vue';
import { Button } from 'ant-design-vue';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { BasicTable, useTable } from '/@/components/Table';
import { BasicTable, TableAction, useTable } from '/@/components/Table';
import { useModal } from '/@/components/Modal';
import { formatPagedRequest } from '/@/utils/http/abp/helper';
import { getList } from '/@/api/localization/languages';
import { getList, GetAsyncByName, DeleteAsyncByName } from '/@/api/localization/languages';
import { Language } from '/@/api/localization/model/languagesModel';
import { getDataColumns } from './TableData';
import LanguageModal from './LanguageModal.vue';
const { L } = useLocalization(['AbpLocalization', 'AbpUi']);
const { createConfirm, createMessage } = useMessage();
const { L } = useLocalization(['LocalizationManagement', 'AbpLocalization', 'AbpUi']);
const [registerModal, { openModal }] = useModal();
const [registerTable, { setTableData, getForm }] = useTable({
rowKey: 'cultureName',
title: L('Languages'),
@ -39,6 +79,11 @@
],
submitFunc: fetchLanguages,
},
actionColumn: {
width: 150,
title: L('Actions'),
dataIndex: 'action',
},
});
onMounted(fetchLanguages);
@ -50,4 +95,28 @@
});
});
}
function handleAddNew() {
openModal(true, {});
}
function handleEdit(record: Language) {
GetAsyncByName(record.cultureName).then((dto) => {
openModal(true, dto);
})
}
function handleDelete(record: Language) {
createConfirm({
iconType: 'warning',
title: L('AreYouSure'),
content: L('ItemWillBeDeletedMessage'),
onOk: () => {
return DeleteAsyncByName(record.cultureName).then(() => {
createMessage.success(L('SuccessfullyDeleted'));
fetchLanguages();
});
},
});
}
</script>

6
apps/vue/src/views/localization/resources/components/ModalData.ts

@ -55,5 +55,11 @@ export function getModalFormSchemas(): FormSchema[] {
label: L('DisplayName:Description'),
colProps: { span: 24 },
},
{
field: 'description',
component: 'InputTextArea',
label: L('DisplayName:Description'),
colProps: { span: 24 },
},
];
}

56
apps/vue/src/views/localization/resources/components/ResourceModal.vue

@ -0,0 +1,56 @@
<template>
<BasicModal
@register="registerModal"
:title="L('Resources')"
:can-fullscreen="false"
:width="800"
:height="500"
@ok="handleSubmit"
>
<BasicForm @register="registerForm" />
</BasicModal>
</template>
<script lang="ts" setup>
import { nextTick } from 'vue';
import { BasicForm, useForm } from '/@/components/Form';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { getModalFormSchemas } from './ModalData';
import { formatToDateTime } from '/@/utils/dateUtil';
import { Resource } from '/@/api/localization/model/resourcesModel';
import { CreateAsyncByInput, UpdateAsyncByNameAndInput } from '/@/api/localization/resources';
const emits = defineEmits(['change', 'register']);
const { createMessage } = useMessage();
const { L } = useLocalization(['LocalizationManagement', 'AbpUi']);
const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({
layout: 'vertical',
showActionButtonGroup: false,
schemas: getModalFormSchemas(),
transformDateFunc: (date) => {
return date ? formatToDateTime(date) : '';
},
});
const [registerModal, { closeModal }] = useModalInner((data: Resource) => {
nextTick(() => {
resetFields();
setFieldsValue(data);
});
});
function handleSubmit() {
validate().then((input) => {
const api = input.id
? UpdateAsyncByNameAndInput(input.name, input)
: CreateAsyncByInput(input);
api.then((dto) => {
createMessage.success(L('SuccessfullySaved'));
emits('change', dto);
closeModal();
});
});
}
</script>

77
apps/vue/src/views/localization/resources/components/ResourceTable.vue

@ -1,17 +1,57 @@
<template>
<div class="content">
<BasicTable @register="registerTable" />
<BasicTable @register="registerTable">
<template #toolbar>
<Button
v-auth="['LocalizationManagement.Resource.Create']"
type="primary"
@click="handleAddNew"
>
{{ L('Language:AddNew') }}
</Button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:stop-button-propagation="true"
:actions="[
{
auth: 'LocalizationManagement.Resource.Update',
label: L('Edit'),
icon: 'ant-design:edit-outlined',
onClick: handleEdit.bind(null, record),
},
{
auth: 'LocalizationManagement.Resource.Delete',
label: L('Delete'),
color: 'error',
icon: 'ant-design:delete-outlined',
onClick: handleDelete.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
<ResourceModal @register="registerModal" />
</div>
</template>
<script lang="ts" setup>
import { onMounted } from 'vue';
import { Button } from 'ant-design-vue';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { BasicTable, useTable } from '/@/components/Table';
import { getList } from '/@/api/localization/resources';
import { BasicTable, TableAction, useTable } from '/@/components/Table';
import { useModal } from '/@/components/Modal';
import { getList, GetAsyncByName, DeleteAsyncByName } from '/@/api/localization/resources';
import { Resource } from '/@/api/localization/model/resourcesModel';
import { getDataColumns } from './TableData';
import ResourceModal from './ResourceModal.vue';
const { L } = useLocalization(['LocalizationManagement', 'AbpUi']);
const { createConfirm, createMessage } = useMessage();
const { L } = useLocalization(['LocalizationManagement', 'AbpLocalization', 'AbpUi']);
const [registerModal, { openModal }] = useModal();
const [registerTable, { setTableData, getForm }] = useTable({
rowKey: 'name',
title: L('Resources'),
@ -37,6 +77,11 @@
],
submitFunc: fetchResources,
},
actionColumn: {
width: 150,
title: L('Actions'),
dataIndex: 'action',
},
});
onMounted(fetchResources);
@ -48,4 +93,28 @@
});
});
}
function handleAddNew() {
openModal(true, {});
}
function handleEdit(record: Resource) {
GetAsyncByName(record.name).then((dto) => {
openModal(true, dto);
})
}
function handleDelete(record: Resource) {
createConfirm({
iconType: 'warning',
title: L('AreYouSure'),
content: L('ItemWillBeDeletedMessage'),
onOk: () => {
return DeleteAsyncByName(record.name).then(() => {
createMessage.success(L('SuccessfullyDeleted'));
fetchResources();
});
},
});
}
</script>

10
apps/vue/src/views/localization/resources/components/TableData.ts

@ -35,5 +35,15 @@ export function getDataColumns(): BasicColumn[] {
return last.description?.localeCompare(next.description) ?? -1;
},
},
{
title: L('DisplayName:DefaultCultureName'),
dataIndex: 'defaultCultureName',
align: 'left',
width: 150,
resizable: true,
sorter: (last, next) => {
return last.defaultCultureName?.localeCompare(next.defaultCultureName) ?? -1;
},
},
];
}

2
apps/vue/src/views/localization/texts/components/TextModal.vue

@ -47,7 +47,7 @@
resultField: 'items',
labelField: 'uiCultureName',
valueField: 'cultureName',
onChange: (key) => {
onSelect: (key) => {
//
const model = unref(modelRef);
if (model?.key) {

3
aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/en.json

@ -17,6 +17,7 @@
"DisplayName:UiCultureName": "Ui Culture Name",
"DisplayName:DisplayName": "Display Name",
"DisplayName:FlagIcon": "Flag Icon",
"DisplayName:Description": "Description"
"DisplayName:Description": "Description",
"DisplayName:DefaultCultureName": "Default Culture"
}
}

3
aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/zh-Hans.json

@ -17,6 +17,7 @@
"DisplayName:UiCultureName": "Ui文件名称",
"DisplayName:DisplayName": "显示名称",
"DisplayName:FlagIcon": "旗帜图标",
"DisplayName:Description": "描述"
"DisplayName:Description": "描述",
"DisplayName:DefaultCultureName": "默认文化"
}
}

2
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs

@ -6,6 +6,8 @@ namespace LINGYUN.Abp.LocalizationManagement;
public interface ILanguageAppService : IApplicationService
{
Task<LanguageDto> GetByNameAsync(string name);
Task<LanguageDto> CreateAsync(LanguageCreateDto input);
Task<LanguageDto> UpdateAsync(string name, LanguageUpdateDto input);

2
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs

@ -5,6 +5,8 @@ namespace LINGYUN.Abp.LocalizationManagement;
public interface IResourceAppService : IApplicationService
{
Task<ResourceDto> GetByNameAsync(string name);
Task<ResourceDto> CreateAsync(ResourceCreateDto input);
Task<ResourceDto> UpdateAsync(string name, ResourceUpdateDto input);

14
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs

@ -2,6 +2,7 @@
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.ObjectMapping;
namespace LINGYUN.Abp.LocalizationManagement;
@ -15,6 +16,13 @@ public class LanguageAppService : LocalizationAppServiceBase, ILanguageAppServic
_repository = repository;
}
public async virtual Task<LanguageDto> GetByNameAsync(string name)
{
var language = await InternalGetByNameAsync(name);
return ObjectMapper.Map<Language, LanguageDto>(language);
}
[Authorize(LocalizationManagementPermissions.Language.Create)]
public async virtual Task<LanguageDto> CreateAsync(LanguageCreateDto input)
{
@ -41,7 +49,7 @@ public class LanguageAppService : LocalizationAppServiceBase, ILanguageAppServic
[Authorize(LocalizationManagementPermissions.Language.Delete)]
public async virtual Task DeleteAsync(string name)
{
var language = await GetByNameAsync(name);
var language = await InternalGetByNameAsync(name);
await _repository.DeleteAsync(language);
@ -51,7 +59,7 @@ public class LanguageAppService : LocalizationAppServiceBase, ILanguageAppServic
[Authorize(LocalizationManagementPermissions.Language.Update)]
public async virtual Task<LanguageDto> UpdateAsync(string name, LanguageUpdateDto input)
{
var language = await GetByNameAsync(name);
var language = await InternalGetByNameAsync(name);
language.SetFlagIcon(input.FlagIcon);
language.SetDisplayName(input.DisplayName);
@ -63,7 +71,7 @@ public class LanguageAppService : LocalizationAppServiceBase, ILanguageAppServic
return ObjectMapper.Map<Language, LanguageDto>(language);
}
private async Task<Language> GetByNameAsync(string name)
private async Task<Language> InternalGetByNameAsync(string name)
{
var language = await _repository.FindByCultureNameAsync(name);

13
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs

@ -15,6 +15,13 @@ public class ResourceAppService : LocalizationAppServiceBase, IResourceAppServic
_repository = repository;
}
public async virtual Task<ResourceDto> GetByNameAsync(string name)
{
var resource = await InternalGetByNameAsync(name);
return ObjectMapper.Map<Resource, ResourceDto>(resource);
}
[Authorize(LocalizationManagementPermissions.Resource.Create)]
public async virtual Task<ResourceDto> CreateAsync(ResourceCreateDto input)
{
@ -41,7 +48,7 @@ public class ResourceAppService : LocalizationAppServiceBase, IResourceAppServic
[Authorize(LocalizationManagementPermissions.Resource.Delete)]
public async virtual Task DeleteAsync(string name)
{
var resource = await GetByNameAsync(name);
var resource = await InternalGetByNameAsync(name);
await _repository.DeleteAsync(resource);
@ -51,7 +58,7 @@ public class ResourceAppService : LocalizationAppServiceBase, IResourceAppServic
[Authorize(LocalizationManagementPermissions.Resource.Update)]
public async virtual Task<ResourceDto> UpdateAsync(string name, ResourceUpdateDto input)
{
var resource = await GetByNameAsync(name);
var resource = await InternalGetByNameAsync(name);
resource.SetDisplayName(input.DisplayName);
resource.SetDescription(input.Description);
@ -64,7 +71,7 @@ public class ResourceAppService : LocalizationAppServiceBase, IResourceAppServic
return ObjectMapper.Map<Resource, ResourceDto>(resource);
}
private async Task<Resource> GetByNameAsync(string name)
private async Task<Resource> InternalGetByNameAsync(string name)
{
var resource = await _repository.FindByNameAsync(name);

4
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json

@ -17,6 +17,8 @@
"Filter": "Filter",
"SaveAndNext": "Save & Next",
"SearchFilter": "Search",
"Text:AddNew": "Add New Text"
"Text:AddNew": "New Text",
"Language:AddNew": "New Language",
"Resource:AddNew": "New Resource"
}
}

4
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json

@ -17,6 +17,8 @@
"Filter": "过滤字符",
"SaveAndNext": "保存并下一步",
"SearchFilter": "请输入过滤字符",
"Text:AddNew": "添加新文档"
"Text:AddNew": "添加新文档",
"Language:AddNew": "添加新语言",
"Resource:AddNew": "添加新资源"
}
}

7
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs

@ -19,6 +19,13 @@ public class LanguageController : AbpControllerBase, ILanguageAppService
_service = service;
}
[HttpGet]
[Route("{name}")]
public virtual Task<LanguageDto> GetByNameAsync(string name)
{
return _service.GetByNameAsync(name);
}
[HttpPost]
[Authorize(LocalizationManagementPermissions.Language.Create)]
public virtual Task<LanguageDto> CreateAsync(LanguageCreateDto input)

7
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs

@ -20,6 +20,13 @@ public class ResourceController : AbpControllerBase, IResourceAppService
_service = service;
}
[HttpGet]
[Route("{name}")]
public virtual Task<ResourceDto> GetByNameAsync(string name)
{
return _service.GetByNameAsync(name);
}
[HttpPost]
[Authorize(LocalizationManagementPermissions.Resource.Create)]
public virtual Task<ResourceDto> CreateAsync(ResourceCreateDto input)

Loading…
Cancel
Save