From 98cf22128f561143f750fba802d5d9afd72ae567 Mon Sep 17 00:00:00 2001 From: zhuyue Date: Mon, 8 Nov 2021 19:00:03 +0800 Subject: [PATCH] feat: Make phone number input international & change library related 1. make phone number input international 2. change phone number library to libphonenumber Change-Id: I25bb8006646d8f54b5e4bd0f84f713823f45ec5f --- package.json | 2 +- .../countries.js | 458 +++++++++++++++++ .../InternationalPhoneNumberInput/index.jsx | 63 +++ src/components/FormItem/index.jsx | 4 +- src/locales/en.json | 233 +++++++++ src/locales/zh.json | 466 +++++++++++++++++- .../containers/User/actions/Create.jsx | 2 +- .../identity/containers/User/actions/Edit.jsx | 10 +- .../User/actionsInDomain/Create.jsx | 2 +- src/utils/validate.js | 4 +- .../integration/pages/identity/user.spec.js | 4 +- test/e2e/support/form-commands.js | 4 +- test/e2e/support/resource-commands.js | 4 +- yarn.lock | 10 +- 14 files changed, 1247 insertions(+), 19 deletions(-) create mode 100644 src/components/FormItem/InternationalPhoneNumberInput/countries.js create mode 100644 src/components/FormItem/InternationalPhoneNumberInput/index.jsx diff --git a/package.json b/package.json index 6179365e..f2c5f26d 100644 --- a/package.json +++ b/package.json @@ -64,13 +64,13 @@ "ip-address": "^7.1.0", "js-yaml": "^4.0.0", "json2csv": "^5.0.1", + "libphonenumber-js": "^1.9.42", "lodash": "^4.17.19", "mobx": "^5.1.0", "mobx-react": "^5.2.8", "mobx-react-router": "^4.1.0", "moment": "^2.24.0", "nanoid": "^3.0.2", - "phone": "^3.1.6", "promise-polyfill": "^8.1.3", "prop-types": "^15.7.2", "qs": "^6.9.4", diff --git a/src/components/FormItem/InternationalPhoneNumberInput/countries.js b/src/components/FormItem/InternationalPhoneNumberInput/countries.js new file mode 100644 index 00000000..97baa87d --- /dev/null +++ b/src/components/FormItem/InternationalPhoneNumberInput/countries.js @@ -0,0 +1,458 @@ +const countryOptions = { + 1: [ + 'US', + 'AG', + 'AI', + 'AS', + 'BB', + 'BM', + 'BS', + 'CA', + 'DM', + 'DO', + 'GD', + 'GU', + 'JM', + 'KN', + 'KY', + 'LC', + 'MP', + 'MS', + 'PR', + 'SX', + 'TC', + 'TT', + 'VC', + 'VG', + 'VI', + ], + 7: ['RU', 'KZ'], + 20: ['EG'], + 27: ['ZA'], + 30: ['GR'], + 31: ['NL'], + 32: ['BE'], + 33: ['FR'], + 34: ['ES'], + 36: ['HU'], + 39: ['IT', 'VA'], + 40: ['RO'], + 41: ['CH'], + 43: ['AT'], + 44: ['GB', 'GG', 'IM', 'JE'], + 45: ['DK'], + 46: ['SE'], + 47: ['NO', 'SJ'], + 48: ['PL'], + 49: ['DE'], + 51: ['PE'], + 52: ['MX'], + 53: ['CU'], + 54: ['AR'], + 55: ['BR'], + 56: ['CL'], + 57: ['CO'], + 58: ['VE'], + 60: ['MY'], + 61: ['AU', 'CC', 'CX'], + 62: ['ID'], + 63: ['PH'], + 64: ['NZ'], + 65: ['SG'], + 66: ['TH'], + 81: ['JP'], + 82: ['KR'], + 84: ['VN'], + 86: ['CN'], + 90: ['TR'], + 91: ['IN'], + 92: ['PK'], + 93: ['AF'], + 94: ['LK'], + 95: ['MM'], + 98: ['IR'], + 212: ['MA', 'EH'], + 213: ['DZ'], + 216: ['TN'], + 218: ['LY'], + 220: ['GM'], + 221: ['SN'], + 222: ['MR'], + 223: ['ML'], + 224: ['GN'], + 225: ['CI'], + 226: ['BF'], + 227: ['NE'], + 228: ['TG'], + 229: ['BJ'], + 230: ['MU'], + 231: ['LR'], + 232: ['SL'], + 233: ['GH'], + 234: ['NG'], + 235: ['TD'], + 236: ['CF'], + 237: ['CM'], + 238: ['CV'], + 240: ['GQ'], + 241: ['GA'], + 242: ['CG'], + 244: ['AO'], + 245: ['GW'], + 246: ['IO'], + 248: ['SC'], + 249: ['SD'], + 250: ['RW'], + 251: ['ET'], + 252: ['SO'], + 253: ['DJ'], + 254: ['KE'], + 255: ['TZ'], + 256: ['UG'], + 257: ['BI'], + 258: ['MZ'], + 260: ['ZM'], + 261: ['MG'], + 262: ['RE', 'YT'], + 263: ['ZW'], + 264: ['NA'], + 265: ['MW'], + 266: ['LS'], + 267: ['BW'], + 268: ['SZ'], + 269: ['KM'], + 291: ['ER'], + 297: ['AW'], + 298: ['FO'], + 299: ['GL'], + 350: ['GI'], + 351: ['PT'], + 352: ['LU'], + 353: ['IE'], + 354: ['IS'], + 355: ['AL'], + 356: ['MT'], + 357: ['CY'], + 358: ['FI', 'AX'], + 359: ['BG'], + 371: ['LV'], + 372: ['EE'], + 373: ['MD'], + 374: ['AM'], + 375: ['BY'], + 376: ['AD'], + 377: ['MC'], + 378: ['SM'], + 380: ['UA'], + 385: ['HR'], + 386: ['SI'], + 387: ['BA'], + 420: ['CZ'], + 421: ['SK'], + 423: ['LI'], + 500: ['FK'], + 501: ['BZ'], + 502: ['GT'], + 503: ['SV'], + 504: ['HN'], + 505: ['NI'], + 506: ['CR'], + 507: ['PA'], + 509: ['HT'], + 590: ['GP', 'BL', 'MF'], + 591: ['BO'], + 592: ['GY'], + 593: ['EC'], + 594: ['GF'], + 595: ['PY'], + 596: ['MQ'], + 597: ['SR'], + 598: ['UY'], + 672: ['NF'], + 673: ['BN'], + 674: ['NR'], + 675: ['PG'], + 676: ['TO'], + 677: ['SB'], + 678: ['VU'], + 679: ['FJ'], + 680: ['PW'], + 681: ['WF'], + 682: ['CK'], + 685: ['WS'], + 687: ['NC'], + 688: ['TV'], + 689: ['PF'], + 690: ['TK'], + 691: ['FM'], + 692: ['MH'], + 850: ['KP'], + 852: ['HK'], + 853: ['MO'], + 855: ['KH'], + 856: ['LA'], + 880: ['BD'], + 886: ['TW'], + 960: ['MV'], + 961: ['LB'], + 962: ['JO'], + 963: ['SY'], + 964: ['IQ'], + 965: ['KW'], + 966: ['SA'], + 967: ['YE'], + 968: ['OM'], + 970: ['PS'], + 971: ['AE'], + 972: ['IL'], + 973: ['BH'], + 974: ['QA'], + 975: ['BT'], + 976: ['MN'], + 977: ['NP'], + 992: ['TJ'], + 993: ['TM'], + 994: ['AZ'], + 995: ['GE'], + 996: ['KG'], + 998: ['UZ'], +}; + +const i18nDict = { + CN: t('China'), + TW: t('Taiwan'), + HK: t('Hong Kong'), + MO: t('Macau'), + KR: t('South Korea'), + JP: t('Japan'), + MY: t('Malaysia'), + SG: t('Singapore'), + NZ: t('New Zealand'), + AU: t('Australia'), + US: t('United States'), + CA: t('Canada'), + VN: t('Vietnam'), + IN: t('India'), + ID: t('Indonesia'), + TH: t('Thailand'), + PH: t('Philippines'), + DK: t('Denmark'), + FI: t('Finland'), + FR: t('France'), + DE: t('Germany'), + GR: t('Greece'), + IE: t('Ireland'), + IL: t('Israel'), + IT: t('Italy'), + MX: t('Mexico'), + NL: t('Netherlands'), + NO: t('Norway'), + PT: t('Portugal'), + RU: t('Russia'), + ZA: t('South Africa'), + ES: t('Spain'), + SE: t('Sweden'), + CH: t('Switzerland'), + BE: t('Belgium'), + GB: t('United Kingdom'), + AR: t('Argentina'), + BR: t('Brazil'), + KH: t('Kampuchea'), + LTU: t('Lithuania'), + LK: t('Sri Lanka'), + NG: t('Nigeria'), + AF: t('Afghanistan'), + AL: t('Albania'), + DZ: t('Algeria'), + AS: t('American Samoa'), + AD: t('Andorra'), + AG: t('Antigua and Barbuda'), + AM: t('Armenia'), + AT: t('Austria'), + BS: t('Bahamas'), + BH: t('Bahrain'), + BD: t('Bangladesh'), + BY: t('Belarus'), + BM: t('Bermuda'), + BA: t('Bosnia and Herzegovina'), + IO: t('British Indian Ocean Territory'), + BF: t('Burkina Faso'), + CF: t('Central African Republic'), + TD: t('Chad'), + CX: t('Christmas Island'), + CC: t('Cocos (Keeling) Islands'), + CO: t('Colombia'), + CG: t('Republic Of The Congo'), + ZR: t('Democratic Republic of the Congo'), + CR: t('Costa Rica'), + CI: t("Cote D'Ivoire"), + CU: t('Cuba'), + CZ: t('Czech Republic'), + GQ: t('Equatorial Guinea'), + EE: t('Estonia'), + FK: t('Falkland Islands (Malvinas)'), + PF: t('French Polynesia'), + GA: t('Gabon'), + GP: t('Guadeloupe'), + GW: t('Guinea Bissau'), + GY: t('Guyana'), + HN: t('Honduras'), + HU: t('Hungary'), + JO: t('Jordan'), + KZ: t('Kazakhstan'), + KE: t('Kenya'), + KW: t('Kuwait'), + KG: t('Kyrgyzstan'), + LS: t('Lesotho'), + MG: t('Madagascar'), + MV: t('Maldives'), + YT: t('Mayotte'), + FM: t('Micronesia'), + MC: t('Monaco'), + MN: t('Mongolia'), + MNE: t('Montenegro'), + MS: t('Montserrat'), + MM: t('Myanmar'), + NR: t('Nauru'), + NP: t('Nepal'), + AN: t('Netherlands Antilles'), + NC: t('New Caledonia'), + NI: t('Nicaragua'), + NF: t('Norfolk Island'), + KP: t('North Korea'), + MP: t('Northern Mariana Islands'), + OM: t('Oman'), + PK: t('Pakistan'), + PW: t('Palau'), + PA: t('Panama'), + PG: t('Papua New Guinea'), + PN: t('Pitcairn'), + PL: t('Poland'), + PR: t('Puerto Rico'), + QA: t('Qatar'), + RE: t('Reunion'), + VCT: t('Saint Vincent and the Grenadines'), + STP: t('Sao Tome and Principe'), + SA: t('Saudi Arabia'), + SRB: t('Serbia'), + SC: t('Seychelles'), + SK: t('Slovakia (Slovak Republic)'), + SI: t('Slovenia'), + SZ: t('Swaziland'), + TJ: t('Tajikistan'), + KNA: t('The Federation of Saint Kitts and Nevis'), + ABH: t('the Republic of Abkhazia'), + MKD: t('The Republic of Macedonia'), + SSD: t('The Republic of South Sudan'), + TN: t('Tunisia'), + TM: t('Turkmenistan'), + TV: t('Tuvalu'), + UG: t('Uganda'), + UA: t('Ukraine'), + AE: t('United Arab Emirates'), + UY: t('Uruguay'), + UZ: t('Uzbekistan'), + VA: t('Vatican City State (Holy See)'), + WF: t('Wallis And Futuna Islands'), + EH: t('Western Sahara'), + YU: t('Yugoslavia'), + ZM: t('Zambia'), + AO: t('Angola'), + AI: t('Anguilla'), + AW: t('Aruba'), + AZ: t('Azerbaijan'), + BB: t('Barbados'), + BZ: t('Belize'), + BJ: t('Benin'), + BT: t('Bhutan'), + BO: t('Bolivia'), + BW: t('Botswana'), + BN: t('Brunei Darussalam'), + BG: t('Bulgaria'), + BI: t('Burundi'), + CM: t('Cameroon'), + CV: t('Cape Verde'), + KY: t('Cayman Islands'), + CL: t('Chile'), + KM: t('Comoros'), + CK: t('Cook Islands'), + HR: t('Croatia (local name: Hrvatska)'), + CY: t('Cyprus'), + DJ: t('Djibouti'), + DM: t('Dominica'), + TP: t('East Timor'), + EC: t('Ecuador'), + EG: t('Egypt'), + SV: t('El Salvador'), + ER: t('Eritrea'), + ET: t('Ethiopia'), + FO: t('Faroe Islands'), + FJ: t('Fiji'), + GF: t('French Guiana'), + GM: t('Gambia'), + GE: t('Georgia'), + GH: t('Ghana'), + GI: t('Gibraltar'), + GL: t('Greenland'), + GD: t('Grenada'), + GU: t('Guam'), + GT: t('Guatemala'), + GN: t('Guinea'), + HT: t('Haiti'), + IS: t('Iceland'), + IR: t('Iran (Islamic Republic of)'), + IQ: t('Iraq'), + JM: t('Jamaica'), + LAO: t("Lao People's Democratic Republic"), + LV: t('Latvia'), + LB: t('Lebanon'), + LR: t('Liberia'), + LY: t('Libyan Arab Jamahiriya'), + LI: t('Liechtenstein'), + LU: t('Luxembourg'), + MW: t('Malawi'), + ML: t('Mali'), + MT: t('Malta'), + MH: t('Marshall Islands'), + MQ: t('Martinique'), + MR: t('Mauritania'), + MU: t('Mauritius'), + MD: t('Moldova'), + MA: t('Morocco'), + MZ: t('Mozambique'), + NA: t('Namibia'), + NE: t('Niger'), + PS: t('Palestine'), + PY: t('Paraguay'), + PE: t('Peru'), + RO: t('Romania'), + RW: t('Rwanda'), + WS: t('Samoa'), + SM: t('San Marino'), + SN: t('Senegal'), + SL: t('Sierra Leone'), + SB: t('Solomon Islands'), + SO: t('Somalia'), + SD: t('Sudan'), + SR: t('Suriname'), + SY: t('Syrian Arab Republic'), + TZ: t('Tanzania'), + TG: t('Togo'), + TK: t('Tokelau'), + TO: t('Tonga'), + TT: t('Trinidad and Tobago'), + TR: t('Turkey'), + TC: t('Turks and Caicos Islands'), + VU: t('Vanuatu'), + VE: t('Venezuela'), + VI: t('Virgin Islands (U.S.)'), + YE: t('Yemen'), + ZW: t('Zimbabwe'), +}; + +export const defaultCountries = Object.keys(countryOptions).map((prefix) => ({ + label: `+${prefix} ${countryOptions[prefix] + .map((i) => i18nDict[i]) + .join(',')}`, + value: `+${prefix}`, +})); diff --git a/src/components/FormItem/InternationalPhoneNumberInput/index.jsx b/src/components/FormItem/InternationalPhoneNumberInput/index.jsx new file mode 100644 index 00000000..26e9c71c --- /dev/null +++ b/src/components/FormItem/InternationalPhoneNumberInput/index.jsx @@ -0,0 +1,63 @@ +import React, { useState, useEffect } from 'react'; +import { Input, Select } from 'antd'; + +import { defaultCountries } from './countries'; + +export default function InternationPhoneNumberInput({ + value, + options, + onChange, +}) { + const [prefix, setPrefix] = useState(value.split(' ')[0]); + const [number, setNumber] = useState(value.split(' ')[1]); + + useEffect(() => { + const [oldPrefix, oldNumber] = value.split(' '); + if (oldPrefix !== prefix || oldNumber !== number) { + setPrefix(oldPrefix); + setNumber(oldNumber); + } + }, [value]); + + const triggerChange = (changedValue) => { + const newValue = { + prefix, + number, + ...changedValue, + }; + onChange(`${newValue.prefix} ${newValue.number}`); + }; + + return ( + + { + const newVal = e.target.value; + setNumber(newVal); + triggerChange({ number: newVal }); + }} + style={{ width: '50%' }} + /> + + ); +} + +InternationPhoneNumberInput.defaultProps = { + value: '+86 ', + options: defaultCountries, +}; diff --git a/src/components/FormItem/index.jsx b/src/components/FormItem/index.jsx index c170b59b..a4fb63a2 100644 --- a/src/components/FormItem/index.jsx +++ b/src/components/FormItem/index.jsx @@ -58,7 +58,8 @@ import NetworkSelectTable from './NetworkSelectTable'; import VolumeSelectTable from './VolumeSelectTable'; import TabSelectTable from './TabSelectTable'; import TreeSelect from './TreeSelect'; -import SelectWithInput from './SelectWithInput' +import SelectWithInput from './SelectWithInput'; +import InternationPhoneNumberInput from './InternationalPhoneNumberInput'; // import styles from './index.less'; export const type2component = { @@ -105,6 +106,7 @@ export const type2component = { 'input-json': JsonInput, 'tree-select': TreeSelect, 'select-input': SelectWithInput, + phone: InternationPhoneNumberInput, }; export default class FormItem extends React.Component { diff --git a/src/locales/en.json b/src/locales/en.json index a1d2f918..465f1271 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -65,12 +65,15 @@ "Affinity": "Affinity", "Affinity (mandatory):": "Affinity (mandatory):", "Affinity (not mandatory):": "Affinity (not mandatory):", + "Afghanistan": "Afghanistan", "After attaching interface, you may need to login the instance to update the network interface configuration and restart the network service.": "After attaching interface, you may need to login the instance to update the network interface configuration and restart the network service.", "After disable the compute service, the new instance will not schedule to the compute node.": "After disable the compute service, the new instance will not schedule to the compute node.", "After shelving, the instance will be shut down, resources will be released, and the snapshot will be saved to Glance. This will take about a few minutes, please be patient. You also can choose to unshelve to restore the instance.": "After shelving, the instance will be shut down, resources will be released, and the snapshot will be saved to Glance. This will take about a few minutes, please be patient. You also can choose to unshelve to restore the instance.", "After the volume is expanded, the volume cannot be reduced.": "After the volume is expanded, the volume cannot be reduced.", "Agent": "Agent", "Agree to force shutdown": "Agree to force shutdown", + "Albania": "Albania", + "Algeria": "Algeria", "All": "All", "All Flavors": "All Flavors", "All ICMP": "All ICMP", @@ -85,9 +88,14 @@ "Allocate IP": "Allocate IP", "Allocation Pools": "Allocation Pools", "Allowed Address Pair": "Allowed Address Pair", + "American Samoa": "American Samoa", + "Andorra": "Andorra", + "Angola": "Angola", + "Anguilla": "Anguilla", "Anti-Affinity": "Anti-Affinity", "Anti-affinity (mandatory):": "Anti-affinity (mandatory):", "Anti-affinity (not mandatory):": "Anti-affinity (not mandatory):", + "Antigua and Barbuda": "Antigua and Barbuda", "Any": "Any", "Any(Random)": "Any(Random)", "Application Credentials": "Application Credentials", @@ -107,6 +115,9 @@ "Are you sure to { action }?": "Are you sure to { action }?", "Are you sure to {action} (instance: {name})?": "Are you sure to {action} (instance: {name})?", "Are you sure to {action}?": "Are you sure to {action}?", + "Argentina": "Argentina", + "Armenia": "Armenia", + "Aruba": "Aruba", "Associate": "Associate", "Associate Floating IP": "Associate Floating IP", "Associate IP": "Associate IP", @@ -126,6 +137,8 @@ "Attached To": "Attached To", "Attaching": "Attaching", "Attachments Info": "Attachments Info", + "Australia": "Australia", + "Austria": "Austria", "Auth Algorithm": "Auth Algorithm", "Auth Key": "Auth Key", "Auto": "Auto", @@ -141,6 +154,7 @@ "Available": "Available", "Available Zone": "Available Zone", "Awaiting Transfer": "Awaiting Transfer", + "Azerbaijan": "Azerbaijan", "Back": "Back", "Back End": "Back End", "Back to Home": "Back to Home", @@ -155,9 +169,14 @@ "Backups": "Backups", "Backups & Snapshots": "Backups & Snapshots", "Bad Gateway (code: 502) ": "Bad Gateway (code: 502) ", + "Bahamas": "Bahamas", + "Bahrain": "Bahrain", + "Bailiwick of Jersey": "Bailiwick of Jersey", "BandWidth Limit Egress": "BandWidth Limit Egress", "BandWidth Limit Ingress": "BandWidth Limit Ingress", "Bandwidth limit": "Bandwidth limit", + "Bangladesh": "Bangladesh", + "Barbados": "Barbados", "Bare Metal": "Bare Metal", "Bare Metal Enroll": "Bare Metal Enroll", "Bare Metal Node Detail": "Bare Metal Node Detail", @@ -170,6 +189,12 @@ "BaseDetail": "BaseDetail", "Basic Parameters": "Basic Parameters", "Batch Allocate": "Batch Allocate", + "Belarus": "Belarus", + "Belgium": "Belgium", + "Belize": "Belize", + "Benin": "Benin", + "Bermuda": "Bermuda", + "Bhutan": "Bhutan", "Big Data": "Big Data", "Bind Device": "Bind Device", "Bind Device Type": "Bind Device Type", @@ -185,14 +210,23 @@ "Block Storage Services": "Block Storage Services", "Block Storage service:": "Block Storage service:", "Blocked": "Blocked", + "Bolivia": "Bolivia", "Boot Device": "Boot Device", "Boot Interface": "Boot Interface", "Bootable": "Bootable", "Bootable Volume": "Bootable Volume", + "Bosnia and Herzegovina": "Bosnia and Herzegovina", "Both of Fontend and Backend": "Both of Fontend and Backend", + "Botswana": "Botswana", + "Brazil": "Brazil", + "British Indian Ocean Territory": "British Indian Ocean Territory", + "Brunei Darussalam": "Brunei Darussalam", "Build": "Build", "Building": "Building", + "Bulgaria": "Bulgaria", + "Burkina Faso": "Burkina Faso", "Burst limit": "Burst limit", + "Burundi": "Burundi", "CIDR": "CIDR", "CIDR Format Error(e.g. 192.168.0.0/24, 2001:DB8::/48)": "CIDR Format Error(e.g. 192.168.0.0/24, 2001:DB8::/48)", "CPU": "CPU", @@ -203,15 +237,21 @@ "CPU value is { cpu }, NUMA CPU value is { totalCpu }, need to be equal. ": "CPU value is { cpu }, NUMA CPU value is { totalCpu }, need to be equal. ", "CPU(Core)": "CPU(Core)", "CPU/memory can only be increased or expanded online, and cannot be decreased or reduced online.": "CPU/memory can only be increased or expanded online, and cannot be decreased or reduced online.", + "Cameroon": "Cameroon", "Can add { number } {name}": "Can add { number } {name}", + "Canada": "Canada", "Cancel": "Cancel", "Cancel Download": "Cancel Download", "Cancel Select": "Cancel Select", "Cancel Transfer": "Cancel Transfer", "Cancel upload successfully.": "Cancel upload successfully.", "Capacity (GB)": "Capacity (GB)", + "Cape Verde": "Cape Verde", "Category": "Category", + "Cayman Islands": "Cayman Islands", "CentOS": "CentOS", + "Central African Republic": "Central African Republic", + "Chad": "Chad", "Change Password": "Change Password", "Change Type": "Change Type", "Change password": "Change password", @@ -223,9 +263,12 @@ "Check Failed": "Check Failed", "Check In Progress": "Check In Progress", "Checksum": "Checksum", + "Chile": "Chile", + "China": "China", "Choose a host to live migrate instance to. If not selected, the scheduler will auto select target host.": "Choose a host to live migrate instance to. If not selected, the scheduler will auto select target host.", "Choose a host to migrate instance to. If not selected, the scheduler will auto select target host.": "Choose a host to migrate instance to. If not selected, the scheduler will auto select target host.", "Choosing a QoS policy can limit bandwidth and DSCP": "Choosing a QoS policy can limit bandwidth and DSCP", + "Christmas Island": "Christmas Island", "Cidr": "Cidr", "Cinder Service": "Cinder Service", "Cipher": "Cipher", @@ -243,10 +286,13 @@ "Close external gateway": "Close external gateway", "Cloud": "Cloud", "Cloud Platform": "Cloud Platform", + "Cocos (Keeling) Islands": "Cocos (Keeling) Islands", "Code": "Code", "Cold Migrate": "Cold Migrate", + "Colombia": "Colombia", "Commas ‘,’ are not allowed to be in a tag name in order to simplify requests that specify lists of tags": "Commas ‘,’ are not allowed to be in a tag name in order to simplify requests that specify lists of tags", "Common Server": "Common Server", + "Comoros": "Comoros", "Compute": "Compute", "Compute Hosts": "Compute Hosts", "Compute Live Migration": "Compute Live Migration", @@ -288,7 +334,10 @@ "Container Format": "Container Format", "Content": "Content", "Control Location": "Control Location", + "Cook Islands": "Cook Islands", "CoreOS": "CoreOS", + "Costa Rica": "Costa Rica", + "Cote D'Ivoire": "Cote D'Ivoire", "Count": "Count", "Crashed": "Crashed", "Create": "Create", @@ -363,6 +412,8 @@ "Creating": "Creating", "Creation Timeout (Minutes)": "Creation Timeout (Minutes)", "Credential Type": "Credential Type", + "Croatia (local name: Hrvatska)": "Croatia (local name: Hrvatska)", + "Cuba": "Cuba", "Current Availability Zones": "Current Availability Zones", "Current Compute Host": "Current Compute Host", "Current Flavor": "Current Flavor", @@ -383,6 +434,8 @@ "Custom TCP Rule": "Custom TCP Rule", "Custom Trait": "Custom Trait", "Custom UDP Rule": "Custom UDP Rule", + "Cyprus": "Cyprus", + "Czech Republic": "Czech Republic", "DCCP": "DCCP", "DEGRADED: One or more of the entity’s components are in ERROR": "DEGRADED: One or more of the entity’s components are in ERROR", "DHCP": "DHCP", @@ -464,6 +517,8 @@ "Deleted with the instance": "Deleted with the instance", "Deleting": "Deleting", "Deleting this stack will delete all resources deployed by the stack.": "Deleting this stack will delete all resources deployed by the stack.", + "Democratic Republic of the Congo": "Democratic Republic of the Congo", + "Denmark": "Denmark", "Deploy Failed": "Deploy Failed", "Deploy Wait": "Deploy Wait", "Deploying": "Deploying", @@ -502,6 +557,7 @@ "Disk Info": "Disk Info", "Disk Tag": "Disk Tag", "Disk size is limited by the min disk of flavor, image, etc.": "Disk size is limited by the min disk of flavor, image, etc.", + "Djibouti": "Djibouti", "Do Build And Run Instance": "Do Build And Run Instance", "Do not reset the normally mounted volume to the \"available\"、\"maintenance\" or \"error\" status. The reset state does not remove the volume from the instance. If you need to remove the volume from the instance, please go to the console of the corresponding project and use the \"detach\" operation.": "Do not reset the normally mounted volume to the \"available\"、\"maintenance\" or \"error\" status. The reset state does not remove the volume from the instance. If you need to remove the volume from the instance, please go to the console of the corresponding project and use the \"detach\" operation.", "Do not set with a backend": "Do not set with a backend", @@ -512,6 +568,7 @@ "Domain Manager": "Domain Manager", "Domain Name": "Domain Name", "Domains": "Domains", + "Dominica": "Dominica", "Down": "Down", "Download all data": "Download all data", "Download canceled!": "Download canceled!", @@ -526,6 +583,8 @@ "ESP": "ESP", "Each instance belongs to at least one security group, which needs to be specified when it is created. Instances in the same security group can communicate with each other on the network, and instances in different security groups are disconnected from the internal network by default.": "Each instance belongs to at least one security group, which needs to be specified when it is created. Instances in the same security group can communicate with each other on the network, and instances in different security groups are disconnected from the internal network by default.", "Each new connection request is assigned to the next server in order, and all requests are finally divided equally among all servers. Commonly used for short connection services, such as HTTP services.": "Each new connection request is assigned to the next server in order, and all requests are finally divided equally among all servers. Commonly used for short connection services, such as HTTP services.", + "East Timor": "East Timor", + "Ecuador": "Ecuador", "Edit": "Edit", "Edit Backup": "Edit Backup", "Edit Bandwidth Egress Limit Rule": "Edit Bandwidth Egress Limit Rule", @@ -568,6 +627,8 @@ "Effective Mode": "Effective Mode", "Effective mode after configuration changes": "Effective mode after configuration changes", "Egress": "Egress", + "Egypt": "Egypt", + "El Salvador": "El Salvador", "Email": "Email", "Enable": "Enable", "Enable Admin State": "Enable Admin State", @@ -598,11 +659,15 @@ "Entered: {length, plural, =1 {one character} other {# characters} }(maximum {maxCount} characters)": "Entered: {length, plural, =1 {one character} other {# characters} }(maximum {maxCount} characters)", "Environment Variable": "Environment Variable", "Ephemeral Disk(GB)": "Ephemeral Disk(GB)", + "Equatorial Guinea": "Equatorial Guinea", + "Eritrea": "Eritrea", "Error": "Error", "Error Deleting": "Error Deleting", "Error Extending": "Error Extending", "Error Restoring": "Error Restoring", + "Estonia": "Estonia", "Ether Type": "Ether Type", + "Ethiopia": "Ethiopia", "Event Time": "Event Time", "Execution Result": "Execution Result", "Expand Advanced Options": "Expand Advanced Options", @@ -629,13 +694,17 @@ "FLAT": "FLAT", "Fail Rollback": "Fail Rollback", "Failed": "Failed", + "Falkland Islands (Malvinas)": "Falkland Islands (Malvinas)", + "Faroe Islands": "Faroe Islands", "Fedora": "Fedora", + "Fiji": "Fiji", "File": "File", "Filename": "Filename", "Fill In The Parameters": "Fill In The Parameters", "Filter Project": "Filter Project", "Fingerprint": "Fingerprint", "Finish Resize": "Finish Resize", + "Finland": "Finland", "First time edit automatically creates health monitor When pool does not have a health monitor": "First time edit automatically creates health monitor When pool does not have a health monitor", "Fixed IP": "Fixed IP", "Fixed IP Address": "Fixed IP Address", @@ -668,7 +737,10 @@ "Forgot your password?": "Forgot your password?", "Format": "Format", "Forward Slash ‘/’ is not allowed to be in a tag name": "Forward Slash ‘/’ is not allowed to be in a tag name", + "France": "France", "FreeBSD": "FreeBSD", + "French Guiana": "French Guiana", + "French Polynesia": "French Polynesia", "Frequent login failure will cause the account to be temporarily locked, please operate after 5 minutes": "Frequent login failure will cause the account to be temporarily locked, please operate after 5 minutes", "Front End": "Front End", "Full": "Full", @@ -680,18 +752,34 @@ "GPU Type": "GPU Type", "GPU pass-through will load GPU devices directly to the instance for use. VGPU is a GPU virtualization solution. GPU resources will be segmented and distributed to multiple instances for shared use.": "GPU pass-through will load GPU devices directly to the instance for use. VGPU is a GPU virtualization solution. GPU resources will be segmented and distributed to multiple instances for shared use.", "GRE": "GRE", + "Gabon": "Gabon", + "Gambia": "Gambia", "Gateway IP": "Gateway IP", "Gateway Time-out (code: 504) ": "Gateway Time-out (code: 504) ", "Gateway ip {gateway_ip} conflicts with allocation pool {pool}": "Gateway ip {gateway_ip} conflicts with allocation pool {pool}", "General Purpose": "General Purpose", + "Georgia": "Georgia", + "Germany": "Germany", "Get OpenRC file": "Get OpenRC file", "Get Token": "Get Token", "Get {name} detail error.": "Get {name} detail error.", "Get {name} error.": "Get {name} error.", + "Ghana": "Ghana", + "Gibraltar": "Gibraltar", "Gigabytes(GB)": "Gigabytes(GB)", "Given IP": "Given IP", "Global Setting": "Global Setting", + "Greece": "Greece", + "Greenland": "Greenland", + "Grenada": "Grenada", + "Guadeloupe": "Guadeloupe", + "Guam": "Guam", + "Guatemala": "Guatemala", + "Guinea": "Guinea", + "Guinea Bissau": "Guinea Bissau", + "Guyana": "Guyana", "HTTP Version not supported (code: 505) ": "HTTP Version not supported (code: 505) ", + "Haiti": "Haiti", "Hard Reboot": "Hard Reboot", "Hard Rebooting": "Hard Rebooting", "Health Monitor Delay": "Health Monitor Delay", @@ -708,6 +796,8 @@ "High Clock Speed": "High Clock Speed", "Home": "Home", "Home page": "Home page", + "Honduras": "Honduras", + "Hong Kong": "Hong Kong", "Host": "Host", "Host Aggregate": "Host Aggregate", "Host Aggregates": "Host Aggregates", @@ -716,6 +806,7 @@ "Host Routes Format Error(e.g. ::0a38:01fe/24,::0a38:01fe)": "Host Routes Format Error(e.g. ::0a38:01fe/24,::0a38:01fe)", "Hostname": "Hostname", "Hosts": "Hosts", + "Hungary": "Hungary", "Hypervisor Detail": "Hypervisor Detail", "Hypervisors": "Hypervisors", "ICMP Code": "ICMP Code", @@ -757,6 +848,7 @@ "IPv6-Opts": "IPv6-Opts", "IPv6-Route": "IPv6-Route", "ISO - Optical disc image format": "ISO - Optical disc image format", + "Iceland": "Iceland", "Identifier of the physical port on the switch to which node’s port is connected to": "Identifier of the physical port on the switch to which node’s port is connected to", "Identity": "Identity", "Identity service:": "Identity service:", @@ -798,7 +890,9 @@ "In-use": "In-use", "Increment Backup": "Increment Backup", "Incremental Backup": "Incremental Backup", + "India": "India", "Indicates whether this VPN can only respond to connections or both respond to and initiate connections.": "Indicates whether this VPN can only respond to connections or both respond to and initiate connections.", + "Indonesia": "Indonesia", "Infinity": "Infinity", "Ingress": "Ingress", "Init Complete": "Init Complete", @@ -868,6 +962,9 @@ "Invalid: User Group name can not be duplicated": "Invalid: User Group name can not be duplicated", "Invalid: User name can not be duplicated": "Invalid: User name can not be duplicated", "Ip Address": "Ip Address", + "Iran (Islamic Republic of)": "Iran (Islamic Republic of)", + "Iraq": "Iraq", + "Ireland": "Ireland", "Ironic Instance": "Ironic Instance", "Ironic Instance Name": "Ironic Instance Name", "Is Current Project": "Is Current Project", @@ -876,6 +973,7 @@ "Is external network port": "Is external network port", "Isolate": "Isolate", "Isolate(No multithreading)": "Isolate(No multithreading)", + "Israel": "Israel", "It is IPv6 type.": "It is IPv6 type.", "It is recommended that the { instanceType } instance simultaneously set large page memory to large. { instanceType } instances also require faster memory addressing capabilities.": "It is recommended that the { instanceType } instance simultaneously set large page memory to large. { instanceType } instances also require faster memory addressing capabilities.", "It is recommended that you perform this cloning operation on a disk without any reading/writing": "It is recommended that you perform this cloning operation on a disk without any reading/writing", @@ -887,7 +985,14 @@ "It is suggested to use the marked AZ directly, too much AZ will lead to the fragmentation of available resources": "It is suggested to use the marked AZ directly, too much AZ will lead to the fragmentation of available resources", "It is unreachable for all floating ips.": "It is unreachable for all floating ips.", "It is unreachable for this floating ip.": "It is unreachable for this floating ip.", + "Italy": "Italy", + "Jamaica": "Jamaica", + "Japan": "Japan", + "Jordan": "Jordan", "Jump to Console": "Jump to Console", + "Kampuchea": "Kampuchea", + "Kazakhstan": "Kazakhstan", + "Kenya": "Kenya", "Kernel ID": "Kernel ID", "Kernel Image": "Kernel Image", "Key": "Key", @@ -898,12 +1003,21 @@ "Keypair Detail": "Keypair Detail", "Keypair Info": "Keypair Info", "Killed": "Killed", + "Kuwait": "Kuwait", + "Kyrgyzstan": "Kyrgyzstan", "LB Algorithm": "LB Algorithm", "LEAST_CONNECTIONS": "Least Connections", + "Lao People's Democratic Republic": "Lao People's Democratic Republic", "Large": "Large", "Large(Optimal performance)": "Large(Optimal performance)", "Last Updated": "Last Updated", + "Latvia": "Latvia", "Leave Maintenance Mode": "Leave Maintenance Mode", + "Lebanon": "Lebanon", + "Lesotho": "Lesotho", + "Liberia": "Liberia", + "Libyan Arab Jamahiriya": "Libyan Arab Jamahiriya", + "Liechtenstein": "Liechtenstein", "Lifetime": "Lifetime", "Lifetime Value": "Lifetime Value", "Listener": "Listener", @@ -914,6 +1028,7 @@ "Listener Number": "Listener Number", "Listener Protocol": "Listener Protocol", "Listener Protocol Port": "Listener Protocol Port", + "Lithuania": "Lithuania", "Live Migrate": "Live Migrate", "Live Migration At Destination": "Live Migration At Destination", "Load Balancer": "Load Balancer", @@ -938,14 +1053,22 @@ "Login Name": "Login Name", "Login Password": "Login Password", "Login Type": "Login Type", + "Luxembourg": "Luxembourg", "MAC Address": "MAC Address", "MAC Learning State": "MAC Learning State", "MTU": "MTU", "Mac Address": "Mac Address", "MacVTap": "MacVTap", + "Macau": "Macau", + "Madagascar": "Madagascar", "Main Project": "Main Project", "Maintained": "Maintained", "Maintenance": "Maintenance", + "Malawi": "Malawi", + "Malaysia": "Malaysia", + "Maldives": "Maldives", + "Mali": "Mali", + "Malta": "Malta", "Manage Access": "Manage Access", "Manage Host": "Manage Host", "Manage Metadata": "Manage Metadata", @@ -966,11 +1089,16 @@ "Manual input": "Manual input", "Manually Assigned Address": "Manually Assigned Address", "Manually Specify": "Manually Specify", + "Marshall Islands": "Marshall Islands", + "Martinique": "Martinique", + "Mauritania": "Mauritania", + "Mauritius": "Mauritius", "Max BandWidth": "Max BandWidth", "Max Burst": "Max Burst", "Max Retries": "Max Retries", "Max connect": "Max connect", "Maximum interval time for each health check response": "Maximum interval time for each health check response", + "Mayotte": "Mayotte", "Mem": "Mem", "Member": "Member", "Member Count": "Member Count", @@ -986,6 +1114,8 @@ "Metadata": "Metadata", "Metadata Definitions": "Metadata Definitions", "Metadata Detail": "Metadata Detail", + "Mexico": "Mexico", + "Micronesia": "Micronesia", "Migrate": "Migrate", "Migrate Volume": "Migrate Volume", "Migrate volume": "Migrate volume", @@ -1004,11 +1134,19 @@ "Missing Weight": "Missing Weight", "Modify Project Tags": "Modify Project Tags", "Modify QoS": "Modify QoS", + "Moldova": "Moldova", + "Monaco": "Monaco", + "Mongolia": "Mongolia", + "Montenegro": "Montenegro", + "Montserrat": "Montserrat", "More": "More", "More Actions": "More Actions", + "Morocco": "Morocco", "Mount ISO": "Mount ISO", + "Mozambique": "Mozambique", "Multiple filter tags are separated by enter": "Multiple filter tags are separated by enter", "My Role": "My Role", + "Myanmar": "Myanmar", "N/A": "N/A", "NOOP": "NOOP", "NUMA Node": "NUMA Node", @@ -1017,6 +1155,11 @@ "Name": "Name", "Name can not be duplicated": "Name can not be duplicated", "Namespace": "Namespace", + "Namibia": "Namibia", + "Nauru": "Nauru", + "Nepal": "Nepal", + "Netherlands": "Netherlands", + "Netherlands Antilles": "Netherlands Antilles", "Network": "Network", "Network Config": "Network Config", "Network Detail": "Network Detail", @@ -1033,8 +1176,13 @@ "Neutron Agent Detail": "Neutron Agent Detail", "Neutron Agents": "Neutron Agents", "New Availability Zone": "New Availability Zone", + "New Caledonia": "New Caledonia", + "New Zealand": "New Zealand", "Next": "Next", "Next Hop": "Next Hop", + "Nicaragua": "Nicaragua", + "Niger": "Niger", + "Nigeria": "Nigeria", "No": "No", "No Console": "No Console", "No Monitor": "No Monitor", @@ -1048,7 +1196,11 @@ "Node Info": "Node Info", "Node Name": "Node Name", "Node Num": "Node Num", + "Norfolk Island": "Norfolk Island", "Normal": "Normal", + "North Korea": "North Korea", + "Northern Mariana Islands": "Northern Mariana Islands", + "Norway": "Norway", "Not Implemented (code: 501) ": "Not Implemented (code: 501) ", "Not Open": "Not Open", "Not deleted with the instance": "Not deleted with the instance", @@ -1068,6 +1220,7 @@ "OSPF": "OSPF", "Off": "Off", "Offline": "Offline", + "Oman": "Oman", "On": "On", "One entry per line(e.g. 114.114.114.114)": "One entry per line(e.g. 114.114.114.114)", "One entry per line(e.g. {ip})": "One entry per line(e.g. {ip})", @@ -1102,6 +1255,12 @@ "PING": "PING", "PXE": "PXE", "PXE Enabled": "PXE Enabled", + "Pakistan": "Pakistan", + "Palau": "Palau", + "Palestine": "Palestine", + "Panama": "Panama", + "Papua New Guinea": "Papua New Guinea", + "Paraguay": "Paraguay", "Parameter": "Parameter", "Params Setting": "Params Setting", "Password": "Password", @@ -1130,10 +1289,13 @@ "Perform a consistent hash operation on the source IP address of the request to obtain a specific value. At the same time, the back-end server is numbered, and the request is distributed to the server with the corresponding number according to the calculation result. This can enable load distribution of visits from different source IPs, and at the same time enable requests from the same client IP to always be dispatched to a specific server. This method is suitable for load balancing TCP protocol without cookie function.": "Perform a consistent hash operation on the source IP address of the request to obtain a specific value. At the same time, the back-end server is numbered, and the request is distributed to the server with the corresponding number according to the calculation result. This can enable load distribution of visits from different source IPs, and at the same time enable requests from the same client IP to always be dispatched to a specific server. This method is suitable for load balancing TCP protocol without cookie function.", "Permanent": "Permanent", "Persistent": "Persistent", + "Peru": "Peru", "Phase1 Negotiation Mode": "Phase1 Negotiation Mode", + "Philippines": "Philippines", "Phone": "Phone", "Physical Network": "Physical Network", "Physical Node": "Physical Node", + "Pitcairn": "Pitcairn", "Placement service:": "Placement service:", "Platform Info": "Platform Info", "Please confirm your password!": "Please confirm your password!", @@ -1198,6 +1360,7 @@ "Pleasse select a network!": "Pleasse select a network!", "Pleasse select a subnet!": "Pleasse select a subnet!", "Pleasse select a type!": "Pleasse select a type!", + "Poland": "Poland", "Policy": "Policy", "Policy Name": "Policy Name", "Pool Algorithm": "Pool Algorithm", @@ -1219,6 +1382,7 @@ "Port Security Enabled": "Port Security Enabled", "Port Type": "Port Type", "Ports": "Ports", + "Portugal": "Portugal", "Power Off": "Power Off", "Power On": "Power On", "Power State": "Power State", @@ -1262,7 +1426,9 @@ "Public": "Public", "Public Image": "Public Image", "Public Key": "Public Key", + "Puerto Rico": "Puerto Rico", "QCOW2 - QEMU image format": "QCOW2 - QEMU image format", + "Qatar": "Qatar", "QoS": "QoS", "QoS Bandwidth Egress Limit": "QoS Bandwidth Egress Limit", "QoS Bandwidth Ingress Limit": "QoS Bandwidth Ingress Limit", @@ -1318,6 +1484,7 @@ "Remove": "Remove", "Remove Network": "Remove Network", "Remove Router": "Remove Router", + "Republic Of The Congo": "Republic Of The Congo", "Request ID": "Request ID", "Require": "Require", "Require(Need multithreading)": "Require(Need multithreading)", @@ -1353,6 +1520,7 @@ "Resume Instance": "Resume Instance", "Resuming": "Resuming", "Retyping": "Retyping", + "Reunion": "Reunion", "Revert Resize or Migrate": "Revert Resize or Migrate", "Revert Resize/Migrate": "Revert Resize/Migrate", "Reverting": "Reverting", @@ -1365,6 +1533,7 @@ "Rollback Complete": "Rollback Complete", "Rollback Failed": "Rollback Failed", "Rollback In Progress": "Rollback In Progress", + "Romania": "Romania", "Root Disk": "Root Disk", "Router": "Router", "Router Detail": "Router Detail", @@ -1375,12 +1544,21 @@ "Rules": "Rules", "Rules Number": "Rules Number", "Running": "Running", + "Russia": "Russia", + "Rwanda": "Rwanda", "SCTP": "SCTP", "SNAT Enabled": "SNAT Enabled", "SNAT Rules": "SNAT Rules", "SNAT Source": "SNAT Source", "SNAT rules": "SNAT rules", "SOURCE_IP": "Source IP", + "Saint Maarten (Dutch Part)": "Saint Maarten (Dutch Part)", + "Saint Vincent and the Grenadines": "Saint Vincent and the Grenadines", + "Samoa": "Samoa", + "San Marino": "San Marino", + "Santa Luzia Island": "Santa Luzia Island", + "Sao Tome and Principe": "Sao Tome and Principe", + "Saudi Arabia": "Saudi Arabia", "Saving": "Saving", "Scheduling": "Scheduling", "Sec for DPD delay, > 0": "Sec for DPD delay, > 0", @@ -1405,6 +1583,8 @@ "Selected": "Selected", "Selected Members": "Selected Members", "Selected list": "Selected list", + "Senegal": "Senegal", + "Serbia": "Serbia", "Server Group": "Server Group", "Server Group Detail": "Server Group Detail", "Server Group Member": "Server Group Member", @@ -1416,6 +1596,7 @@ "Set Admin Password": "Set Admin Password", "Set Boot Device": "Set Boot Device", "Set IP": "Set IP", + "Seychelles": "Seychelles", "Shared": "Shared", "Shared Image": "Shared Image", "Shared Network": "Shared Network", @@ -1434,9 +1615,13 @@ "Shut Down": "Shut Down", "Shut Off": "Shut Off", "Shutoff": "Shutoff", + "Sierra Leone": "Sierra Leone", "Sign Out": "Sign Out", "Sign up": "Sign up", + "Singapore": "Singapore", "Size": "Size", + "Slovakia (Slovak Republic)": "Slovakia (Slovak Republic)", + "Slovenia": "Slovenia", "Small": "Small", "Small(Not recommended)": "Small(Not recommended)", "Smart Scheduling": "Smart Scheduling", @@ -1458,11 +1643,17 @@ "Soft Rebooting": "Soft Rebooting", "Soft-Affinity": "Soft-Affinity", "Soft-Anti-Affinity": "Soft-Anti-Affinity", + "Solomon Islands": "Solomon Islands", + "Somalia": "Somalia", "Sorry, the page you visited does not exist.": "Sorry, the page you visited does not exist.", "Source Port/Port Range": "Source Port/Port Range", + "South Africa": "South Africa", + "South Korea": "South Korea", + "Spain": "Spain", "Spawning": "Spawning", "Specification": "Specification", "Specs": "Specs", + "Sri Lanka": "Sri Lanka", "Stack Detail": "Stack Detail", "Stack Events": "Stack Events", "Stack Name": "Stack Name", @@ -1507,6 +1698,8 @@ "Subordinate Project": "Subordinate Project", "Subordinate User Group": "Subordinate User Group", "Success": "Success", + "Sudan": "Sudan", + "Suriname": "Suriname", "Suspend": "Suspend", "Suspend Complete": "Suspend Complete", "Suspend Failed": "Suspend Failed", @@ -1514,10 +1707,14 @@ "Suspend Instance": "Suspend Instance", "Suspended": "Suspended", "Suspending": "Suspending", + "Swaziland": "Swaziland", + "Sweden": "Sweden", "Switch ID": "Switch ID", "Switch Info": "Switch Info", "Switch Language": "Switch Language", "Switch Project": "Switch Project", + "Switzerland": "Switzerland", + "Syrian Arab Republic": "Syrian Arab Republic", "System": "System", "System Admin": "System Admin", "System Config": "System Config", @@ -1529,7 +1726,10 @@ "TCP": "TCP", "Tags": "Tags", "Tags are not case sensitive": "Tags are not case sensitive", + "Taiwan": "Taiwan", + "Tajikistan": "Tajikistan", "Take effect after restart": "Take effect after restart", + "Tanzania": "Tanzania", "Target Compute Host": "Target Compute Host", "Target IP Address": "Target IP Address", "Target Port": "Target Port", @@ -1537,8 +1737,12 @@ "Target Subnet": "Target Subnet", "Template Content": "Template Content", "Template Name": "Template Name", + "Thailand": "Thailand", "That is, after how many consecutive failures of the health check, the health check status of the back-end cloud server is changed from normal to abnormal": "That is, after how many consecutive failures of the health check, the health check status of the back-end cloud server is changed from normal to abnormal", + "The Federation of Saint Kitts and Nevis": "The Federation of Saint Kitts and Nevis", "The Provider is the encryption provider format (e.g. \"lucks\")": "The Provider is the encryption provider format (e.g. \"lucks\")", + "The Republic of Macedonia": "The Republic of Macedonia", + "The Republic of South Sudan": "The Republic of South Sudan", "The SSH key is a way to remotely log in to the instance. The cloud platform only helps to keep the public key. Please keep your private key properly.": "The SSH key is a way to remotely log in to the instance. The cloud platform only helps to keep the public key. Please keep your private key properly.", "The affiliated Domain cannot be modified after creation": "The affiliated Domain cannot be modified after creation", "The amphora instance is required for load balancing service setup and is not recommended": "The amphora instance is required for load balancing service setup and is not recommended", @@ -1605,6 +1809,9 @@ "Timeout(Mininte)": "Timeout(Mininte)", "Timeout(s)": "Timeout(s)", "To open": "To open", + "Togo": "Togo", + "Tokelau": "Tokelau", + "Tonga": "Tonga", "Too many disks mounted on the instance will affect the read and write performance. It is recommended not to exceed 16 disks.": "Too many disks mounted on the instance will affect the read and write performance. It is recommended not to exceed 16 disks.", "Topic": "Topic", "Topology": "Topology", @@ -1616,6 +1823,12 @@ "Transfer ID": "Transfer ID", "Transfer Name": "Transfer Name", "Transform Protocol": "Transform Protocol", + "Trinidad and Tobago": "Trinidad and Tobago", + "Tunisia": "Tunisia", + "Turkey": "Turkey", + "Turkmenistan": "Turkmenistan", + "Turks and Caicos Islands": "Turks and Caicos Islands", + "Tuvalu": "Tuvalu", "Type": "Type", "UDPLite": "UDPLite", "USB Info": "USB Info", @@ -1623,6 +1836,8 @@ "USER": "USER", "UUID": "UUID", "Ubuntu": "Ubuntu", + "Uganda": "Uganda", + "Ukraine": "Ukraine", "Unable to create instance: batch creation is not supported when specifying IP.": "Unable to create instance: batch creation is not supported when specifying IP.", "Unable to create instance: insufficient quota to create resources.": "Unable to create instance: insufficient quota to create resources.", "Unable to create volume: insufficient quota to create resources.": "Unable to create volume: insufficient quota to create resources.", @@ -1640,6 +1855,9 @@ "Unattached": "Unattached", "Unavailable": "Unavailable", "Unbootable": "Unbootable", + "United Arab Emirates": "United Arab Emirates", + "United Kingdom": "United Kingdom", + "United States": "United States", "Unknown": "Unknown", "Unless you know clearly which AZ to create the volume in, you don not need to fill in here.": "Unless you know clearly which AZ to create the volume in, you don not need to fill in here.", "Unlimit": "Unlimit", @@ -1666,6 +1884,7 @@ "Updating Password": "Updating Password", "Upload progress": "Upload progress", "Uploading": "Uploading", + "Uruguay": "Uruguay", "Usage Type": "Usage Type", "Usb Controller": "Usb Controller", "Use Type": "Use Type", @@ -1699,6 +1918,7 @@ "Username or password is incorrect": "Username or password is incorrect", "Users": "Users", "Using server groups, you can create cloud hosts on the same/different physical nodes as much as possible to meet the affinity/non-affinity requirements of business applications.": "Using server groups, you can create cloud hosts on the same/different physical nodes as much as possible to meet the affinity/non-affinity requirements of business applications.", + "Uzbekistan": "Uzbekistan", "VCPU (Core)": "VCPU (Core)", "VCPUs": "VCPUs", "VDI - VirtualBox compatible image format": "VDI - VirtualBox compatible image format", @@ -1716,11 +1936,16 @@ "VRRP": "VRRP", "Valid": "Valid", "Value": "Value", + "Vanuatu": "Vanuatu", + "Vatican City State (Holy See)": "Vatican City State (Holy See)", "Vendor Interface": "Vendor Interface", + "Venezuela": "Venezuela", "Verifying": "Verifying", + "Vietnam": "Vietnam", "View": "View", "View Detail": "View Detail", "View Rules": "View Rules", + "Virgin Islands (U.S.)": "Virgin Islands (U.S.)", "Virtual Adapter": "Virtual Adapter", "Virtual Adapter Detail": "Virtual Adapter Detail", "Virtual Adapter ID": "Virtual Adapter ID", @@ -1744,11 +1969,13 @@ "Volume Transfer": "Volume Transfer", "Volume Type": "Volume Type", "Volume Type Detail": "Volume Type Detail", + "Wallis And Futuna Islands": "Wallis And Futuna Islands", "Warn": "Warn", "Weight": "Weight", "Weights": "Weights", "Welcome": "Welcome", "Welcome, {name}": "Welcome, {name}", + "Western Sahara": "Western Sahara", "When the computing service starts the recycling instance interval, the instance will be stored in the recycling bin after deletion, and will be retained according to the corresponding time interval. You can choose to restore it within this period. After successful recovery, the status of the instance is running and related resources remain unchanged.": "When the computing service starts the recycling instance interval, the instance will be stored in the recycling bin after deletion, and will be retained according to the corresponding time interval. You can choose to restore it within this period. After successful recovery, the status of the instance is running and related resources remain unchanged.", "When the volume is \"bootable\" and the status is \"available\", it can be used as a startup source to create an instance.": "When the volume is \"bootable\" and the status is \"available\", it can be used as a startup source to create an instance.", "When you do online backup of the volume that has been bound, you need to pay attention to the following points:": "When you do online backup of the volume that has been bound, you need to pay attention to the following points:", @@ -1761,6 +1988,7 @@ "Work Num": "Work Num", "X86 Architecture": "X86 Architecture", "YAML File": "YAML File", + "Yemen": "Yemen", "Yes": "Yes", "You are not allowed to delete router \"{ name }\".": "You are not allowed to delete router \"{ name }\".", "You are not allowed to delete snapshot \"{ name }\", which is used by creating volume \"{volumes}\".": "You are not allowed to delete snapshot \"{ name }\", which is used by creating volume \"{volumes}\".", @@ -1773,6 +2001,9 @@ "You are trying to edit a network that not belong to current project. Please do not continue unless you are quit sure what you are doing.": "You are trying to edit a network that not belong to current project. Please do not continue unless you are quit sure what you are doing.", "You can manually specify a physical node to create an instance.": "You can manually specify a physical node to create an instance.", "You don't have access to get {name}.": "You don't have access to get {name}.", + "Yugoslavia": "Yugoslavia", + "Zambia": "Zambia", + "Zimbabwe": "Zimbabwe", "abandon stack": "abandon stack", "add network": "add network", "add router": "add router", @@ -1967,6 +2198,8 @@ "storage backend": "storage backend", "subnets": "subnets", "suspend instance": "suspend instance", + "the Republic of Abkhazia": "the Republic of Abkhazia", + "the Republic of South Ossetia": "the Republic of South Ossetia", "the policy is in use": "the policy is in use", "the router has connected subnet": "the router has connected subnet", "the vpn gateway is in use": "the vpn gateway is in use", diff --git a/src/locales/zh.json b/src/locales/zh.json index 141bba76..c1a063fc 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -65,12 +65,15 @@ "Affinity": "亲和组", "Affinity (mandatory):": "亲和(强制):", "Affinity (not mandatory):": "亲和 (非强制):", + "Afghanistan": "阿富汗", "After attaching interface, you may need to login the instance to update the network interface configuration and restart the network service.": "挂载网卡后,您可能需要登录到云主机更新网卡配置并且重启网络服务。", "After disable the compute service, the new instance will not schedule to the compute node.": "禁用计算服务之后,新的云主机不会调度到该计算节点。", "After shelving, the instance will be shut down, resources will be released, and the snapshot will be saved to Glance. This will take about a few minutes, please be patient. You also can choose to unshelve to restore the instance.": "归档后会关闭云主机,释放资源,并将快照保存到 Glance ,这大约需要数分钟时间,请耐心等待。在归档之后您也可以选择取消归档来恢复这台云主机。", "After the volume is expanded, the volume cannot be reduced.": "扩容云硬盘后,云硬盘不可再缩小。", "Agent": "", "Agree to force shutdown": "同意强制关机", + "Albania": "阿尔巴尼亚", + "Algeria": "阿尔及利亚", "All": "全部", "All Flavors": "全部架构", "All ICMP": "所有ICMP协议", @@ -85,9 +88,14 @@ "Allocate IP": "申请IP", "Allocation Pools": "分配地址池", "Allowed Address Pair": "可用地址对", + "American Samoa": "萨摩亚", + "Andorra": "安道尔共和国", + "Angola": "安哥拉", + "Anguilla": "安圭拉岛", "Anti-Affinity": "反亲和组", "Anti-affinity (mandatory):": "反亲和(强制):", "Anti-affinity (not mandatory):": "反亲和 (非强制):", + "Antigua and Barbuda": "安提瓜和巴布达", "Any": "", "Any(Random)": "任意(随机)", "Application Credentials": "应用凭证", @@ -107,6 +115,9 @@ "Are you sure to { action }?": "确认{ action }?", "Are you sure to {action} (instance: {name})?": "确认{ action }(实例名称:{name})?", "Are you sure to {action}?": "确认{action}?", + "Argentina": "阿根廷", + "Armenia": "亚美尼亚", + "Aruba": "阿鲁巴", "Associate": "关联", "Associate Floating IP": "绑定浮动IP", "Associate IP": "关联IP", @@ -126,6 +137,8 @@ "Attached To": "挂载到", "Attaching": "挂载中", "Attachments Info": "挂载信息", + "Australia": "澳大利亚", + "Austria": "奥地利", "Auth Algorithm": "授权算法", "Auth Key": "密钥", "Auto": "自动", @@ -141,6 +154,7 @@ "Available": "可用", "Available Zone": "可用域", "Awaiting Transfer": "等待转让", + "Azerbaijan": "阿塞拜疆", "Back": "返回", "Back End": "后端", "Back to Home": "返回首页", @@ -155,9 +169,14 @@ "Backups": "备份", "Backups & Snapshots": "备份和快照", "Bad Gateway (code: 502) ": "无效网关(错误码:502)", + "Bahamas": "巴哈马", + "Bahrain": "巴林", + "Bailiwick of Jersey": "泽西岛", "BandWidth Limit Egress": "出方向带宽限制", "BandWidth Limit Ingress": "入方向带宽限制", "Bandwidth limit": "带宽限制", + "Bangladesh": "孟加拉国", + "Barbados": "巴巴多斯", "Bare Metal": "裸机", "Bare Metal Enroll": "裸机注册", "Bare Metal Node Detail": "裸机节点详情", @@ -170,6 +189,12 @@ "BaseDetail": "详情", "Basic Parameters": "基本参数", "Batch Allocate": "批量申请", + "Belarus": "白俄罗斯", + "Belgium": "比利时", + "Belize": "伯利兹城", + "Benin": "贝宁", + "Bermuda": "百慕大", + "Bhutan": "不丹", "Big Data": "大数据型", "Bind Device": "绑定设备", "Bind Device Type": "绑定设备类型", @@ -185,14 +210,23 @@ "Block Storage Services": "块存储服务", "Block Storage service:": "块存储服务(cinder):", "Blocked": "", + "Bolivia": "玻利维亚", "Boot Device": "引导设备", "Boot Interface": "Boot接口", "Bootable": "可启动", "Bootable Volume": "可启动云硬盘", + "Bosnia and Herzegovina": "波斯尼亚和黑塞哥维那", "Both of Fontend and Backend": "前后端", + "Botswana": "博茨瓦纳", + "Brazil": "巴西", + "British Indian Ocean Territory": "英属印度洋领地", + "Brunei Darussalam": "文莱达鲁萨兰国", "Build": "创建中", "Building": "创建中", + "Bulgaria": "保加利亚", + "Burkina Faso": "布基纳法索", "Burst limit": "突发限制", + "Burundi": "布隆迪", "CIDR": "网络地址", "CIDR Format Error(e.g. 192.168.0.0/24, 2001:DB8::/48)": "CIDR格式错误(如:192.168.0.0/24, 2001:DB8::/48)", "CPU": "", @@ -203,15 +237,21 @@ "CPU value is { cpu }, NUMA CPU value is { totalCpu }, need to be equal. ": "CPU核数是 { cpu },NUMA节点的CPU核数是{ totalCpu },需要一致。", "CPU(Core)": "CPU(核数)", "CPU/memory can only be increased or expanded online, and cannot be decreased or reduced online.": "CPU/内存均只能在线增或扩展,不能在线减少或缩小。", + "Cameroon": "喀麦隆", "Can add { number } {name}": "还可添加 { number } {name}", + "Canada": "加拿大", "Cancel": "取消", "Cancel Download": "取消下载", "Cancel Select": "取消选择", "Cancel Transfer": "取消云硬盘转让", "Cancel upload successfully.": "取消上传成功。", "Capacity (GB)": "容量(GB)", + "Cape Verde": "佛得角", "Category": "类别", + "Cayman Islands": "开曼群岛", "CentOS": "", + "Central African Republic": "中非共和国", + "Chad": "乍得", "Change Password": "修改密码", "Change Type": "修改类型", "Change password": "修改密码", @@ -223,9 +263,12 @@ "Check Failed": "检查失败", "Check In Progress": "正在检查", "Checksum": "校验和", + "Chile": "智利", + "China": "中国大陆", "Choose a host to live migrate instance to. If not selected, the scheduler will auto select target host.": "选择计算节点来热迁移云主机,如果没有选择,调度器会自动选择目标计算节点。", "Choose a host to migrate instance to. If not selected, the scheduler will auto select target host.": "选择计算节点来迁移云主机,如果没有选择,调度器会自动选择目标计算节点。", "Choosing a QoS policy can limit bandwidth and DSCP": "选择QoS策略可以限制带宽和DSCP", + "Christmas Island": "圣延岛", "Cidr": "网段", "Cinder Service": "存储服务", "Cipher": "", @@ -243,10 +286,13 @@ "Close external gateway": "关闭公网网关", "Cloud": "云", "Cloud Platform": "云平台", + "Cocos (Keeling) Islands": "科科斯群岛", "Code": "编码", "Cold Migrate": "冷迁移", + "Colombia": "哥伦比亚", "Commas ‘,’ are not allowed to be in a tag name in order to simplify requests that specify lists of tags": "标记名称中不允许使用逗号“,”,以简化指定标记列表的请求", "Common Server": "云主机", + "Comoros": "科摩罗", "Compute": "计算", "Compute Hosts": "计算节点", "Compute Live Migration": "计算热迁移", @@ -288,7 +334,10 @@ "Container Format": "容器格式", "Content": "内容", "Control Location": "控制端", + "Cook Islands": "库克群岛", "CoreOS": "", + "Costa Rica": "哥斯达黎加", + "Cote D'Ivoire": "科特迪瓦", "Count": "数量", "Crashed": "瘫痪", "Create": "创建", @@ -363,6 +412,8 @@ "Creating": "创建中", "Creation Timeout (Minutes)": "创建超时(分钟)", "Credential Type": "凭证类型", + "Croatia (local name: Hrvatska)": "克罗地亚", + "Cuba": "古巴", "Current Availability Zones": "当前可用域", "Current Compute Host": "当前计算节点", "Current Flavor": "当前配置", @@ -383,6 +434,8 @@ "Custom TCP Rule": "定制TCP规则", "Custom Trait": "自定义特性", "Custom UDP Rule": "定制UDP规则", + "Cyprus": "塞浦路斯", + "Czech Republic": "捷克", "DCCP": "", "DEGRADED: One or more of the entity’s components are in ERROR": "降级:一个或多个实体的组件都处于错误状态", "DHCP": "", @@ -464,6 +517,8 @@ "Deleted with the instance": "随云主机删除", "Deleting": "删除中", "Deleting this stack will delete all resources deployed by the stack.": "删除此堆栈将删除所有堆栈部署的资源。", + "Democratic Republic of the Congo": "刚果民主共和国", + "Denmark": "丹麦", "Deploy Failed": "部署失败", "Deploy Wait": "等待部署", "Deploying": "部署中", @@ -502,6 +557,7 @@ "Disk Info": "硬盘信息", "Disk Tag": "硬盘标签", "Disk size is limited by the min disk of flavor, image, etc.": "根磁盘大小受云主机类型、镜像等的最小磁盘限制。", + "Djibouti": "吉布提", "Do Build And Run Instance": "构建并运行实例", "Do not reset the normally mounted volume to the \"available\"、\"maintenance\" or \"error\" status. The reset state does not remove the volume from the instance. If you need to remove the volume from the instance, please go to the console of the corresponding project and use the \"detach\" operation.": "请勿将正常的挂载中的云硬盘重置为“可用”、“维护”或”错误“状态。重置状态并不会将云硬盘从云主机上卸载下来。如果您需要将云硬盘从云主机上移除,请进入相应项目的控制台使用“解绑”操作。", "Do not set with a backend": "不设置后端", @@ -512,6 +568,7 @@ "Domain Manager": "域管理员", "Domain Name": "域名称", "Domains": "域", + "Dominica": "多米尼克国", "Down": "停止", "Download all data": "下载所有数据", "Download canceled!": "下载已取消!", @@ -526,6 +583,8 @@ "ESP": "", "Each instance belongs to at least one security group, which needs to be specified when it is created. Instances in the same security group can communicate with each other on the network, and instances in different security groups are disconnected from the internal network by default.": "每个云主机至少属于一个安全组,在创建的时候就需要指定。同一安全组内的云主机之间网络互通,不同安全组的云主机之间默认内网不通。", "Each new connection request is assigned to the next server in order, and all requests are finally divided equally among all servers. Commonly used for short connection services, such as HTTP services.": "按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。常用于短连接服务,例如HTTP等服务。", + "East Timor": "东帝汶", + "Ecuador": "厄瓜多尔", "Edit": "编辑", "Edit Backup": "编辑备份", "Edit Bandwidth Egress Limit Rule": "编辑带宽出方向限制", @@ -568,6 +627,8 @@ "Effective Mode": "生效模式", "Effective mode after configuration changes": "配置变更后的生效模式", "Egress": "出口", + "Egypt": "埃及", + "El Salvador": "萨尔瓦多", "Email": "邮箱", "Enable": "启用", "Enable Admin State": "启用管理状态", @@ -598,11 +659,15 @@ "Entered: {length, plural, =1 {one character} other {# characters} }(maximum {maxCount} characters)": "已输入:{length}字符(最多{maxCount}字符)", "Environment Variable": "环境变量", "Ephemeral Disk(GB)": "本地临时卷(GB)", + "Equatorial Guinea": "赤道几内亚", + "Eritrea": "厄立特里亚国", "Error": "错误", "Error Deleting": "删除时出错", "Error Extending": "扩展错误", "Error Restoring": "恢复错误", + "Estonia": "爱沙尼亚", "Ether Type": "以太网类型", + "Ethiopia": "埃塞俄比亚", "Event Time": "发生时间", "Execution Result": "执行结果", "Expand Advanced Options": "展开高级选项", @@ -629,13 +694,17 @@ "FLAT": "", "Fail Rollback": "失败回滚", "Failed": "失败", + "Falkland Islands (Malvinas)": "福克兰群岛", + "Faroe Islands": "法罗群岛", "Fedora": "", + "Fiji": "斐济", "File": "文件", "Filename": "文件名", "Fill In The Parameters": "参数填写", "Filter Project": "筛选项目", "Fingerprint": "指纹", "Finish Resize": "完成调整", + "Finland": "芬兰", "First time edit automatically creates health monitor When pool does not have a health monitor": "资源池无健康检查器时,首次编辑会自动创建健康检查器", "Fixed IP": "内网IP", "Fixed IP Address": "内网IP地址", @@ -668,7 +737,10 @@ "Forgot your password?": "忘记密码?", "Format": "规格", "Forward Slash ‘/’ is not allowed to be in a tag name": "标记名称中不允许使用正斜杠“ /”", + "France": "法国", "FreeBSD": "", + "French Guiana": "法属圭亚那", + "French Polynesia": "法属玻里尼西亚", "Frequent login failure will cause the account to be temporarily locked, please operate after 5 minutes": "频繁登陆失败会导致账户暂时锁定,请 5min 后再操作", "Front End": "前端", "Full": "爆满", @@ -680,18 +752,34 @@ "GPU Type": "GPU类型", "GPU pass-through will load GPU devices directly to the instance for use. VGPU is a GPU virtualization solution. GPU resources will be segmented and distributed to multiple instances for shared use.": "GPU直通将GPU设备直接加载给云主机进行使用。vGPU是GPU虚拟化方案,GPU资源将被切分后分配给多个云主机共享使用。", "GRE": "", + "Gabon": "加蓬", + "Gambia": "冈比亚", "Gateway IP": "网关IP", "Gateway Time-out (code: 504) ": "网关超时(错误码:504 )", "Gateway ip {gateway_ip} conflicts with allocation pool {pool}": "网关地址 {gateway_ip} 和分配地址池 {pool} 冲突", "General Purpose": "通用型", + "Georgia": "格鲁吉亚", + "Germany": "德国", "Get OpenRC file": "获取Openstack RC 文件", "Get Token": "获取Token", "Get {name} detail error.": "获取{name}详情失败。", "Get {name} error.": "获取{name}失败。", + "Ghana": "加纳", + "Gibraltar": "直布罗陀", "Gigabytes(GB)": "云硬盘容量(GB)", "Given IP": "指定IP", "Global Setting": "平台配置", + "Greece": "希腊", + "Greenland": "格陵兰", + "Grenada": "格林纳达", + "Guadeloupe": "瓜德罗普岛", + "Guam": "关岛", + "Guatemala": "危地马拉", + "Guinea": "几内亚", + "Guinea Bissau": "几内亚比绍", + "Guyana": "圭亚那", "HTTP Version not supported (code: 505) ": "", + "Haiti": "海地", "Hard Reboot": "硬重启", "Hard Rebooting": "硬重启中", "Health Monitor Delay": "检查间隔(秒)", @@ -708,6 +796,8 @@ "High Clock Speed": "高主频型", "Home": "首页", "Home page": "首页", + "Honduras": "洪都拉斯", + "Hong Kong": "香港", "Host": "主机", "Host Aggregate": "主机集合", "Host Aggregates": "主机集合", @@ -716,12 +806,13 @@ "Host Routes Format Error(e.g. ::0a38:01fe/24,::0a38:01fe)": "无效:主机路由格式错误(例如: ::0a38:01fe/24,::0a38:01fe))", "Hostname": "主机名称", "Hosts": "主机", + "Hungary": "匈牙利", "Hypervisor Detail": "虚拟机管理器详情", "Hypervisors": "虚拟机管理器", "ICMP Code": "ICMP编码", "ICMP Type": "ICMP类型", "ICMP Type/ICMP Code": "类型值/编码值", - "ID": "", + "ID": "印度尼西亚", "ID/Floating IP": "ID/浮动IP", "ID/Name": "ID/名称", "IGMP": "", @@ -757,6 +848,7 @@ "IPv6-Opts": "", "IPv6-Route": "", "ISO - Optical disc image format": "ISO - 光盘映像格式", + "Iceland": "冰岛", "Identifier of the physical port on the switch to which node’s port is connected to": "节点端口所连接的交换机物理端口ID", "Identity": "身份管理", "Identity service:": "身份服务(keystone):", @@ -798,7 +890,9 @@ "In-use": "正在使用", "Increment Backup": "增量备份", "Incremental Backup": "增量备份", + "India": "印度", "Indicates whether this VPN can only respond to connections or both respond to and initiate connections.": "指示此VPN是仅响应连接还是同时响应和发起连接。", + "Indonesia": "印度尼西亚", "Infinity": "无限制", "Ingress": "入口", "Init Complete": "初始化完成", @@ -868,6 +962,9 @@ "Invalid: User Group name can not be duplicated": "无效:用户组名称不可重复", "Invalid: User name can not be duplicated": "无效:用户名称不可重复", "Ip Address": "IP地址", + "Iran (Islamic Republic of)": "伊朗", + "Iraq": "伊拉克", + "Ireland": "爱尔兰", "Ironic Instance": "裸机", "Ironic Instance Name": "裸机名称", "Is Current Project": "属于当前项目", @@ -876,6 +973,7 @@ "Is external network port": "是外部网络的网卡", "Isolate": "", "Isolate(No multithreading)": "Isolate(不允许有多线程)", + "Israel": "以色列", "It is IPv6 type.": "这是IPv6格式的。", "It is recommended that the { instanceType } instance simultaneously set large page memory to large. { instanceType } instances also require faster memory addressing capabilities.": "推荐{ instanceType }云主机同时设置大页内存为“大”。{ instanceType }云主机同时需要更快速的内存寻址能力配合。", "It is recommended that you perform this cloning operation on a disk without any reading/writing": "建议在云硬盘无读写任务时执行此项克隆操作。", @@ -887,7 +985,14 @@ "It is suggested to use the marked AZ directly, too much AZ will lead to the fragmentation of available resources": "建议直接使用已划好的 AZ,过多的 AZ 会导致可用资源碎片化。", "It is unreachable for all floating ips.": "对所有浮动IP来说这是不可达的。", "It is unreachable for this floating ip.": "对于此浮动IP而言,这是不可达的。", + "Italy": "意大利", + "Jamaica": "牙买加", + "Japan": "日本", + "Jordan": "约旦", "Jump to Console": "跳转到控制台", + "Kampuchea": "柬埔寨", + "Kazakhstan": "哈萨克", + "Kenya": "肯尼亚", "Kernel ID": "内核ID", "Kernel Image": "Kernel镜像", "Key": "键", @@ -898,12 +1003,21 @@ "Keypair Detail": "密钥详情", "Keypair Info": "密钥信息", "Killed": "终止", + "Kuwait": "科威特", + "Kyrgyzstan": "吉尔吉斯", "LB Algorithm": "算法", "LEAST_CONNECTIONS": "最少连接", + "Lao People's Democratic Republic": "老挝", "Large": "大", "Large(Optimal performance)": "大(性能最优)", "Last Updated": "最近更新", + "Latvia": "拉脱维亚", "Leave Maintenance Mode": "退出维护模式", + "Lebanon": "黎巴嫩", + "Lesotho": "莱索托", + "Liberia": "利比里亚", + "Libyan Arab Jamahiriya": "利比亚", + "Liechtenstein": "列支敦士登", "Lifetime": "生存期", "Lifetime Value": "生存期值", "Listener": "监听器", @@ -914,6 +1028,7 @@ "Listener Number": "监听器数量", "Listener Protocol": "监听器协议", "Listener Protocol Port": "监听器协议端口", + "Lithuania": "立陶宛", "Live Migrate": "热迁移", "Live Migration At Destination": "热迁移至目标地址", "Load Balancer": "负载均衡", @@ -938,14 +1053,22 @@ "Login Name": "登录名", "Login Password": "登录密码", "Login Type": "登录凭证", + "Luxembourg": "卢森堡", "MAC Address": "MAC地址", "MAC Learning State": "MAC学习状态", "MTU": "", "Mac Address": "Mac地址", "MacVTap": "", + "Macau": "澳门", + "Madagascar": "马达加斯加", "Main Project": "主项目", "Maintained": "维护", "Maintenance": "运维管理", + "Malawi": "马拉维", + "Malaysia": "马来西亚", + "Maldives": "马尔代夫", + "Mali": "马里", + "Malta": "马尔他", "Manage Access": "访问管理", "Manage Host": "管理主机", "Manage Metadata": "管理元数据", @@ -966,11 +1089,16 @@ "Manual input": "手动输入", "Manually Assigned Address": "手动分配地址", "Manually Specify": "手动指定", + "Marshall Islands": "马绍尔群岛", + "Martinique": "马提尼克岛", + "Mauritania": "毛里塔尼亚", + "Mauritius": "毛里求斯", "Max BandWidth": "最大带宽", "Max Burst": "最大突发", "Max Retries": "最大重试次数", "Max connect": "最大连接数", "Maximum interval time for each health check response": "每个健康检查响应的最大间隔时间", + "Mayotte": "马约特", "Mem": "内存", "Member": "成员", "Member Count": "成员数量", @@ -986,6 +1114,8 @@ "Metadata": "元数据", "Metadata Definitions": "元数据定义", "Metadata Detail": "元数据详情", + "Mexico": "墨西哥", + "Micronesia": "密克罗尼西亚", "Migrate": "迁移", "Migrate Volume": "迁移云硬盘", "Migrate volume": "迁移云硬盘", @@ -1004,11 +1134,19 @@ "Missing Weight": "未填写权重", "Modify Project Tags": "修改项目标签", "Modify QoS": "修改QoS", + "Moldova": "摩尔多瓦", + "Monaco": "摩纳哥", + "Mongolia": "外蒙古", + "Montenegro": "黑山共和国", + "Montserrat": "蒙特塞拉特", "More": "更多", "More Actions": "更多操作", + "Morocco": "摩洛哥", "Mount ISO": "挂载ISO", + "Mozambique": "莫桑比克", "Multiple filter tags are separated by enter": "多个过滤标签用回车键分隔", "My Role": "我的角色", + "Myanmar": "缅甸", "N/A": "", "NOOP": "", "NUMA Node": "NUMA节点", @@ -1017,6 +1155,11 @@ "Name": "名称", "Name can not be duplicated": "名称不可重复", "Namespace": "命名空间", + "Namibia": "那米比亚", + "Nauru": "瑙鲁", + "Nepal": "尼泊尔", + "Netherlands": "荷兰", + "Netherlands Antilles": "荷兰安的列斯群岛", "Network": "网络", "Network Config": "网络配置", "Network Detail": "网络详情", @@ -1033,8 +1176,13 @@ "Neutron Agent Detail": "网络服务详情", "Neutron Agents": "网络服务", "New Availability Zone": "新可用域", + "New Caledonia": "新喀里多尼亚", + "New Zealand": "新西兰", "Next": "下一步", "Next Hop": "下一跳", + "Nicaragua": "尼加拉瓜", + "Niger": "尼日尔", + "Nigeria": "尼日利亚", "No": "否", "No Console": "", "No Monitor": "无监控", @@ -1048,7 +1196,11 @@ "Node Info": "节点信息", "Node Name": "节点名称", "Node Num": "节点总数", + "Norfolk Island": "诺福克岛", "Normal": "正常", + "North Korea": "朝鲜", + "Northern Mariana Islands": "北马里亚纳群岛", + "Norway": "挪威", "Not Implemented (code: 501) ": "服务器不支持请求(错误码:501)", "Not Open": "未开放", "Not deleted with the instance": "不随云主机删除", @@ -1068,6 +1220,7 @@ "OSPF": "", "Off": "关", "Offline": "离线", + "Oman": "阿曼", "On": "开", "One entry per line(e.g. 114.114.114.114)": "每行一条(例如: 114.114.114.114)", "One entry per line(e.g. {ip})": "每行一条(例如: {ip})", @@ -1102,6 +1255,12 @@ "PING": "", "PXE": "", "PXE Enabled": "PXE启用", + "Pakistan": "巴基斯坦", + "Palau": "帛琉", + "Palestine": "巴勒斯坦", + "Panama": "巴拿马", + "Papua New Guinea": "巴布亚新几内亚", + "Paraguay": "巴拉圭", "Parameter": "参数", "Params Setting": "参数设置", "Password": "密码", @@ -1130,10 +1289,13 @@ "Perform a consistent hash operation on the source IP address of the request to obtain a specific value. At the same time, the back-end server is numbered, and the request is distributed to the server with the corresponding number according to the calculation result. This can enable load distribution of visits from different source IPs, and at the same time enable requests from the same client IP to always be dispatched to a specific server. This method is suitable for load balancing TCP protocol without cookie function.": "将请求的源IP地址进行一致性Hash运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求分发到对应编号的服务器上。这可以使得对不同源IP的访问进行负载分发,同时使得同一个客户端IP的请求始终被派发至某特定的服务器。该方式适合负载均衡无cookie功能的TCP协议。", "Permanent": "长期保留", "Persistent": "持久性", + "Peru": "秘鲁", "Phase1 Negotiation Mode": "Phase1协商模式", + "Philippines": "菲律宾", "Phone": "手机", "Physical Network": "物理网络", "Physical Node": "物理节点", + "Pitcairn": "皮特凯恩岛", "Placement service:": "放置服务(placement):", "Platform Info": "平台概况", "Please confirm your password!": "请确认您的密码", @@ -1198,6 +1360,7 @@ "Pleasse select a network!": "请选择网络!", "Pleasse select a subnet!": "请选择子网!", "Pleasse select a type!": "请选择类型!", + "Poland": "波兰", "Policy": "策略", "Policy Name": "策略名称", "Pool Algorithm": "资源池算法", @@ -1219,6 +1382,7 @@ "Port Security Enabled": "启用端口安全", "Port Type": "端口方式", "Ports": "端口", + "Portugal": "葡萄牙", "Power Off": "关机", "Power On": "开机", "Power State": "电源状态", @@ -1262,7 +1426,9 @@ "Public": "公有", "Public Image": "公有镜像", "Public Key": "公钥", + "Puerto Rico": "波多黎各", "QCOW2 - QEMU image format": "QCOW2-QEMU 镜像格式", + "Qatar": "卡塔尔", "QoS": "", "QoS Bandwidth Egress Limit": "QoS出方向带宽限制", "QoS Bandwidth Ingress Limit": "QoS入方向带宽限制", @@ -1318,6 +1484,7 @@ "Remove": "移除", "Remove Network": "移除网络", "Remove Router": "移除路由器", + "Republic Of The Congo": "刚果共和国", "Request ID": "请求ID", "Require": "强制", "Require(Need multithreading)": "Require(必须有多线程)", @@ -1353,6 +1520,7 @@ "Resume Instance": "恢复云主机", "Resuming": "恢复中", "Retyping": "修改类型中", + "Reunion": "留尼汪岛", "Revert Resize or Migrate": "回滚修改配置/迁移", "Revert Resize/Migrate": "回滚修改配置/迁移", "Reverting": "恢复中", @@ -1365,6 +1533,7 @@ "Rollback Complete": "回滚完成", "Rollback Failed": "回滚失败", "Rollback In Progress": "回滚中", + "Romania": "罗马尼亚", "Root Disk": "系统盘", "Router": "路由器", "Router Detail": "路由器详情", @@ -1375,12 +1544,21 @@ "Rules": "规则", "Rules Number": "规则数量", "Running": "运行中", + "Russia": "俄罗斯", + "Rwanda": "卢旺达", "SCTP": "", "SNAT Enabled": "启用SNAT", "SNAT Rules": "SNAT规则", "SNAT Source": "SNAT源", "SNAT rules": "SNAT规则", "SOURCE_IP": "源IP算法", + "Saint Maarten (Dutch Part)": "圣马丁岛", + "Saint Vincent and the Grenadines": "圣文森特和格林纳丁斯", + "Samoa": "美属萨摩亚", + "San Marino": "圣马力诺共和国", + "Santa Luzia Island": "圣卢西亚岛", + "Sao Tome and Principe": "圣多美和普林西比", + "Saudi Arabia": "沙特阿拉伯", "Saving": "保存中", "Scheduling": "调度中", "Sec for DPD delay, > 0": "设置DPD检查的最大延时时间。", @@ -1405,6 +1583,8 @@ "Selected": "已选", "Selected Members": "已选择成员", "Selected list": "已选列表", + "Senegal": "塞内加尔", + "Serbia": "塞尔维亚共和国", "Server Group": "云主机组", "Server Group Detail": "云主机组详情", "Server Group Member": "云主机组成员", @@ -1416,6 +1596,7 @@ "Set Admin Password": "设置管理员密码", "Set Boot Device": "设置引导设备", "Set IP": "设置IP", + "Seychelles": "塞舌尔", "Shared": "共享", "Shared Image": "共享镜像", "Shared Network": "共享网络", @@ -1434,9 +1615,13 @@ "Shut Down": "关闭", "Shut Off": "关闭", "Shutoff": "关闭", + "Sierra Leone": "塞拉利昂", "Sign Out": "退出登录", "Sign up": "注册", + "Singapore": "新加坡", "Size": "容量", + "Slovakia (Slovak Republic)": "斯洛伐克", + "Slovenia": "斯洛文尼亚", "Small": "小", "Small(Not recommended)": "小(不推荐)", "Smart Scheduling": "智能调度", @@ -1458,11 +1643,17 @@ "Soft Rebooting": "软重启中", "Soft-Affinity": "亲和组(非强制)", "Soft-Anti-Affinity": "反亲和组(非强制)", + "Solomon Islands": "索罗门群岛", + "Somalia": "索马里", "Sorry, the page you visited does not exist.": "抱歉,您访问的页面不存在。", "Source Port/Port Range": "源端口/端口范围", + "South Africa": "南非", + "South Korea": "韩国", + "Spain": "西班牙", "Spawning": "孵化中", "Specification": "规格", "Specs": "规格", + "Sri Lanka": "斯里兰卡", "Stack Detail": "Stack堆栈详情", "Stack Events": "部署日志", "Stack Name": "堆栈名称", @@ -1507,6 +1698,8 @@ "Subordinate Project": "所属项目列表", "Subordinate User Group": "所属用户组列表", "Success": "成功", + "Sudan": "苏丹", + "Suriname": "苏里南", "Suspend": "挂起", "Suspend Complete": "挂起完成", "Suspend Failed": "挂起失败", @@ -1514,10 +1707,14 @@ "Suspend Instance": "挂起云主机", "Suspended": "挂起", "Suspending": "挂起中", + "Swaziland": "斯威士兰", + "Sweden": "瑞典", "Switch ID": "交换机ID", "Switch Info": "交换机信息", "Switch Language": "切换语言", "Switch Project": "切换项目", + "Switzerland": "瑞士", + "Syrian Arab Republic": "叙利亚", "System": "系统", "System Admin": "系统管理权限", "System Config": "系统配置", @@ -1529,7 +1726,10 @@ "TCP": "", "Tags": "标签", "Tags are not case sensitive": "标签不区分大小写", + "Taiwan": "台湾", + "Tajikistan": "塔吉克", "Take effect after restart": "重启后生效", + "Tanzania": "坦桑尼亚", "Target Compute Host": "目标计算节点", "Target IP Address": "目标IP地址", "Target Port": "目标网卡", @@ -1537,8 +1737,12 @@ "Target Subnet": "目标子网", "Template Content": "模板内容", "Template Name": "模板名称", + "Thailand": "泰国", "That is, after how many consecutive failures of the health check, the health check status of the back-end cloud server is changed from normal to abnormal": "即健康检查连续失败多少次后,将后端云服务器的健康检查状态由正常改为不正常", + "The Federation of Saint Kitts and Nevis": "圣基茨和尼维斯", "The Provider is the encryption provider format (e.g. \"lucks\")": "提供者是提供者加密格式(例如\"lucks\")", + "The Republic of Macedonia": "马其顿", + "The Republic of South Sudan": "南苏丹共和国", "The SSH key is a way to remotely log in to the instance. The cloud platform only helps to keep the public key. Please keep your private key properly.": "SSH 密钥是一种远程登录云主机的方式,云平台只帮助保管公钥,请妥善保管自己的私钥。", "The affiliated Domain cannot be modified after creation": "所属域不可修改", "The amphora instance is required for load balancing service setup and is not recommended": "amphora 相关的云主机为负载均衡服务搭建所需,不建议选择", @@ -1605,6 +1809,9 @@ "Timeout(Mininte)": "创建超时(分钟)", "Timeout(s)": "检查超时时间(秒)", "To open": "去开通", + "Togo": "多哥", + "Tokelau": "托克劳", + "Tonga": "汤加", "Too many disks mounted on the instance will affect the read and write performance. It is recommended not to exceed 16 disks.": "云主机挂载太多磁盘会影响读写性能,建议不要超过 16 块。", "Topic": "", "Topology": "网络拓扑", @@ -1616,6 +1823,12 @@ "Transfer ID": "转让ID", "Transfer Name": "转让名称", "Transform Protocol": "转换协议", + "Trinidad and Tobago": "特立尼达和多巴哥", + "Tunisia": "突尼斯", + "Turkey": "土耳其", + "Turkmenistan": "土库曼", + "Turks and Caicos Islands": "土克斯及开科斯群岛", + "Tuvalu": "图瓦卢", "Type": "类型", "UDPLite": "", "USB Info": "USB 信息", @@ -1623,6 +1836,8 @@ "USER": "用户", "UUID": "", "Ubuntu": "", + "Uganda": "乌干达", + "Ukraine": "乌克兰", "Unable to create instance: batch creation is not supported when specifying IP.": "无法创建云主机:指定IP时,不支持批量创建云主机。", "Unable to create instance: insufficient quota to create resources.": "无法创建云主机:超过配额。", "Unable to create volume: insufficient quota to create resources.": "无法创建云硬盘:超过配额。", @@ -1640,6 +1855,9 @@ "Unattached": "未挂载", "Unavailable": "不可用", "Unbootable": "不可启动", + "United Arab Emirates": "阿拉伯联合酋长国", + "United Kingdom": "英国", + "United States": "美国", "Unknown": "未知", "Unless you know clearly which AZ to create the volume in, you don not need to fill in here.": "除非很明确知道应该在哪个 AZ 中创建 Volume,否则此处不用填", "Unlimit": "无限制", @@ -1666,6 +1884,7 @@ "Updating Password": "更新密码中", "Upload progress": "上传进度", "Uploading": "上传中", + "Uruguay": "乌拉圭", "Usage Type": "使用类型", "Usb Controller": "USB控制器", "Use Type": "使用类型", @@ -1699,6 +1918,7 @@ "Username or password is incorrect": "用户名或密码不正确", "Users": "用户", "Using server groups, you can create cloud hosts on the same/different physical nodes as much as possible to meet the affinity/non-affinity requirements of business applications.": "使用云主机组功能,您可以将云主机尽量创建在同一个/不同的物理节点上,满足业务应用的亲和/非亲和性需求。", + "Uzbekistan": "乌兹别克斯坦", "VCPU (Core)": "", "VCPUs": "虚拟CPU", "VDI - VirtualBox compatible image format": "VDI - VirtualBox 兼容的图像格式", @@ -1716,11 +1936,16 @@ "VRRP": "", "Valid": "有效", "Value": "值", + "Vanuatu": "瓦努阿图", + "Vatican City State (Holy See)": "梵蒂冈", "Vendor Interface": "", + "Venezuela": "委内瑞拉", "Verifying": "验证", + "Vietnam": "越南", "View": "查看", "View Detail": "查看详情", "View Rules": "查看规则", + "Virgin Islands (U.S.)": "维尔京群岛", "Virtual Adapter": "虚拟网卡", "Virtual Adapter Detail": "虚拟网卡详情", "Virtual Adapter ID": "虚拟网卡ID", @@ -1744,11 +1969,13 @@ "Volume Transfer": "云硬盘传输", "Volume Type": "云硬盘类型", "Volume Type Detail": "云硬盘类型详情", + "Wallis And Futuna Islands": "沃利斯和富图纳群岛", "Warn": "警告", "Weight": "权重", "Weights": "权重", "Welcome": "欢迎", "Welcome, {name}": "欢迎,登录{name}", + "Western Sahara": "西撒哈拉", "When the computing service starts the recycling instance interval, the instance will be stored in the recycling bin after deletion, and will be retained according to the corresponding time interval. You can choose to restore it within this period. After successful recovery, the status of the instance is running and related resources remain unchanged.": "当计算服务开启回收实例间隔时,删除后云主机会存放在回收站,按对应的时间间隔保留,在此期限内可以选择恢复。恢复成功后的云主机状态为运行中,且相关资源保持不变。", "When the volume is \"bootable\" and the status is \"available\", it can be used as a startup source to create an instance.": "云硬盘为“可启用”并且状态为“可用”时,可以作为启动源来创建云主机。", "When you do online backup of the volume that has been bound, you need to pay attention to the following points:": "当您对已经绑定的硬盘做在线备份时,需要注意以下几点:", @@ -1761,6 +1988,7 @@ "Work Num": "工号", "X86 Architecture": "X86架构", "YAML File": "YAML文件", + "Yemen": "也门", "Yes": "是", "You are not allowed to delete router \"{ name }\".": "无法删除路由器\"{ name }\"。", "You are not allowed to delete snapshot \"{ name }\", which is used by creating volume \"{volumes}\".": "无法删除创建了云硬盘 \"{volumes}\" 的快照 \"{ name }\"。", @@ -1773,6 +2001,9 @@ "You are trying to edit a network that not belong to current project. Please do not continue unless you are quit sure what you are doing.": "你正在尝试编辑非当前 project 的 network 资源,除非你非常确认自己在做什么,否则请不要继续。", "You can manually specify a physical node to create an instance.": "您可以手动指定一台物理节点来创建云主机。", "You don't have access to get {name}.": "您没有权限访问{name}。", + "Yugoslavia": "南斯拉夫", + "Zambia": "赞比亚", + "Zimbabwe": "津巴布韦", "abandon stack": "废弃堆栈", "add network": "添加网络", "add router": "添加路由器", @@ -1967,6 +2198,8 @@ "storage backend": "存储后端", "subnets": "子网", "suspend instance": "挂起云主机", + "the Republic of Abkhazia": "阿布哈兹", + "the Republic of South Ossetia": "南奥赛梯", "the policy is in use": "策略正在使用中", "the router has connected subnet": "路由器有连接的子网", "the vpn gateway is in use": "VPN网关正在使用中", @@ -2014,5 +2247,234 @@ "{name} {id} could not be found.": "您查看的资源{name} {id} 无法获取", "{number} port forwarding rules": "{number}个端口转发规则", "{pageSize} items/page": "{pageSize} 条/页", - "{seconds} seconds": "{seconds}秒" + "{seconds} seconds": "{seconds}秒", + "CN": "中国大陆", + "TW": "台湾", + "HK": "香港", + "MO": "澳门", + "KR": "韩国", + "JP": "日本", + "MY": "马来西亚", + "SG": "新加坡", + "NZ": "新西兰", + "AU": "澳大利亚", + "US": "美国", + "CA": "加拿大", + "VN": "越南", + "IN": "印度", + "TH": "泰国", + "PH": "菲律宾", + "DK": "丹麦", + "FI": "芬兰", + "FR": "法国", + "DE": "德国", + "GR": "希腊", + "IE": "爱尔兰", + "IL": "以色列", + "IT": "意大利", + "MX": "墨西哥", + "NL": "荷兰", + "NO": "挪威", + "PT": "葡萄牙", + "RU": "俄罗斯", + "ZA": "南非", + "ES": "西班牙", + "SE": "瑞典", + "CH": "瑞士", + "BE": "比利时", + "GB": "英国", + "AR": "阿根廷", + "BR": "巴西", + "KH": "柬埔寨", + "LTU": "立陶宛", + "LK": "斯里兰卡", + "NG": "尼日利亚", + "AF": "阿富汗", + "AL": "阿尔巴尼亚", + "DZ": "阿尔及利亚", + "AS": "萨摩亚", + "AD": "安道尔共和国", + "AG": "安提瓜和巴布达", + "AM": "亚美尼亚", + "AT": "奥地利", + "BS": "巴哈马", + "BH": "巴林", + "": "圣马丁岛", + "BD": "孟加拉国", + "BY": "白俄罗斯", + "BM": "百慕大", + "BA": "波斯尼亚和黑塞哥维那", + "IO": "英属印度洋领地", + "BF": "布基纳法索", + "CF": "中非共和国", + "TD": "乍得", + "CX": "圣延岛", + "CC": "科科斯群岛", + "CO": "哥伦比亚", + "CG": "刚果共和国", + "ZR": "刚果民主共和国", + "CR": "哥斯达黎加", + "CI": "科特迪瓦", + "CU": "古巴", + "CZ": "捷克", + "GQ": "赤道几内亚", + "EE": "爱沙尼亚", + "FK": "福克兰群岛", + "PF": "法属玻里尼西亚", + "GA": "加蓬", + "GP": "瓜德罗普岛", + "GW": "几内亚比绍", + "GY": "圭亚那", + "HN": "洪都拉斯", + "HU": "匈牙利", + "JO": "约旦", + "KZ": "哈萨克", + "KE": "肯尼亚", + "KW": "科威特", + "KG": "吉尔吉斯", + "LS": "莱索托", + "MG": "马达加斯加", + "MV": "马尔代夫", + "YT": "马约特", + "FM": "密克罗尼西亚", + "MC": "摩纳哥", + "MN": "外蒙古", + "MNE": "黑山共和国", + "MS": "蒙特塞拉特", + "MM": "缅甸", + "NR": "瑙鲁", + "NP": "尼泊尔", + "AN": "荷兰安的列斯群岛", + "NC": "新喀里多尼亚", + "NI": "尼加拉瓜", + "NF": "诺福克岛", + "KP": "朝鲜", + "MP": "北马里亚纳群岛", + "OM": "阿曼", + "PK": "巴基斯坦", + "PW": "帛琉", + "PA": "巴拿马", + "PG": "巴布亚新几内亚", + "PN": "皮特凯恩岛", + "PL": "波兰", + "PR": "波多黎各", + "QA": "卡塔尔", + "RE": "留尼汪岛", + "VCT": "圣文森特和格林纳丁斯", + "STP": "圣多美和普林西比", + "SA": "沙特阿拉伯", + "SRB": "塞尔维亚共和国", + "SC": "塞舌尔", + "SK": "斯洛伐克", + "SI": "斯洛文尼亚", + "SZ": "斯威士兰", + "TJ": "塔吉克", + "KNA": "圣基茨和尼维斯", + "ABH": "阿布哈兹", + "MKD": "马其顿", + "SSD": "南苏丹共和国", + "TN": "突尼斯", + "TM": "土库曼", + "TV": "图瓦卢", + "UG": "乌干达", + "UA": "乌克兰", + "AE": "阿拉伯联合酋长国", + "UY": "乌拉圭", + "UZ": "乌兹别克斯坦", + "VA": "梵蒂冈", + "WF": "沃利斯和富图纳群岛", + "EH": "西撒哈拉", + "YU": "南斯拉夫", + "ZM": "赞比亚", + "AO": "安哥拉", + "AI": "安圭拉岛", + "AW": "阿鲁巴", + "AZ": "阿塞拜疆", + "BB": "巴巴多斯", + "BZ": "伯利兹城", + "BJ": "贝宁", + "BT": "不丹", + "BO": "玻利维亚", + "BW": "博茨瓦纳", + "BN": "文莱达鲁萨兰国", + "BG": "保加利亚", + "BI": "布隆迪", + "CM": "喀麦隆", + "CV": "佛得角", + "KY": "开曼群岛", + "CL": "智利", + "KM": "科摩罗", + "CK": "库克群岛", + "HR": "克罗地亚", + "CY": "塞浦路斯", + "DJ": "吉布提", + "DM": "多米尼克国", + "TP": "东帝汶", + "EC": "厄瓜多尔", + "EG": "埃及", + "SV": "萨尔瓦多", + "ER": "厄立特里亚国", + "ET": "埃塞俄比亚", + "FO": "法罗群岛", + "FJ": "斐济", + "GF": "法属圭亚那", + "GM": "冈比亚", + "GE": "格鲁吉亚", + "GH": "加纳", + "GI": "直布罗陀", + "GL": "格陵兰", + "GD": "格林纳达", + "GU": "关岛", + "GT": "危地马拉", + "GN": "几内亚", + "HT": "海地", + "IS": "冰岛", + "IR": "伊朗", + "IQ": "伊拉克", + "JM": "牙买加", + "LAO": "老挝", + "LV": "拉脱维亚", + "LB": "黎巴嫩", + "LR": "利比里亚", + "LY": "利比亚", + "LI": "列支敦士登", + "LU": "卢森堡", + "MW": "马拉维", + "ML": "马里", + "MT": "马尔他", + "MH": "马绍尔群岛", + "MQ": "马提尼克岛", + "MR": "毛里塔尼亚", + "MU": "毛里求斯", + "MD": "摩尔多瓦", + "MA": "摩洛哥", + "MZ": "莫桑比克", + "NA": "那米比亚", + "NE": "尼日尔", + "PS": "巴勒斯坦", + "PY": "巴拉圭", + "PE": "秘鲁", + "RO": "罗马尼亚", + "RW": "卢旺达", + "WS": "美属萨摩亚", + "SM": "圣马力诺共和国", + "SN": "塞内加尔", + "SL": "塞拉利昂", + "SB": "索罗门群岛", + "SO": "索马里", + "SD": "苏丹", + "SR": "苏里南", + "SY": "叙利亚", + "TZ": "坦桑尼亚", + "TG": "多哥", + "TK": "托克劳", + "TO": "汤加", + "TT": "特立尼达和多巴哥", + "TR": "土耳其", + "TC": "土克斯及开科斯群岛", + "VU": "瓦努阿图", + "VE": "委内瑞拉", + "VI": "维尔京群岛", + "YE": "也门", + "ZW": "津巴布韦" } diff --git a/src/pages/identity/containers/User/actions/Create.jsx b/src/pages/identity/containers/User/actions/Create.jsx index bf08be92..7dd0a59c 100644 --- a/src/pages/identity/containers/User/actions/Create.jsx +++ b/src/pages/identity/containers/User/actions/Create.jsx @@ -275,7 +275,7 @@ export class CreateForm extends FormAction { { name: 'phone', label: t('Phone'), - type: 'input', + type: 'phone', required: true, validator: phoneNumberValidate, labelCol, diff --git a/src/pages/identity/containers/User/actions/Edit.jsx b/src/pages/identity/containers/User/actions/Edit.jsx index 6744e7bf..bf7e20cd 100644 --- a/src/pages/identity/containers/User/actions/Edit.jsx +++ b/src/pages/identity/containers/User/actions/Edit.jsx @@ -17,6 +17,7 @@ import { ModalAction } from 'containers/Action'; import globalUserStore from 'stores/keystone/user'; import globalDomainStore from 'stores/keystone/domain'; import { phoneNumberValidate, emailValidate } from 'utils/validate'; +import parsePhoneNumberFromString from 'libphonenumber-js'; export class EditForm extends ModalAction { init() { @@ -93,12 +94,17 @@ export class EditForm extends ModalAction { const domain = domains.filter((it) => it.id === domain_id)[0]; const project = projects.filter((it) => it.id === default_project_id)[0]; if (name && this.formRef.current) { + const formatedPhone = parsePhoneNumberFromString(phone || '', 'CN') || { + country: 'CN', + nationalNumber: '', + }; + const { countryCallingCode, nationalNumber } = formatedPhone; this.formRef.current.setFieldsValue({ name, domain_id: domain ? domain.name : '', default_project_id: project ? project.name : '', email, - phone, + phone: `+${countryCallingCode} ${nationalNumber}`, real_name, description, }); @@ -142,7 +148,7 @@ export class EditForm extends ModalAction { { name: 'phone', label: t('Phone'), - type: 'input', + type: 'phone', required: true, validator: phoneNumberValidate, }, diff --git a/src/pages/identity/containers/User/actionsInDomain/Create.jsx b/src/pages/identity/containers/User/actionsInDomain/Create.jsx index f73c389b..9f78ff2a 100644 --- a/src/pages/identity/containers/User/actionsInDomain/Create.jsx +++ b/src/pages/identity/containers/User/actionsInDomain/Create.jsx @@ -183,7 +183,7 @@ export class CreateForm extends ModalAction { name: 'phone', label: t('Phone'), validator: phoneNumberValidate, - type: 'input', + type: 'phone', required: true, }, { diff --git a/src/utils/validate.js b/src/utils/validate.js index cba44d52..634c70fd 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -15,7 +15,7 @@ import { isString, isNil } from 'lodash'; import { Address4, Address6 } from 'ip-address'; import cidrRegex from 'cidr-regex'; -import { phone } from 'phone'; +import { isValidPhoneNumber } from 'libphonenumber-js'; const { v4, v6 } = cidrRegex; @@ -75,7 +75,7 @@ export const regex = { asciiRegex, }; -export const isPhoneNumber = (value) => phone(value).isValid; +export const isPhoneNumber = (value) => isValidPhoneNumber(value); export const isEmailNumber = (value) => emailRegex.test(value); diff --git a/test/e2e/integration/pages/identity/user.spec.js b/test/e2e/integration/pages/identity/user.spec.js index 107505a8..8013a1d5 100644 --- a/test/e2e/integration/pages/identity/user.spec.js +++ b/test/e2e/integration/pages/identity/user.spec.js @@ -20,6 +20,7 @@ describe('The User Page', () => { const name = `e2e-user-${uuid}`; const newname = `${name}-1`; const email = `${name}@example.com`; + const prefix = '+86'; const phone = '18500000000'; const password = 'passW0rd_'; const tmpPassword = `${password}1`; @@ -47,7 +48,8 @@ describe('The User Page', () => { .formInput('email', email) .formInput('password', tmpPassword) .formInput('confirmPassword', tmpPassword) - .formInput('phone', phone) + .formSelect('phone', prefix) + .formInput('phone', phone, '.ant-input') .formInput('real_name', name) .formButtonClick('more') .wait(2000) diff --git a/test/e2e/support/form-commands.js b/test/e2e/support/form-commands.js index 88c62374..acb99037 100644 --- a/test/e2e/support/form-commands.js +++ b/test/e2e/support/form-commands.js @@ -125,8 +125,8 @@ Cypress.Commands.add('clickStepActionCancelButton', (waitTime = 2000) => { .wait(waitTime); }); -Cypress.Commands.add('formInput', (formItemName, value) => { - cy.get(getId(formItemName)).find('input').clear().type(value); +Cypress.Commands.add('formInput', (formItemName, value, selector = 'input') => { + cy.get(getId(formItemName)).find(selector).clear().type(value); }); Cypress.Commands.add('formText', (formItemName, value) => { diff --git a/test/e2e/support/resource-commands.js b/test/e2e/support/resource-commands.js index 4e61bc78..6f7ef201 100644 --- a/test/e2e/support/resource-commands.js +++ b/test/e2e/support/resource-commands.js @@ -207,6 +207,7 @@ Cypress.Commands.add('createUserGroup', ({ name }) => { Cypress.Commands.add('createUser', ({ name }) => { const email = `${name}@example.com`; + const prefix = '+86'; const phone = '18500000000'; const password = 'passW0rd_'; cy.visitPage(userListUrl) @@ -216,7 +217,8 @@ Cypress.Commands.add('createUser', ({ name }) => { .formInput('email', email) .formInput('password', password) .formInput('confirmPassword', password) - .formInput('phone', phone) + .formSelect('phone', prefix) + .formInput('phone', phone, '.ant-input') .formInput('real_name', name) .clickFormActionSubmitButton() .tableSearchText(name) diff --git a/yarn.lock b/yarn.lock index 4dc4b654..763c379e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8992,6 +8992,11 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libphonenumber-js@^1.9.42: + version "1.9.42" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.42.tgz#41f41d540f89b6e3fd36de7120ddb57b3a468c77" + integrity sha512-UBtU0ylpZPKPT8NLIyQJWj/DToMFxmo3Fm5m6qDc0LATvf0SY0qUhaurCEvukAB9Fo+Ia2Anjzqwoupaa64fXg== + liftup@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/liftup/-/liftup-3.0.1.tgz#1cb81aff0f368464ed3a5f1a7286372d6b1a60ce" @@ -10729,11 +10734,6 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -phone@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/phone/-/phone-3.1.6.tgz#eefff0be1ce4ce9f2ee028c67be6b58dc5616ef1" - integrity sha512-46WCdbDG32OKoPsntTg2l0VBaWVWg0A3zvH5dUhApwOupyn7owXRtDBz6vAjsJiZQGTft++WvTxEZeqxlCUv9g== - picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d"