From 47ea5c7420f126081e7ef17a7182890def32457d Mon Sep 17 00:00:00 2001 From: Charly Lersteau <645647+charlyisidore@users.noreply.github.com> Date: Sun, 30 Jul 2023 13:35:49 +0800 Subject: [PATCH] =?UTF-8?q?Translation=20(english=20+=20=E4=B8=AD=E6=96=87?= =?UTF-8?q?)=20of=20the=20litemall-admin=20interface=20(#541)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add: i18n translations with vue-i18n (english + 中文) * Add: LocaleChanger component on admin login page --- litemall-admin/package.json | 1 + .../src/components/BackToTop/index.vue | 2 +- .../src/components/Breadcrumb/index.vue | 6 +- .../src/components/LocaleChanger/index.vue | 27 + litemall-admin/src/locales/en.js | 996 ++++++++++++++++++ litemall-admin/src/locales/zh-Hans.js | 996 ++++++++++++++++++ litemall-admin/src/main.js | 52 + litemall-admin/src/router/index.js | 110 +- litemall-admin/src/views/config/express.vue | 8 +- litemall-admin/src/views/config/mall.vue | 18 +- litemall-admin/src/views/config/order.vue | 22 +- litemall-admin/src/views/config/wx.vue | 22 +- litemall-admin/src/views/dashboard/index.vue | 8 +- litemall-admin/src/views/goods/comment.vue | 36 +- litemall-admin/src/views/goods/create.vue | 130 +-- litemall-admin/src/views/goods/edit.vue | 130 +-- litemall-admin/src/views/goods/list.vue | 68 +- .../src/views/layout/components/Navbar.vue | 17 +- .../layout/components/Sidebar/SidebarItem.vue | 4 +- .../layout/components/TagsView/index.vue | 2 +- litemall-admin/src/views/login/index.vue | 19 +- litemall-admin/src/views/mall/aftersale.vue | 90 +- litemall-admin/src/views/mall/brand.vue | 42 +- litemall-admin/src/views/mall/category.vue | 50 +- litemall-admin/src/views/mall/issue.vue | 34 +- litemall-admin/src/views/mall/keyword.vue | 58 +- litemall-admin/src/views/mall/order.vue | 178 ++-- litemall-admin/src/views/mall/region.vue | 8 +- litemall-admin/src/views/profile/notice.vue | 34 +- litemall-admin/src/views/profile/password.vue | 10 +- litemall-admin/src/views/promotion/ad.vue | 64 +- litemall-admin/src/views/promotion/coupon.vue | 122 +-- .../src/views/promotion/couponDetail.vue | 50 +- .../src/views/promotion/grouponActivity.vue | 30 +- .../src/views/promotion/grouponRule.vue | 50 +- litemall-admin/src/views/promotion/topic.vue | 40 +- .../src/views/promotion/topicCreate.vue | 52 +- .../src/views/promotion/topicEdit.vue | 52 +- litemall-admin/src/views/sys/admin.vue | 40 +- litemall-admin/src/views/sys/log.vue | 24 +- litemall-admin/src/views/sys/notice.vue | 44 +- litemall-admin/src/views/sys/os.vue | 42 +- litemall-admin/src/views/sys/role.vue | 36 +- litemall-admin/src/views/user/address.vue | 24 +- litemall-admin/src/views/user/collect.vue | 18 +- litemall-admin/src/views/user/feedback.vue | 24 +- litemall-admin/src/views/user/footprint.vue | 18 +- litemall-admin/src/views/user/history.vue | 18 +- litemall-admin/src/views/user/user.vue | 56 +- 49 files changed, 3033 insertions(+), 949 deletions(-) create mode 100644 litemall-admin/src/components/LocaleChanger/index.vue create mode 100644 litemall-admin/src/locales/en.js create mode 100644 litemall-admin/src/locales/zh-Hans.js diff --git a/litemall-admin/package.json b/litemall-admin/package.json index 35749a433..133b6fff0 100644 --- a/litemall-admin/package.json +++ b/litemall-admin/package.json @@ -61,6 +61,7 @@ "v-charts": "1.19.0", "vue": "2.6.10", "vue-count-to": "1.0.13", + "vue-i18n": "^8.28.2", "vue-router": "3.0.2", "vuex": "3.1.0", "xlsx": ">=0.17.0" diff --git a/litemall-admin/src/components/BackToTop/index.vue b/litemall-admin/src/components/BackToTop/index.vue index 39977178d..0c8491d90 100644 --- a/litemall-admin/src/components/BackToTop/index.vue +++ b/litemall-admin/src/components/BackToTop/index.vue @@ -2,7 +2,7 @@
{{ item.meta.title }} - {{ item.meta.title }} + {{ $t(item.meta.title) }} + {{ $t(item.meta.title) }} @@ -38,7 +38,7 @@ export default { ) const first = matched[0] if (!this.isDashboard(first)) { - matched = [{ path: '/dashboard', meta: { title: '首页' }}].concat(matched) + matched = [{ path: '/dashboard', meta: { title: 'app.menu.dashboard' }}].concat(matched) } this.levelList = matched.filter( item => item.meta && item.meta.title && item.meta.breadcrumb !== false diff --git a/litemall-admin/src/components/LocaleChanger/index.vue b/litemall-admin/src/components/LocaleChanger/index.vue new file mode 100644 index 000000000..77c91fdb8 --- /dev/null +++ b/litemall-admin/src/components/LocaleChanger/index.vue @@ -0,0 +1,27 @@ + + + + + + diff --git a/litemall-admin/src/locales/en.js b/litemall-admin/src/locales/en.js new file mode 100644 index 000000000..0d82889ce --- /dev/null +++ b/litemall-admin/src/locales/en.js @@ -0,0 +1,996 @@ +// https://element.eleme.cn/#/en-US/component/i18n +import el from 'element-ui/lib/locale/lang/en' + +export default { + ...el, + lang: 'English', + app: { + menu: { + dashboard: 'Dashboard', + user: 'Users', + user_user: 'Users', + user_address: 'Addresses', + user_collect: 'Favorites', + user_footprint: 'Footprints', + user_history: 'Search history', + user_feedback: 'Feedbacks', + mall: 'Mall', + mall_region: 'Regions', + mall_brand: 'Brands', + mall_category: 'Categories', + mall_order: 'Orders', + mall_aftersale: 'After-sales', + mall_issue: 'Issues', + mall_keyword: 'Keywords', + goods: 'Goods', + goods_list: 'List goods', + goods_create: 'Add goods', + goods_edit: 'Edit goods', + goods_comment: 'Comments', + promotion: 'Promotion', + promotion_ad: 'Ads', + promotion_coupon: 'Coupons', + promotion_coupon_detail: 'Coupon details', + promotion_topic: 'Topics', + promotion_topic_create: 'Create topic', + promotion_topic_edit: 'Edit topic', + promotion_groupon_rule: 'Groupon rules', + promotion_groupon_activity: 'Groupon activity', + sys: 'System', + sys_admin: 'Admins', + sys_notice: 'Notifications', + sys_log: 'Logs', + sys_role: 'Roles', + sys_os: 'Storage', + config: 'Configuration', + config_mall: 'Mall config', + config_express: 'Freight config', + config_order: 'Order config', + config_wx: 'Mini-program config', + stat: 'Statistics', + stat_user: 'User stats', + stat_order: 'Order stats', + stat_goods: 'Goods stats', + external_link: 'External links', + external_link_tencent_cos: 'Tencent cloud storage', + external_link_tencent_sms: 'Tencent cloud SMS', + external_link_weixin_pay: 'WeChat Pay', + external_link_weixin_mpkf: 'WeChat mini-program', + external_link_alibaba_oss: 'Ali cloud storage', + external_link_qiniu_kodo: 'Qiniu cloud storage', + external_link_kdniao_api: 'Kdniao API', + profile_password: 'Change password', + profile_notice: 'Notifications' + }, + button: { + add: '+ Add', + back_to_top: 'Back to top', + batch_delete: 'Batch delete', + cancel: 'Cancel', + confirm: 'Confirm', + create: 'Create', + delete: 'Delete', + detail: 'Details', + download: 'Download', + edit: 'Edit', + permission: 'Permissions', + reply: 'Reply', + search: 'Search', + settings: 'Settings', + view: 'View' + }, + tooltip: { + back_to_top: 'Back to top' + }, + message: { + list_loading: 'Loading...' + } + }, + login: { + page: { + title: 'Admin login' + }, + placeholder: { + username: 'Admin account', + password: 'Admin password' + }, + button: { + login: 'Login' + } + }, + navbar: { + tooltip: { + locale: 'Language', + full_screen: 'Full screen', + size_select: 'Select size', + notice: 'Notifications' + }, + menu: { + home: 'Home', + github: 'Github', + gitee: 'Gitee', + password: 'Change password', + logout: 'Logout' + } + }, + dashboard: { + section: { + user_total: 'Users', + goods_total: 'Goods', + product_total: 'Products', + order_total: 'Orders' + } + }, + user_user: { + table: { + id: 'ID', + nickname: 'Nickname', + avatar: 'Avatar', + mobile: 'Mobile', + gender: 'Gender', + birthday: 'Birthday', + user_level: 'Level', + status: 'Status', + actions: 'Actions' + }, + dialog: { + edit: 'Edit user' + }, + form: { + username: 'Username', + nickname: 'Nickname', + mobile: 'Mobile', + gender: 'Gender', + user_level: 'Level', + status: 'Status' + }, + placeholder: { + filter_username: 'Username', + filter_user_id: 'User ID', + filter_mobile: 'Mobile', + gender: 'Please choose', + user_level: 'Please choose', + status: 'Please choose' + } + }, + user_address: { + table: { + id: 'ID', + user_id: 'User ID', + name: 'Name', + tel: 'Mobile', + address_region: 'Region', + address_detail: 'Detail', + is_default: 'Default' + }, + placeholder: { + filter_user_id: 'User ID', + filter_name: 'Name' + } + }, + user_collect: { + table: { + id: 'ID', + user_id: 'User ID', + value_id: 'Item ID', + add_time: 'Time added' + }, + placeholder: { + filter_user_id: 'User ID', + filter_value_id: 'Item ID' + } + }, + user_footprint: { + table: { + id: 'ID', + user_id: 'User ID', + goods_id: 'Goods ID', + add_time: 'Time added' + }, + placeholder: { + filter_user_id: 'User ID', + filter_goods_id: 'Goods ID' + } + }, + user_history: { + table: { + id: 'ID', + user_id: 'User ID', + keyword: 'Keyword', + add_time: 'Time added' + }, + placeholder: { + filter_user_id: 'User ID', + filter_keyword: 'Keyword' + } + }, + user_feedback: { + table: { + id: 'ID', + username: 'Username', + mobile: 'Mobile', + feed_type: 'Type', + content: 'Content', + pic_urls: 'Pictures', + add_time: 'Time added' + }, + placeholder: { + filter_username: 'Username', + filter_id: 'Feedback ID' + } + }, + mall_region: { + table: { + name: 'Name', + type: 'Type', + code: 'Code' + } + }, + mall_brand: { + table: { + id: 'ID', + name: 'Name', + pic_url: 'Picture', + desc: 'Description', + floor_price: 'Floor price', + actions: 'Actions' + }, + form: { + name: 'Name', + simple_desc: 'Description', + pic_url: 'Picture', + floor_price: 'Floor price' + }, + placeholder: { + filter_id: 'ID', + filter_name: 'Name' + } + }, + mall_category: { + table: { + id: 'ID', + name: 'Name', + icon_url: 'Icon', + pic_url: 'Picture', + keywords: 'Keywords', + desc: 'Description', + level: 'Level', + actions: 'Actions' + }, + form: { + name: 'Name', + keywords: 'Keywords', + level: 'Level', + pid: 'Parent', + icon_url: 'Icon', + pic_url: 'Picture', + desc: 'Description' + }, + value: { + level_L1: 'Level 1', + level_L2: 'Level 2' + } + }, + mall_order: { + text: { + date_range_separator: 'to', + expand_goods_name: 'Goods name: {goods_name}', + expand_specifications: 'Specifications: {specifications}', + expand_unit_price: 'Unit price: {price} 元', + expand_number: 'Quantity: {number}', + expand_subtotal_price: 'Subtotal: {price} 元', + detail_consigne: '(consignee) {consignee} ', + detail_mobile: '(mobile) {mobile} ', + detail_address: '(address) {address} ', + detail_price_info: '(actual){actual_price}元 = (goods){goods_price}元 + (freight){freight_price}元 - (coupon){coupon_price}元 - (integral){integral_price}元', + detail_pay_channel: '(payment channel) {pay_channel} ', + detail_pay_time: '(payment time) {pay_time} ', + detail_ship_channel: '(shipment company) {ship_channel} ', + detail_ship_sn: '(shipment SN) {ship_sn} ', + detail_ship_time: '(shipment time) {ship_time} ', + detail_refund_amount: '(refund amount) {refund_amount}元 ', + detail_refund_type: '(type) {refund_type} ', + detail_refund_content: '(content) {refund_content} ', + detail_refund_time: '(time) {refund_time} ', + detail_confirm_time: '(confirm time) {confirm_time} ' + }, + table: { + order_sn: 'Order SN', + avatar: 'Avatar', + user_name: 'User name', + add_time: 'Time added', + order_status: 'Status', + order_price: 'Order price', + actual_price: 'Actual price', + pay_time: 'Time paid', + consignee: 'Consignee', + mobile: 'Mobile', + ship_sn: 'Ship SN', + ship_channel: 'Ship channel', + actions: 'Actions', + detail_goods_name: 'Name', + detail_goods_sn: 'Goods SN', + detail_goods_specifications: 'Specifications', + detail_goods_price: 'Price', + detail_goods_number: 'Quantity', + detail_goods_pic_url: 'Picture', + pay_goods_name: 'Name', + pay_goods_specifications: 'Specifications', + pay_goods_number: 'Quantity' + }, + dialog: { + detail: 'Details', + pay: 'Pay', + ship: 'Ship', + refund: 'Refund' + }, + form: { + detail_order_sn: 'Order SN', + detail_order_status: 'Status', + detail_user_nickname: 'User nickname', + detail_message: 'User message', + detail_receiving_info: 'Receipt info', + detail_goods: 'Goods info', + detail_price_info: 'Price info', + detail_pay_info: 'Payment info', + detail_ship_info: 'Shipment info', + detail_refund_info: 'Refund info', + detail_receipt_info: 'Receipt info', + pay_old_money: 'Order amount', + pay_new_money: 'Payment amount', + ship_channel: 'Ship company', + ship_sn: 'Ship SN', + refund_money: 'Refund amount' + }, + placeholder: { + filter_nickname: 'Nickname', + filter_consignee: 'Consignee', + filter_order_sn: 'Order SN', + filter_time_start: 'From date', + filter_time_end: 'To date', + filter_order_status: 'Status', + ship_channel: 'Please choose' + }, + message: { + pay_confirm: 'Confirm that the current order (order number {order_sn}) has been paid offline?' + }, + button: { + pay: 'Pay', + ship: 'Ship', + refund: 'Refund', + detail_cancel: 'Cancel', + detail_print: 'Print' + } + }, + mall_aftersale: { + section: { + all: 'All', + uncheck: 'Awaiting approval', + unrefund: 'To refund' + }, + table: { + aftersale_sn: 'Aftersale SN', + order_id: 'Order ID', + user_id: 'User ID', + type: 'Type', + reason: 'Reason', + amount: 'Amount', + add_time: 'Time added', + actions: 'Actions', + detail_pictures: 'Pictures' + }, + dialog: { + detail: 'Details' + }, + form: { + id: 'ID', + aftersale_sn: 'Aftersale SN', + order_id: 'Order ID', + amount: 'Order amount', + status: 'Order status', + user_id: 'User ID', + type: 'Aftersale type', + reason: 'Reason for refund', + add_time: 'Time added', + update_time: 'Time updated', + handle_time: 'Time processed', + pictures: 'Pictures' + }, + value: { + status_1: 'Applied for, pending review', + status_2: 'Approved, pending refund', + status_3: 'Refunded', + status_4: 'Refund Successful', + type_0: 'Refund without receipt', + type_1: 'No Refund', + type_2: 'Return Refund' + }, + placeholder: { + filter_aftersale_sn: 'Aftersale SN', + filter_order_id: 'Order ID' + }, + button: { + batch_recept: 'Batch pass', + batch_reject: 'Batch reject', + recept: 'Pass', + reject: 'Reject', + refund: 'Refund', + cancel: 'Cancel' + } + }, + mall_issue: { + table: { + id: 'ID', + question: 'Question', + answer: 'Answer', + actions: 'Actions' + }, + form: { + question: 'Question', + answer: 'Answer' + }, + placeholder: { + filter_question: 'Question', + answer: 'Content' + } + }, + mall_keyword: { + text: { + yes: 'Yes', + no: 'No' + }, + table: { + id: 'ID', + keyword: 'Keyword', + url: 'URL', + is_hot: 'Hot', + is_default: 'Default', + actions: 'Actions' + }, + form: { + keyword: 'Keyword', + url: 'URL', + is_hot: 'Hot', + is_default: 'Default' + }, + placeholder: { + filter_keyword: 'Keyword', + filter_url: 'URL', + is_hot: 'Please choose', + is_default: 'Please choose' + }, + value: { + is_hot_true: 'Hot', + is_hot_false: 'Ordinary', + is_default_true: 'Default', + is_default_false: 'Non default' + } + }, + goods_list: { + table: { + id: 'ID', + name: 'Name', + pic_url: 'Picture', + share_url: 'Share', + detail: 'Detail', + counter_price: 'Counter price', + retail_price: 'Retail price', + is_new: 'New', + is_hot: 'Hot', + is_on_sale: 'On sale', + actions: 'Actions', + goods_sn: 'Goods SN', + gallery: 'Gallery', + brief: 'Description', + unit: 'Unit', + keywords: 'Keywords', + category_id: 'Category', + brand_id: 'Brand' + }, + dialog: { + detail: 'Details' + }, + value: { + is_new_true: 'New', + is_new_false: 'Not new', + is_hot_true: 'Hot', + is_hot_false: 'Ordinary', + is_on_sale_true: 'On sale', + is_on_sale_false: 'Not on sale' + }, + placeholder: { + filter_goods_id: 'Goods ID', + filter_goods_sn: 'Goods SN', + filter_name: 'Goods name' + } + }, + goods_edit: { + section: { + goods: 'Goods', + specifications: 'Specifications', + products: 'Products', + attributes: 'Attributes' + }, + table: { + specification_name: 'Name', + specification_value: 'Value', + specification_pic_url: 'Picture', + specification_actions: 'Actions', + product_specifications: 'Specifications', + product_price: 'Price', + product_number: 'Quantity', + product_url: 'Picture', + product_actions: 'Actions', + attribute_name: 'Name', + attribute_value: 'Value', + attribute_actions: 'Actions' + }, + dialog: { + create_specification: 'Specification', + create_product: 'Product', + create_attribute: 'Attribute', + edit_specification: 'Specification', + edit_product: 'Product', + edit_attribute_add: 'Add attribute', + edit_attribute_edit: 'Edit attribute' + }, + form: { + id: 'ID', + goods_sn: 'Goods SN', + name: 'Name', + counter_price: 'Counter price', + is_new: 'New', + is_hot: 'Hot', + is_on_sale: 'On sale', + pic_url: 'Picture', + gallery: 'Gallery', + unit: 'Unit', + keywords: 'Keywords', + category_id: 'Category', + brand_id: 'Brand', + brief: 'Description', + detail: 'Detail', + specification_name: 'Name', + specification_value: 'Value', + specification_pic_url: 'Picture', + product_specifications: 'Specifications', + product_price: 'Price', + product_number: 'Quantity', + product_url: 'Picture', + attribute_name: 'Name', + attribute_value: 'Value' + }, + value: { + is_new_true: 'New', + is_new_false: 'Not new', + is_hot_true: 'Hot', + is_hot_false: 'Ordinary', + is_on_sale_true: 'On sale', + is_on_sale_false: 'Not on sale', + multiple_spec_true: 'Multiple', + multiple_spec_false: 'Single' + }, + placeholder: { + unit: '件 / 个 / 盒' + }, + button: { + publish: 'Publish', + edit: 'Edit' + } + }, + goods_comment: { + table: { + user_id: 'User ID', + value_id: 'Item ID', + star: 'Rating', + content: 'Content', + pic_urls: 'Pictures', + add_time: 'Time added', + actions: 'Actions' + }, + dialog: { + reply: 'Reply' + }, + form: { + content: 'Content' + }, + placeholder: { + filter_user_id: 'User ID', + filter_value_id: 'Item ID' + } + }, + promotion_ad: { + table: { + id: 'ID', + name: 'Name', + content: 'Content', + url: 'Picture', + position: 'Position', + link: 'Link', + enabled: 'Enabled', + actions: 'Actions' + }, + form: { + name: 'Name', + content: 'Content', + url: 'Picture', + position: 'Position', + link: 'Link', + enabled: 'Enabled' + }, + value: { + position_1: 'Home', + enabled_true: 'On', + enabled_false: 'Off' + }, + placeholder: { + filter_name: 'Name', + filter_content: 'Content', + position: 'Please choose', + enabled: 'Please choose' + }, + help: { + url: 'Only jpg/png files can be uploaded and do not exceed 1024kb' + } + }, + promotion_coupon: { + text: { + days: 'days', + to_time: 'to', + units: 'units', + coupon_min: 'Available for {min}元 spent', + coupon_discount: 'Reduced by {discount}元', + unlimited: 'Unlimited' + }, + table: { + id: 'ID', + name: 'Name', + desc: 'Description', + tag: 'Tag', + min: 'Min spend', + discount: 'Discount', + limit: 'Limit/user', + goods_type: 'Goods type', + type: 'Coupon type', + total: 'Quantity', + status: 'Status', + actions: 'Actions', + category_name: 'Name', + category_actions: 'Actions', + goods_name: 'Name', + goods_sn: 'Goods SN', + goods_actions: 'Actions' + }, + form: { + name: 'Name', + desc: 'Description', + tag: 'Tag', + min: 'Min spend', + discount: 'Discount', + limit: 'Limit/user', + type: 'Coupon type', + total: 'Quantity', + time_type: 'Validity period', + goods_type: 'Goods type' + }, + value: { + time_type_0: 'Relative time', + time_type_1: 'Absolute time', + goods_type_0: 'All', + goods_type_1: 'By category', + goods_type_2: 'By goods' + }, + placeholder: { + filter_name: 'Name', + filter_type: 'Coupon type', + filter_status: 'Status', + start_time: 'Select date', + end_time: 'Select date', + category: 'Select category', + goods: 'Goods name / Goods ID' + } + }, + promotion_coupon_detail: { + text: { + coupon_min: 'Available for {min}元 spent', + coupon_discount: 'Reduced by {discount}元', + unlimited: 'Unlimited' + }, + table: { + name: 'Name', + desc: 'Description', + tag: 'Tag', + type: 'Coupon type', + min: 'Min spend', + discount: 'Discount', + limit: 'Limit/user', + status: 'Status', + goods_type: 'Goods type', + time_scope: 'Validity period', + code: 'Code', + total: 'Quantity', + id: 'ID', + user_id: 'User ID', + add_time: 'Time added', + use_status: 'Use status', + order_id: 'Order ID', + used_time: 'Time used' + }, + placeholder: { + filter_user_id: 'User ID', + filter_status: 'Status' + } + }, + promotion_topic: { + table: { + title: 'Title', + subtitle: 'Subtitle', + pic_url: 'Picture', + content: 'Content', + price: 'Price', + read_count: 'Read count', + actions: 'Actions' + }, + dialog: { + content_detail: 'Content detail' + }, + placeholder: { + filter_title: 'Title', + filter_subtitle: 'Subtitle', + filter_sort: 'Sort by' + } + }, + promotion_topic_edit: { + table: { + goods_id: 'ID', + goods_pic_url: 'Picture', + goods_name: 'Name', + goods_brief: 'Description', + goods_actions: 'Actions', + search_goods_id: 'ID', + search_goods_pic_url: 'Picture', + search_goods_name: 'Name' + }, + dialog: { + add_goods: 'Add goods' + }, + form: { + title: 'Title', + subtitle: 'Subtitle', + pic_url: 'Picture', + content: 'Content', + price: 'Price', + read_count: 'Read count', + goods: 'Goods' + }, + placeholder: { + search_goods_sn: 'Goods SN', + search_name: 'Name' + }, + button: { + goods_create: 'Add' + } + }, + promotion_groupon_rule: { + table: { + id: 'ID', + goods_id: 'Goods ID', + goods_name: 'Goods name', + pic_url: 'Picture', + discount: 'Discount', + discount_member: 'Min buy quantity', + status: 'Status', + expire_time: 'Expire time', + actions: 'Actions' + }, + form: { + goods_id: 'Goods ID', + discount: 'Discount', + discount_member: 'Min buy quantity', + expire_time: 'Expire time' + }, + placeholder: { + filter_goods_id: 'Goods ID', + expire_time: 'Select date' + } + }, + promotion_groupon_activity: { + table: { + order_id: 'Order ID', + user_id: 'User ID', + groupon_order_id: 'Order ID', + groupon_user_id: 'User ID', + subgroupons_length: 'Number used', + rules_discount: 'Discount', + rules_discount_member: 'Min buy quantity', + groupon_share_url: 'Picture', + rules_add_time: 'Time added', + rules_expire_time: 'Expire time' + }, + placeholder: { + filter_groupon_rule_id: 'Rule ID' + } + }, + sys_admin: { + table: { + id: 'ID', + username: 'Username', + avatar: 'Avatar', + role_ids: 'Roles', + actions: 'Actions' + }, + form: { + username: 'Username', + password: 'Password', + avatar: 'Avatar', + role_ids: 'Roles' + }, + placeholder: { + filter_username: 'Username', + role_ids: 'Please choose' + } + }, + sys_notice: { + table: { + title: 'Title', + content: 'Content', + add_time: 'Time added', + admin_id: 'Admin ID', + actions: 'Actions' + }, + dialog: { + content_detail: 'Content detail' + }, + form: { + title: 'Title', + content: 'Content' + }, + placeholder: { + filter_title: 'Title', + filter_content: 'Content' + } + }, + sys_log: { + table: { + admin: 'Admin', + ip: 'IP address', + add_time: 'Time added', + type: 'Type', + action: 'Action', + status: 'Status', + result: 'Result', + comment: 'Comment' + }, + placeholder: { + filter_name: 'Admin' + }, + value: { + status_success: 'Success', + status_error: 'Error' + } + }, + sys_role: { + table: { + name: 'Name', + desc: 'Description', + actions: 'Actions' + }, + dialog: { + permission: 'Permissions' + }, + form: { + name: 'Name', + desc: 'Description' + }, + placeholder: { + filter_name: 'Name' + } + }, + sys_os: { + table: { + key: 'Key', + name: 'Name', + type: 'Type', + size: 'size', + url: 'Picture', + url_link: 'Link', + actions: 'Actions' + }, + dialog: { + create: 'Create', + update: 'Update' + }, + form: { + name: 'Name' + }, + placeholder: { + filter_key: 'Key', + filter_name: 'Name' + }, + button: { + upload: 'Upload' + } + }, + config_mall: { + form: { + mall_name: 'Name', + mall_address: 'Address', + mall_coordinates: 'Coordinates', + mall_phone: 'Phone', + mall_qq: 'QQ' + }, + placeholder: { + mall_longitude: 'Longitude', + mall_latitude: 'Latitude' + } + }, + config_express: { + form: { + freight_min: 'Min spend for free delivery', + freight_value: 'Delivery fee' + } + }, + config_order: { + text: { + minutes: 'minutes', + days: 'days' + }, + form: { + unpaid: 'Timeout after order creation', + unconfirm: 'Overdue after shipment', + comment: 'Overdue after confirming receipt' + }, + help: { + unpaid: 'The order is automatically canceled if the user does not pay', + unconfirm: 'No confirmation of receipt, then the order is automatically confirmed for receipt', + comment: 'If the product is not evaluated, it will be disqualified' + } + }, + config_wx: { + section: { + home: 'Home', + other: 'Other' + }, + form: { + index_new: 'Number of new goods shown', + index_hot: 'Number of hot goods shown', + index_brand: 'Number of brands shown', + index_topic: 'Number of topics shown', + catlog_list: 'Number of categories shown', + catlog_goods: 'Number of goods shown', + share: 'Product sharing function' + } + }, + profile_notice: { + text: { + read: '已读', + unread: '未读', + admin_time: 'Notified by {admin} at {time}:' + }, + section: { + unread: 'Unread', + read: 'Read', + all: 'All' + }, + table: { + notice_title: 'Title', + add_time: 'Time added', + read_time: 'Time read', + actions: 'Actions' + }, + placeholder: { + filter_title: 'Title' + }, + button: { + batch_read: 'Batch read', + read: 'Read' + } + }, + profile_password: { + form: { + old_password: 'Old password', + new_password: 'New password', + new_password_2: 'Confirm password' + } + } +} diff --git a/litemall-admin/src/locales/zh-Hans.js b/litemall-admin/src/locales/zh-Hans.js new file mode 100644 index 000000000..a94b3e75e --- /dev/null +++ b/litemall-admin/src/locales/zh-Hans.js @@ -0,0 +1,996 @@ +// https://element.eleme.cn/#/en-US/component/i18n +import el from 'element-ui/lib/locale/lang/zh-CN' + +export default { + ...el, + lang: '中文', + app: { + menu: { + dashboard: '首页', + user: '用户管理', + user_user: '会员管理', + user_address: '收货地址', + user_collect: '会员收藏', + user_footprint: '会员足迹', + user_history: '搜索历史', + user_feedback: '意见反馈', + mall: '商场管理', + mall_region: '行政区域', + mall_brand: '品牌制造商', + mall_category: '商品类目', + mall_order: '订单管理', + mall_aftersale: '售后管理', + mall_issue: '通用问题', + mall_keyword: '关键词', + goods: '商品管理', + goods_list: '商品列表', + goods_create: '商品上架', + goods_edit: '商品编辑', + goods_comment: '商品评论', + promotion: '推广管理', + promotion_ad: '广告管理', + promotion_coupon: '优惠券管理', + promotion_coupon_detail: '优惠券详情', + promotion_topic: '专题管理', + promotion_topic_create: '专题创建', + promotion_topic_edit: '专题编辑', + promotion_groupon_rule: '团购规则', + promotion_groupon_activity: '团购活动', + sys: '系统管理', + sys_admin: '管理员', + sys_notice: '通知管理', + sys_log: '操作日志', + sys_role: '角色管理', + sys_os: '对象存储', + config: '配置管理', + config_mall: '商场配置', + config_express: '运费配置', + config_order: '订单配置', + config_wx: '小程序配置', + stat: '统计报表', + stat_user: '用户统计', + stat_order: '订单统计', + stat_goods: '商品统计', + external_link: '外链', + external_link_tencent_cos: '腾讯云存储', + external_link_tencent_sms: '腾讯云短信', + external_link_weixin_pay: '微信支付', + external_link_weixin_mpkf: '小程序客服', + external_link_alibaba_oss: '阿里云存储', + external_link_qiniu_kodo: '七牛云存储', + external_link_kdniao_api: '快递鸟', + profile_password: '修改密码', + profile_notice: '通知中心' + }, + button: { + add: '+ 增加', + back_to_top: '回到顶部', + batch_delete: '批量删除', + cancel: '取消', + confirm: '确定', + create: '添加', + delete: '删除', + detail: '详情', + download: '导出', + edit: '编辑', + permission: '授权', + reply: '回复', + search: '查找', + settings: '设置', + view: '查看' + }, + tooltip: { + back_to_top: '返回顶部' + }, + message: { + list_loading: '正在查询中。。。' + } + }, + login: { + page: { + title: '管理员登录' + }, + placeholder: { + username: '管理员账户', + password: '管理员密码' + }, + button: { + login: '登录' + } + }, + navbar: { + tooltip: { + locale: '语言', + full_screen: '全屏', + size_select: '布局大小', + notice: '通知中心' + }, + menu: { + home: '首页', + github: 'Github', + gitee: '码云', + password: '密码修改', + logout: '退出' + } + }, + dashboard: { + section: { + user_total: '用户数量', + goods_total: '商品数量', + product_total: '货品数量', + order_total: '订单数量' + } + }, + user_user: { + table: { + id: '用户ID', + nickname: '用户昵称', + avatar: '用户头像', + mobile: '手机号码', + gender: '性别', + birthday: '生日', + user_level: '用户等级', + status: '状态', + actions: '操作' + }, + dialog: { + edit: '用户编辑' + }, + form: { + username: '用户名', + nickname: '用户昵称', + mobile: '用户手机', + gender: '用户性别', + user_level: '用户等级', + status: '状态' + }, + placeholder: { + filter_username: '请输入用户名', + filter_user_id: '请输入用户Id', + filter_mobile: '请输入手机号', + gender: '请选择', + user_level: '请选择', + status: '请选择' + } + }, + user_address: { + table: { + id: '地址ID', + user_id: '用户ID', + name: '收货人名称', + tel: '手机号码', + address_region: '区域地址', + address_detail: '区域地址', + is_default: '默认' + }, + placeholder: { + filter_user_id: '请输入用户ID', + filter_name: '请输入收货人名称' + } + }, + user_collect: { + table: { + id: '收藏ID', + user_id: '用户ID', + value_id: '商品ID', + add_time: '添加时间' + }, + placeholder: { + filter_user_id: '请输入用户ID', + filter_value_id: '请输入商品ID' + } + }, + user_footprint: { + table: { + id: '足迹ID', + user_id: '用户ID', + goods_id: '商品ID', + add_time: '添加时间' + }, + placeholder: { + filter_user_id: '请输入用户ID', + filter_goods_id: '请输入商品ID' + } + }, + user_history: { + table: { + id: '搜索ID', + user_id: '用户ID', + keyword: '关键字', + add_time: '添加时间' + }, + placeholder: { + filter_user_id: '请输入用户ID', + filter_keyword: '请输入搜索历史关键字' + } + }, + user_feedback: { + table: { + id: '反馈ID', + username: '用户名', + mobile: '手机号码', + feed_type: '反馈类型', + content: '反馈内容', + pic_urls: '反馈图片', + add_time: '时间' + }, + placeholder: { + filter_username: '请输入用户名', + filter_id: '请输入反馈ID' + } + }, + mall_region: { + table: { + name: '区域名称', + type: '区域类型', + code: '区域编码' + } + }, + mall_brand: { + table: { + id: '品牌商ID', + name: '品牌商名称', + pic_url: '品牌商图片', + desc: '介绍', + floor_price: '底价', + actions: '操作' + }, + form: { + name: '品牌商名称', + simple_desc: '介绍', + pic_url: '品牌商图片', + floor_price: '底价' + }, + placeholder: { + filter_id: '请输入品牌商ID', + filter_name: '请输入品牌商名称' + } + }, + mall_category: { + table: { + id: '类目ID', + name: '类目名', + icon_url: '类目图标', + pic_url: '类目图片', + keywords: '关键字', + desc: '简介', + level: '级别', + actions: '操作' + }, + form: { + name: '类目名称', + keywords: '关键字', + level: '级别', + pid: '父类目', + icon_url: '类目图标', + pic_url: '类目图片', + desc: '类目简介' + }, + value: { + level_L1: '一级类目', + level_L2: '二级类目' + } + }, + mall_order: { + text: { + date_range_separator: '至', + expand_goods_name: '商品名称:{goods_name}', + expand_specifications: '规格:{specifications}', + expand_unit_price: '单价:{price} 元', + expand_number: '数量:{number} 件', + expand_subtotal_price: '小计:{price} 元', + detail_consigne: '(收货人){consignee}', + detail_mobile: '(手机号){mobile}', + detail_address: '(地址){address}', + detail_price_info: '(实际费用){actual_price}元 = (商品总价){goods_price}元 + (快递费用){freight_price}元 - (优惠减免){coupon_price}元 - (积分减免){integral_price}元', + detail_pay_channel: '(支付渠道){pay_channel}', + detail_pay_time: '(支付时间){pay_time}', + detail_ship_channel: '(快递公司){ship_channel}', + detail_ship_sn: '(快递单号){ship_sn}', + detail_ship_time: '(发货时间){ship_time}', + detail_refund_amount: '(退款金额){refund_amount}元', + detail_refund_type: '(退款类型){refund_type}', + detail_refund_content: '(退款备注){refund_content}', + detail_refund_time: '(退款时间){refund_time}', + detail_confirm_time: '(确认收货时间){confirm_time}' + }, + table: { + order_sn: '订单编号', + avatar: '用户头像', + user_name: '下单用户', + add_time: '下单时间', + order_status: '订单状态', + order_price: '订单金额', + actual_price: '实付金额', + pay_time: '支付时间', + consignee: '收货人', + mobile: '收货电话', + ship_sn: '物流单号', + ship_channel: '物流渠道', + actions: '操作', + detail_goods_name: '商品名称', + detail_goods_sn: '商品编号', + detail_goods_specifications: '货品规格', + detail_goods_price: '货品价格', + detail_goods_number: '货品数量', + detail_goods_pic_url: '货品图片', + pay_goods_name: '商品', + pay_goods_specifications: '规格', + pay_goods_number: '下单数量' + }, + dialog: { + detail: '订单详情', + pay: '订单收款', + ship: '发货', + refund: '退款' + }, + form: { + detail_order_sn: '订单编号', + detail_order_status: '订单状态', + detail_user_nickname: '订单用户', + detail_message: '用户留言', + detail_receiving_info: '收货信息', + detail_goods: '商品信息', + detail_price_info: '费用信息', + detail_pay_info: '支付信息', + detail_ship_info: '快递信息', + detail_refund_info: '退款信息', + detail_receipt_info: '收货信息', + pay_old_money: '订单金额', + pay_new_money: '付款金额', + ship_channel: '快递公司', + ship_sn: '快递编号', + refund_money: '退款金额' + }, + placeholder: { + filter_nickname: '请输入用户昵称', + filter_consignee: '请输入收货人名称', + filter_order_sn: '请输入订单编号', + filter_time_start: '开始日期', + filter_time_end: '结束日期', + filter_order_status: '请选择订单状态', + ship_channel: '请选择' + }, + message: { + pay_confirm: '确认当前订单(订单编号 {order_sn} ) 已经完成线下收款 ?' + }, + button: { + pay: '收款', + ship: '发货', + refund: '退款', + detail_cancel: '取 消', + detail_print: '打 印' + } + }, + mall_aftersale: { + section: { + all: '全部', + uncheck: '待审核', + unrefund: '待退款' + }, + table: { + aftersale_sn: '售后编号', + order_id: '订单ID', + user_id: '用户ID', + type: '售后类型', + reason: '退款原因', + amount: '退款价格', + add_time: '申请时间', + actions: '操作', + detail_pictures: '售后图片' + }, + dialog: { + detail: '售后详情' + }, + form: { + id: '售后id', + aftersale_sn: '售后编号', + order_id: '订单号', + amount: '订单金额', + status: '订单状态', + user_id: '订单用户id', + type: '售后类型', + reason: '退款原因', + add_time: '申请时间', + update_time: '更新时间', + handle_time: '处理时间', + pictures: '售后图片' + }, + value: { + status_1: '已申请,待审核', + status_2: '审核通过,待退款', + status_3: '退款成功', + status_4: '审核不通过,已拒绝', + type_0: '未收货退款', + type_1: '不退货退款', + type_2: '退货退款' + }, + placeholder: { + filter_aftersale_sn: '请输入售后编号', + filter_order_id: '请输入订单ID' + }, + button: { + batch_recept: '批量通过', + batch_reject: '批量拒绝', + recept: '通过', + reject: '拒绝', + refund: '退款', + cancel: '取 消' + } + }, + mall_issue: { + table: { + id: '问题ID', + question: '问题内容', + answer: '问题回复', + actions: '操作' + }, + form: { + question: '问题', + answer: '回复' + }, + placeholder: { + filter_question: '请输入问题', + answer: '请输入内容' + } + }, + mall_keyword: { + text: { + yes: '是', + no: '否' + }, + table: { + id: '关键词ID', + keyword: '关键词', + url: '跳转链接', + is_hot: '是否推荐', + is_default: '是否默认', + actions: '操作' + }, + form: { + keyword: '关键词', + url: '跳转链接', + is_hot: '是否推荐', + is_default: '是否默认' + }, + placeholder: { + filter_keyword: '请输入关键字', + filter_url: '请输入跳转链接', + is_hot: '请选择', + is_default: '请选择' + }, + value: { + is_hot_true: '推荐', + is_hot_false: '普通', + is_default_true: '默认', + is_default_false: '非默认' + } + }, + goods_list: { + table: { + id: '商品ID', + name: '名称', + pic_url: '图片', + share_url: '分享图', + detail: '详情', + counter_price: '市场售价', + retail_price: '当前价格', + is_new: '是否新品', + is_hot: '是否热品', + is_on_sale: '是否在售', + actions: '操作', + goods_sn: '商品编号', + gallery: '宣传画廊', + brief: '商品介绍', + unit: '商品单位', + keywords: '关键字', + category_id: '类目ID', + brand_id: '品牌商ID' + }, + dialog: { + detail: '商品详情' + }, + value: { + is_new_true: '新品', + is_new_false: '非新品', + is_hot_true: '热卖', + is_hot_false: '普通', + is_on_sale_true: '在售', + is_on_sale_false: '未售' + }, + placeholder: { + filter_goods_id: '请输入商品ID', + filter_goods_sn: '请输入商品编号', + filter_name: '请输入商品名称' + } + }, + goods_edit: { + section: { + goods: '商品介绍', + specifications: '商品规格', + products: '商品库存', + attributes: '商品参数' + }, + table: { + specification_name: '规格名', + specification_value: '规格值', + specification_pic_url: '规格图片', + specification_actions: '操作', + product_specifications: '货品规格', + product_price: '货品售价', + product_number: '货品数量', + product_url: '货品图片', + product_actions: '操作', + attribute_name: '商品参数名称', + attribute_value: '商品参数值', + attribute_actions: '操作' + }, + dialog: { + create_specification: '设置规格', + create_product: '添加货品', + create_attribute: '添加商品参数', + edit_specification: '设置规格', + edit_product: '编辑货品', + edit_attribute_add: '添加商品参数', + edit_attribute_edit: '编辑商品参数' + }, + form: { + id: '商品ID', + goods_sn: '商品编号', + name: '商品名称', + counter_price: '市场售价', + is_new: '是否新品', + is_hot: '是否热卖', + is_on_sale: '是否在售', + pic_url: '商品图片', + gallery: '宣传画廊', + unit: '商品单位', + keywords: '关键字', + category_id: '所属分类', + brand_id: '所属品牌商', + brief: '商品简介', + detail: '商品详细介绍', + specification_name: '规格名', + specification_value: '规格值', + specification_pic_url: '规格图片', + product_specifications: '货品规格列', + product_price: '货品售价', + product_number: '货品数量', + product_url: '货品图片', + attribute_name: '商品参数名称', + attribute_value: '商品参数值' + }, + value: { + is_new_true: '新品', + is_new_false: '非新品', + is_hot_true: '热卖', + is_hot_false: '普通', + is_on_sale_true: '在售', + is_on_sale_false: '未售', + multiple_spec_true: '多规格支持', + multiple_spec_false: '默认标准规格' + }, + placeholder: { + unit: '件 / 个 / 盒' + }, + button: { + publish: '上架', + edit: '更新商品' + } + }, + goods_comment: { + table: { + user_id: '用户ID', + value_id: '商品ID', + star: '打分', + content: '评论内容', + pic_urls: '评论图片', + add_time: '时间', + actions: '操作' + }, + dialog: { + reply: '回复' + }, + form: { + content: '回复内容' + }, + placeholder: { + filter_user_id: '请输入用户ID', + filter_value_id: '请输入商品ID' + } + }, + promotion_ad: { + table: { + id: '广告ID', + name: '广告标题', + content: '广告内容', + url: '广告图片', + position: '广告位置', + link: '活动链接', + enabled: '是否启用', + actions: '操作' + }, + form: { + name: '广告标题', + content: '广告内容', + url: '广告图片', + position: '广告位置', + link: '活动链接', + enabled: '是否启用' + }, + value: { + position_1: '首页', + enabled_true: '启用', + enabled_false: '不启用' + }, + placeholder: { + filter_name: '请输入广告标题', + filter_content: '请输入广告内容', + position: '请选择', + enabled: '请选择' + }, + help: { + url: '只能上传jpg/png文件,且不超过1024kb' + } + }, + promotion_coupon: { + text: { + days: '天', + to_time: '至', + units: '张', + coupon_min: '满{min}元可用', + coupon_discount: '减免{discount}元', + unlimited: '不限' + }, + table: { + id: '优惠券ID', + name: '优惠券名称', + desc: '介绍', + tag: '标签', + min: '最低消费', + discount: '满减金额', + limit: '每人限领', + goods_type: '商品使用范围', + type: '优惠券类型', + total: '优惠券数量', + status: '状态', + actions: '操作', + category_name: '分类名称', + category_actions: '操作', + goods_name: '商品名称', + goods_sn: '商品编号', + goods_actions: '操作' + }, + form: { + name: '优惠券名称', + desc: '介绍', + tag: '标签', + min: '最低消费', + discount: '满减金额', + limit: '每人限领', + type: '分发类型', + total: '优惠券数量', + time_type: '有效期', + goods_type: '商品限制范围' + }, + value: { + time_type_0: '领券相对天数', + time_type_1: '指定绝对时间', + goods_type_0: '全场通用', + goods_type_1: '指定分类', + goods_type_2: '指定商品' + }, + placeholder: { + filter_name: '请输入优惠券标题', + filter_type: '请选择优惠券类型', + filter_status: '请选择优惠券状态', + start_time: '选择日期', + end_time: '选择日期', + category: '请选择分类名称', + goods: '商品名称/商品货号' + } + }, + promotion_coupon_detail: { + text: { + coupon_min: '满{min}元可用', + coupon_discount: '减免{discount}元', + unlimited: '不限' + }, + table: { + name: '名称', + desc: '介绍名称', + tag: '标签', + type: '优惠券类型', + min: '最低消费', + discount: '优惠面值', + limit: '每人限额', + status: '当前状态', + goods_type: '商品范围', + time_scope: '有效期', + code: '优惠兑换码', + total: '发行数量', + id: '用户优惠券ID', + user_id: '用户ID', + add_time: '领取时间', + use_status: '使用状态', + order_id: '订单ID', + used_time: '使用时间' + }, + placeholder: { + filter_user_id: '请输入用户ID', + filter_status: '请选择使用状态' + } + }, + promotion_topic: { + table: { + title: '专题标题', + subtitle: '专题子标题', + pic_url: '图片', + content: '专题详情', + price: '底价', + read_count: '阅读数量', + actions: '操作' + }, + dialog: { + content_detail: '专题详情' + }, + placeholder: { + filter_title: '请输入专题标题', + filter_subtitle: '请输入专题子标题', + filter_sort: '请选择排序字段' + } + }, + promotion_topic_edit: { + table: { + goods_id: '商品ID', + goods_pic_url: '图片', + goods_name: '商品名称', + goods_brief: '商品介绍', + goods_actions: '操作', + search_goods_id: '商品ID', + search_goods_pic_url: '图片', + search_goods_name: '商品名称' + }, + dialog: { + add_goods: '添加商品' + }, + form: { + title: '专题标题', + subtitle: '专题子标题', + pic_url: '专题图片', + content: '专题内容', + price: '商品低价', + read_count: '阅读量', + goods: '专题商品' + }, + placeholder: { + search_goods_sn: '请输入商品编号', + search_name: '请输入商品名称' + }, + button: { + goods_create: '创建商品' + } + }, + promotion_groupon_rule: { + table: { + id: '团购规则ID', + goods_id: '商品ID', + goods_name: '名称', + pic_url: '图片', + discount: '团购优惠', + discount_member: '团购要求', + status: '状态', + expire_time: '结束时间', + actions: '操作' + }, + form: { + goods_id: '商品ID', + discount: '团购折扣', + discount_member: '团购人数要求', + expire_time: '过期时间' + }, + placeholder: { + filter_goods_id: '请输入商品编号', + expire_time: '选择日期' + } + }, + promotion_groupon_activity: { + table: { + order_id: '订单ID', + user_id: '用户ID', + groupon_order_id: '订单ID', + groupon_user_id: '用户ID', + subgroupons_length: '参与人数', + rules_discount: '团购折扣', + rules_discount_member: '团购要求', + groupon_share_url: '分享图片', + rules_add_time: '开始时间', + rules_expire_time: '结束时间' + }, + placeholder: { + filter_groupon_rule_id: '请输入团购规则ID' + } + }, + sys_admin: { + table: { + id: '管理员ID', + username: '管理员名称', + avatar: '管理员头像', + role_ids: '管理员角色', + actions: '操作' + }, + form: { + username: '管理员名称', + password: '管理员密码', + avatar: '管理员头像', + role_ids: '管理员角色' + }, + placeholder: { + filter_username: '请输入管理员名称', + role_ids: '请选择' + } + }, + sys_notice: { + table: { + title: '通知标题', + content: '通知详情', + add_time: '添加时间', + admin_id: '管理员ID', + actions: '操作' + }, + dialog: { + content_detail: '通知详情' + }, + form: { + title: '通知标题', + content: '通知内容' + }, + placeholder: { + filter_title: '请输入标题关键字', + filter_content: '请输入内容关键字' + } + }, + sys_log: { + table: { + admin: '操作管理员', + ip: 'IP地址', + add_time: '操作时间', + type: '操作类别', + action: '操作动作', + status: '操作状态', + result: '操作结果', + comment: '备注信息' + }, + placeholder: { + filter_name: '请输入操作管理员' + }, + value: { + status_success: '成功', + status_error: '失败' + } + }, + sys_role: { + table: { + name: '角色名称', + desc: '说明', + actions: '操作' + }, + dialog: { + permission: '权限配置' + }, + form: { + name: '角色名称', + desc: '说明' + }, + placeholder: { + filter_name: '请输入角色名称' + } + }, + sys_os: { + table: { + key: '对象KEY', + name: '对象名称', + type: '对象类型', + size: '对象大小', + url: '图片', + url_link: '图片链接', + actions: '操作' + }, + dialog: { + create: '上传对象', + update: '修改对象名称' + }, + form: { + name: '对象名称' + }, + placeholder: { + filter_key: '请输入对象KEY', + filter_name: '请输入对象名称' + }, + button: { + upload: '点击上传' + } + }, + config_mall: { + form: { + mall_name: '商场名称', + mall_address: '商场地址', + mall_coordinates: '地理坐标', + mall_phone: '联系电话', + mall_qq: '联系QQ' + }, + placeholder: { + mall_longitude: '经度', + mall_latitude: '纬度' + } + }, + config_express: { + form: { + freight_min: '运费满减所需最低消费', + freight_value: '运费满减不足所需运费' + } + }, + config_order: { + text: { + minutes: '分钟', + days: '天' + }, + form: { + unpaid: '用户下单后超时', + unconfirm: '订单发货后超期', + comment: '确认收货后超期' + }, + help: { + unpaid: '用户未付款,则订单自动取消', + unconfirm: '未确认收货,则订单自动确认收货', + comment: '未评价商品,则取消评价资格' + } + }, + config_wx: { + section: { + home: '首页配置', + other: '其他配置' + }, + form: { + index_new: '新品首发栏目商品显示数量', + index_hot: '人气推荐栏目商品显示数量', + index_brand: '品牌制造商直供栏目品牌商显示数量', + index_topic: '专题精选栏目显示数量', + catlog_list: '分类栏目显示数量', + catlog_goods: '分类栏目商品显示数量', + share: '商品分享功能' + } + }, + profile_notice: { + text: { + read: '已读', + unread: '未读', + admin_time: '{admin} 于 {time} 通知如下内容:' + }, + section: { + unread: '未读通知', + read: '已读通知', + all: '所有通知' + }, + table: { + notice_title: '通知标题', + add_time: '通知时间', + read_time: '通知状态', + actions: '操作' + }, + placeholder: { + filter_title: '请输入标题关键字' + }, + button: { + batch_read: '批量已读', + read: '阅读' + } + }, + profile_password: { + form: { + old_password: '原密码', + new_password: '新密码', + new_password_2: '确认密码' + } + } +} diff --git a/litemall-admin/src/main.js b/litemall-admin/src/main.js index 2de079a61..7c5e6b536 100644 --- a/litemall-admin/src/main.js +++ b/litemall-admin/src/main.js @@ -1,10 +1,12 @@ import Vue from 'vue' +import VueI18n from 'vue-i18n' // translations import Cookies from 'js-cookie' import 'normalize.css/normalize.css' // A modern alternative to CSS resets import Element from 'element-ui' +import ElementLocale from 'element-ui/lib/locale' import './styles/element-variables.scss' import '@/styles/index.scss' // global css @@ -22,6 +24,40 @@ import permission from '@/directive/permission/index.js' // 权限判断指令 import Print from '@/utils/print' // 打印 +Vue.use(VueI18n) + +// Load all locales and remember context +// https://kazupon.github.io/vue-i18n/guide/hot-reload.html +function loadMessages() { + const context = require.context('./locales', false, /[a-z0-9-_]+\.js$/i) + + const messages = context + .keys() + .sort() + .map((key) => ({ key, locale: key.match(/[a-z0-9-_]+/i)[0] })) + .reduce( + (messages, { key, locale }) => ({ + ...messages, + [locale]: context(key).default + }), + {} + ) + + return { context, messages } +} + +const { context, messages } = loadMessages() + +// VueI18n instance +const i18n = new VueI18n({ + locale: 'zh-Hans', + messages +}) + +// Update Element UI locale when Vue locale is changed +// https://element.eleme.cn/#/en-US/component/i18n +ElementLocale.i18n((key, value) => i18n.t(key, value)) + Vue.use(Print) Vue.use(Element, { @@ -41,5 +77,21 @@ new Vue({ el: '#app', router, store, + i18n, render: h => h(App) }) + +// Hot updates +// https://kazupon.github.io/vue-i18n/guide/hot-reload.html +if (module.hot) { + module.hot.accept(context.id, () => { + const { messages: newMessages } = loadMessages() + + Object.keys(newMessages) + .filter((locale) => messages[locale] !== newMessages[locale]) + .forEach((locale) => { + messages[locale] = newMessages[locale] + i18n.setLocaleMessage(locale, messages[locale]) + }) + }) +} diff --git a/litemall-admin/src/router/index.js b/litemall-admin/src/router/index.js index 836d62e87..f64d84bcf 100644 --- a/litemall-admin/src/router/index.js +++ b/litemall-admin/src/router/index.js @@ -65,7 +65,7 @@ export const constantRoutes = [ path: 'dashboard', component: () => import('@/views/dashboard/index'), name: 'Dashboard', - meta: { title: '首页', icon: 'dashboard', affix: true } + meta: { title: 'app.menu.dashboard', icon: 'dashboard', affix: true } } ] } @@ -79,7 +79,7 @@ export const asyncRoutes = [ alwaysShow: true, name: 'userManage', meta: { - title: '用户管理', + title: 'app.menu.user', icon: 'chart' }, children: [ @@ -89,7 +89,7 @@ export const asyncRoutes = [ name: 'user', meta: { perms: ['GET /admin/user/list'], - title: '会员管理', + title: 'app.menu.user_user', noCache: true } }, @@ -99,7 +99,7 @@ export const asyncRoutes = [ name: 'address', meta: { perms: ['GET /admin/address/list'], - title: '收货地址', + title: 'app.menu.user_address', noCache: true } }, @@ -109,7 +109,7 @@ export const asyncRoutes = [ name: 'collect', meta: { perms: ['GET /admin/collect/list'], - title: '会员收藏', + title: 'app.menu.user_collect', noCache: true } }, @@ -119,7 +119,7 @@ export const asyncRoutes = [ name: 'footprint', meta: { perms: ['GET /admin/footprint/list'], - title: '会员足迹', + title: 'app.menu.user_footprint', noCache: true } }, @@ -129,7 +129,7 @@ export const asyncRoutes = [ name: 'history', meta: { perms: ['GET /admin/history/list'], - title: '搜索历史', + title: 'app.menu.user_history', noCache: true } }, @@ -139,7 +139,7 @@ export const asyncRoutes = [ name: 'feedback', meta: { perms: ['GET /admin/feedback/list'], - title: '意见反馈', + title: 'app.menu.user_feedback', noCache: true } } @@ -153,7 +153,7 @@ export const asyncRoutes = [ alwaysShow: true, name: 'mallManage', meta: { - title: '商场管理', + title: 'app.menu.mall', icon: 'chart' }, children: [ @@ -162,7 +162,7 @@ export const asyncRoutes = [ component: () => import('@/views/mall/region'), name: 'region', meta: { - title: '行政区域', + title: 'app.menu.mall_region', noCache: true } }, @@ -172,7 +172,7 @@ export const asyncRoutes = [ name: 'brand', meta: { perms: ['GET /admin/brand/list', 'POST /admin/brand/create', 'GET /admin/brand/read', 'POST /admin/brand/update', 'POST /admin/brand/delete'], - title: '品牌制造商', + title: 'app.menu.mall_brand', noCache: true } }, @@ -182,7 +182,7 @@ export const asyncRoutes = [ name: 'category', meta: { perms: ['GET /admin/category/list', 'POST /admin/category/create', 'GET /admin/category/read', 'POST /admin/category/update', 'POST /admin/category/delete'], - title: '商品类目', + title: 'app.menu.mall_category', noCache: true } }, @@ -192,7 +192,7 @@ export const asyncRoutes = [ name: 'order', meta: { perms: ['GET /admin/order/list', 'GET /admin/order/detail', 'POST /admin/order/ship', 'POST /admin/order/refund', 'POST /admin/order/delete', 'POST /admin/order/reply'], - title: '订单管理', + title: 'app.menu.mall_order', noCache: true } }, @@ -202,7 +202,7 @@ export const asyncRoutes = [ name: 'aftersale', meta: { perms: ['GET /admin/aftersale/list', 'GET /admin/aftersale/detail', 'POST /admin/order/receive', 'POST /admin/aftersale/complete', 'POST /admin/aftersale/reject'], - title: '售后管理', + title: 'app.menu.mall_aftersale', noCache: true } }, @@ -212,7 +212,7 @@ export const asyncRoutes = [ name: 'issue', meta: { perms: ['GET /admin/issue/list', 'POST /admin/issue/create', 'GET /admin/issue/read', 'POST /admin/issue/update', 'POST /admin/issue/delete'], - title: '通用问题', + title: 'app.menu.mall_issue', noCache: true } }, @@ -222,7 +222,7 @@ export const asyncRoutes = [ name: 'keyword', meta: { perms: ['GET /admin/keyword/list', 'POST /admin/keyword/create', 'GET /admin/keyword/read', 'POST /admin/keyword/update', 'POST /admin/keyword/delete'], - title: '关键词', + title: 'app.menu.mall_keyword', noCache: true } } @@ -236,7 +236,7 @@ export const asyncRoutes = [ alwaysShow: true, name: 'goodsManage', meta: { - title: '商品管理', + title: 'app.menu.goods', icon: 'chart' }, children: [ @@ -246,7 +246,7 @@ export const asyncRoutes = [ name: 'goodsList', meta: { perms: ['GET /admin/goods/list', 'POST /admin/goods/delete'], - title: '商品列表', + title: 'app.menu.goods_list', noCache: true } }, @@ -256,7 +256,7 @@ export const asyncRoutes = [ name: 'goodsCreate', meta: { perms: ['POST /admin/goods/create'], - title: '商品上架', + title: 'app.menu.goods_create', noCache: true } }, @@ -266,7 +266,7 @@ export const asyncRoutes = [ name: 'goodsEdit', meta: { perms: ['GET /admin/goods/detail', 'POST /admin/goods/update', 'POST /admin/goods/catAndBrand'], - title: '商品编辑', + title: 'app.menu.goods_edit', noCache: true }, hidden: true @@ -277,7 +277,7 @@ export const asyncRoutes = [ name: 'goodsComment', meta: { perms: ['GET /admin/comment/list', 'POST /admin/comment/delete'], - title: '商品评论', + title: 'app.menu.goods_comment', noCache: true } } @@ -290,7 +290,7 @@ export const asyncRoutes = [ alwaysShow: true, name: 'promotionManage', meta: { - title: '推广管理', + title: 'app.menu.promotion', icon: 'chart' }, children: [ @@ -300,7 +300,7 @@ export const asyncRoutes = [ name: 'ad', meta: { perms: ['GET /admin/ad/list', 'POST /admin/ad/create', 'GET /admin/ad/read', 'POST /admin/ad/update', 'POST /admin/ad/delete'], - title: '广告管理', + title: 'app.menu.promotion_ad', noCache: true } }, @@ -310,7 +310,7 @@ export const asyncRoutes = [ name: 'coupon', meta: { perms: ['GET /admin/coupon/list', 'POST /admin/coupon/create', 'POST /admin/coupon/update', 'POST /admin/coupon/delete'], - title: '优惠券管理', + title: 'app.menu.promotion_coupon', noCache: true } }, @@ -320,7 +320,7 @@ export const asyncRoutes = [ name: 'couponDetail', meta: { perms: ['GET /admin/coupon/list', 'GET /admin/coupon/listuser'], - title: '优惠券详情', + title: 'app.menu.promotion_coupon_detail', noCache: true }, hidden: true @@ -331,7 +331,7 @@ export const asyncRoutes = [ name: 'topic', meta: { perms: ['GET /admin/topic/list', 'POST /admin/topic/create', 'GET /admin/topic/read', 'POST /admin/topic/update', 'POST /admin/topic/delete'], - title: '专题管理', + title: 'app.menu.promotion_topic', noCache: true } }, @@ -341,7 +341,7 @@ export const asyncRoutes = [ name: 'topicCreate', meta: { perms: ['POST /admin/topic/create'], - title: '专题创建', + title: 'app.menu.promotion_topic_create', noCache: true }, hidden: true @@ -352,7 +352,7 @@ export const asyncRoutes = [ name: 'topicEdit', meta: { perms: ['GET /admin/topic/read', 'POST /admin/topic/update'], - title: '专题编辑', + title: 'app.menu.promotion_topic_edit', noCache: true }, hidden: true @@ -363,7 +363,7 @@ export const asyncRoutes = [ name: 'grouponRule', meta: { perms: ['GET /admin/groupon/list', 'POST /admin/groupon/create', 'POST /admin/groupon/update', 'POST /admin/groupon/delete'], - title: '团购规则', + title: 'app.menu.promotion_groupon_rule', noCache: true } }, @@ -373,7 +373,7 @@ export const asyncRoutes = [ name: 'grouponActivity', meta: { perms: ['GET /admin/groupon/listRecord'], - title: '团购活动', + title: 'app.menu.promotion_groupon_activity', noCache: true } } @@ -387,7 +387,7 @@ export const asyncRoutes = [ alwaysShow: true, name: 'sysManage', meta: { - title: '系统管理', + title: 'app.menu.sys', icon: 'chart' }, children: [ @@ -397,7 +397,7 @@ export const asyncRoutes = [ name: 'admin', meta: { perms: ['GET /admin/admin/list', 'POST /admin/admin/create', 'POST /admin/admin/update', 'POST /admin/admin/delete'], - title: '管理员', + title: 'app.menu.sys_admin', noCache: true } }, @@ -407,7 +407,7 @@ export const asyncRoutes = [ name: 'sysNotice', meta: { perms: ['GET /admin/notice/list', 'POST /admin/notice/create', 'POST /admin/notice/update', 'POST /admin/notice/delete'], - title: '通知管理', + title: 'app.menu.sys_notice', noCache: true } }, @@ -417,7 +417,7 @@ export const asyncRoutes = [ name: 'log', meta: { perms: ['GET /admin/log/list'], - title: '操作日志', + title: 'app.menu.sys_log', noCache: true } }, @@ -427,7 +427,7 @@ export const asyncRoutes = [ name: 'role', meta: { perms: ['GET /admin/role/list', 'POST /admin/role/create', 'POST /admin/role/update', 'POST /admin/role/delete', 'GET /admin/role/permissions', 'POST /admin/role/permissions'], - title: '角色管理', + title: 'app.menu.sys_role', noCache: true } }, @@ -437,7 +437,7 @@ export const asyncRoutes = [ name: 'os', meta: { perms: ['GET /admin/storage/list', 'POST /admin/storage/create', 'POST /admin/storage/update', 'POST /admin/storage/delete'], - title: '对象存储', + title: 'app.menu.sys_os', noCache: true } } @@ -451,7 +451,7 @@ export const asyncRoutes = [ alwaysShow: true, name: 'configManage', meta: { - title: '配置管理', + title: 'app.menu.config', icon: 'chart' }, children: [ @@ -461,7 +461,7 @@ export const asyncRoutes = [ name: 'configMall', meta: { perms: ['GET /admin/config/mall', 'POST /admin/config/mall'], - title: '商场配置', + title: 'app.menu.config_mall', noCache: true } }, @@ -471,7 +471,7 @@ export const asyncRoutes = [ name: 'configExpress', meta: { perms: ['GET /admin/config/express', 'POST /admin/config/express'], - title: '运费配置', + title: 'app.menu.config_express', noCache: true } }, @@ -481,7 +481,7 @@ export const asyncRoutes = [ name: 'configOrder', meta: { perms: ['GET /admin/config/order', 'POST /admin/config/order'], - title: '订单配置', + title: 'app.menu.config_order', noCache: true } }, @@ -491,7 +491,7 @@ export const asyncRoutes = [ name: 'configWx', meta: { perms: ['GET /admin/config/wx', 'POST /admin/config/wx'], - title: '小程序配置', + title: 'app.menu.config_wx', noCache: true } } @@ -505,7 +505,7 @@ export const asyncRoutes = [ alwaysShow: true, name: 'statManage', meta: { - title: '统计报表', + title: 'app.menu.stat', icon: 'chart' }, children: [ @@ -515,7 +515,7 @@ export const asyncRoutes = [ name: 'statUser', meta: { perms: ['GET /admin/stat/user'], - title: '用户统计', + title: 'app.menu.stat_user', noCache: true } }, @@ -525,7 +525,7 @@ export const asyncRoutes = [ name: 'statOrder', meta: { perms: ['GET /admin/stat/order'], - title: '订单统计', + title: 'app.menu.stat_order', noCache: true } }, @@ -535,7 +535,7 @@ export const asyncRoutes = [ name: 'statGoods', meta: { perms: ['GET /admin/stat/goods'], - title: '商品统计', + title: 'app.menu.stat_goods', noCache: true } } @@ -548,37 +548,37 @@ export const asyncRoutes = [ alwaysShow: true, name: 'externalLink', meta: { - title: '外链', + title: 'app.menu.external_link', icon: 'link' }, children: [ { path: 'https://cloud.tencent.com/product/cos', - meta: { title: '腾讯云存储', icon: 'link' } + meta: { title: 'app.menu.external_link_tencent_cos', icon: 'link' } }, { path: 'https://cloud.tencent.com/product/sms', - meta: { title: '腾讯云短信', icon: 'link' } + meta: { title: 'app.menu.external_link_tencent_sms', icon: 'link' } }, { path: 'https://pay.weixin.qq.com/index.php/core/home/login', - meta: { title: '微信支付', icon: 'link' } + meta: { title: 'app.menu.external_link_weixin_pay', icon: 'link' } }, { path: 'https://mpkf.weixin.qq.com/', - meta: { title: '小程序客服', icon: 'link' } + meta: { title: 'app.menu.external_link_weixin_mpkf', icon: 'link' } }, { path: 'https://www.alibabacloud.com/zh/product/oss', - meta: { title: '阿里云存储', icon: 'link' } + meta: { title: 'app.menu.external_link_alibaba_oss', icon: 'link' } }, { path: 'https://www.qiniu.com/products/kodo', - meta: { title: '七牛云存储', icon: 'link' } + meta: { title: 'app.menu.external_link_qiniu_kodo', icon: 'link' } }, { path: 'http://www.kdniao.com/api-track', - meta: { title: '快递鸟', icon: 'link' } + meta: { title: 'app.menu.external_link_kdniao_api', icon: 'link' } } ] }, @@ -592,13 +592,13 @@ export const asyncRoutes = [ path: 'password', component: () => import('@/views/profile/password'), name: 'password', - meta: { title: '修改密码', noCache: true } + meta: { title: 'app.menu.profile_password', noCache: true } }, { path: 'notice', component: () => import('@/views/profile/notice'), name: 'notice', - meta: { title: '通知中心', noCache: true } + meta: { title: 'app.menu.profile_notice', noCache: true } } ], hidden: true diff --git a/litemall-admin/src/views/config/express.vue b/litemall-admin/src/views/config/express.vue index 5e3d59fa4..4f1abbf80 100644 --- a/litemall-admin/src/views/config/express.vue +++ b/litemall-admin/src/views/config/express.vue @@ -1,15 +1,15 @@ diff --git a/litemall-admin/src/views/config/mall.vue b/litemall-admin/src/views/config/mall.vue index a7ac934b1..493641962 100644 --- a/litemall-admin/src/views/config/mall.vue +++ b/litemall-admin/src/views/config/mall.vue @@ -1,30 +1,30 @@