Pour commencer

Accédez aux outils et aux éléments de base qui permettent de concevoir et de mettre au point des expériences cohérentes et accessibles.

Développer Conception

Numéro de téléphone international

Comment demander aux utilisateurs leur numéro de téléphone international.

Conseils

Ce composant utilise la bibliothèque libphonenumber de Google (anglais seulement) pour valider les numéros de téléphone internationaux.


Numéro de téléphone international

HTML et Javascript

<!-- Numéro de téléphone international avec validation -->
	<div class="gnb-form-input">
	<label for="international-phone">International phone number</label>
	<select id="country" onchange="updateCountryCode()" style="max-width: fit-content;">
		<option value="AF">Afghanistan</option>
		<option value="AL">Albania</option>
		<option value="DZ">Algeria</option>
		<option value="AD">Andorra</option>
		<option value="AO">Angola</option>
		<option value="AI">Anguilla</option>
		<option value="AG">Antigua & Barbuda</option>
		<option value="AR">Argentina</option>
		<option value="AM">Armenia</option>
		<option value="AW">Aruba</option>
		<option value="AU">Australia</option>
		<option value="AT">Austria</option>
		<option value="AZ">Azerbaijan</option>
		<option value="BS">Bahamas</option>
		<option value="BH">Bahrain</option>
		<option value="BD">Bangladesh</option>
		<option value="BB">Barbados</option>
		<option value="BY">Belarus</option>
		<option value="BE">Belgium</option>
		<option value="BZ">Belize</option>
		<option value="BJ">Benin</option>
		<option value="BM">Bermuda</option>
		<option value="BT">Bhutan</option>
		<option value="BO">Bolivia</option>
		<option value="BA">Bosnia & Herzegovina</option>
		<option value="BW">Botswana</option>
		<option value="BR">Brazil</option>
		<option value="IO">British Indian Ocean Territory</option>
		<option value="VG">British Virgin Islands</option>
		<option value="BN">Brunei</option>
		<option value="BG">Bulgaria</option>
		<option value="BF">Burkina Faso</option>
		<option value="BI">Burundi</option>
		<option value="KH">Cambodia</option>
		<option value="CM">Cameroon</option>
		<option value="CA" selected>Canada</option>
		<option value="CV">Cape Verde</option>
		<option value="KY">Cayman Islands</option>
		<option value="CF">Central African Republic</option>
		<option value="TD">Chad</option>
		<option value="CL">Chile</option>
		<option value="CN">China</option>
		<option value="CO">Colombia</option>
		<option value="KM">Comoros</option>
		<option value="CG">Congo - Brazzaville</option>
		<option value="CD">Congo - Kinshasa</option>
		<option value="CK">Cook Islands</option>
		<option value="CR">Costa Rica</option>
		<option value="CI">Côte d’Ivoire</option>
		<option value="HR">Croatia</option>
		<option value="CU">Cuba</option>
		<option value="CW">Curaçao</option>
		<option value="CY">Cyprus</option>
		<option value="CZ">Czechia</option>
		<option value="DK">Denmark</option>
		<option value="DJ">Djibouti</option>
		<option value="DM">Dominica</option>
		<option value="DO">Dominican Republic</option>
		<option value="EC">Ecuador</option>
		<option value="EG">Egypt</option>
		<option value="SV">El Salvador</option>
		<option value="GQ">Equatorial Guinea</option>
		<option value="ER">Eritrea</option>
		<option value="EE">Estonia</option>
		<option value="SZ">Eswatini</option>
		<option value="ET">Ethiopia</option>
		<option value="FK">Falkland Islands</option>
		<option value="FO">Faroe Islands</option>
		<option value="FJ">Fiji</option>
		<option value="FI">Finland</option>
		<option value="FR">France</option>
		<option value="GF">French Guiana</option>
		<option value="PF">French Polynesia</option>
		<option value="GA">Gabon</option>
		<option value="GM">Gambia</option>
		<option value="GE">Georgia</option>
		<option value="DE">Germany</option>
		<option value="GH">Ghana</option>
		<option value="GI">Gibraltar</option>
		<option value="GR">Greece</option>
		<option value="GL">Greenland</option>
		<option value="GD">Grenada</option>
		<option value="GP">Guadeloupe</option>
		<option value="GT">Guatemala</option>
		<option value="GG">Guernsey</option>
		<option value="GN">Guinea</option>
		<option value="GW">Guinea-Bissau</option>
		<option value="GY">Guyana</option>
		<option value="HT">Haiti</option>
		<option value="HN">Honduras</option>
		<option value="HK">Hong Kong SAR China</option>
		<option value="HU">Hungary</option>
		<option value="IS">Iceland</option>
		<option value="IN">India</option>
		<option value="ID">Indonesia</option>
		<option value="IR">Iran</option>
		<option value="IQ">Iraq</option>
		<option value="IE">Ireland</option>
		<option value="IM">Isle of Man</option>
		<option value="IL">Israel</option>
		<option value="IT">Italy</option>
		<option value="JM">Jamaica</option>
		<option value="JP">Japan</option>
		<option value="JE">Jersey</option>
		<option value="JO">Jordan</option>
		<option value="KZ">Kazakhstan</option>
		<option value="KE">Kenya</option>
		<option value="KI">Kiribati</option>
		<option value="XK">Kosovo</option>
		<option value="KW">Kuwait</option>
		<option value="KG">Kyrgyzstan</option>
		<option value="LA">Laos</option>
		<option value="LV">Latvia</option>
		<option value="LB">Lebanon</option>
		<option value="LS">Lesotho</option>
		<option value="LR">Liberia</option>
		<option value="LY">Libya</option>
		<option value="LI">Liechtenstein</option>
		<option value="LT">Lithuania</option>
		<option value="LU">Luxembourg</option>
		<option value="MO">Macao SAR China</option>
		<option value="MG">Madagascar</option>
		<option value="MW">Malawi</option>
		<option value="MY">Malaysia</option>
		<option value="MV">Maldives</option>
		<option value="ML">Mali</option>
		<option value="MT">Malta</option>
		<option value="MQ">Martinique</option>
		<option value="MR">Mauritania</option>
		<option value="MU">Mauritius</option>
		<option value="YT">Mayotte</option>
		<option value="MX">Mexico</option>
		<option value="MD">Moldova</option>
		<option value="MC">Monaco</option>
		<option value="MN">Mongolia</option>
		<option value="ME">Montenegro</option>
		<option value="MS">Montserrat</option>
		<option value="MA">Morocco</option>
		<option value="MZ">Mozambique</option>
		<option value="MM">Myanmar (Burma)</option>
		<option value="NA">Namibia</option>
		<option value="NR">Nauru</option>
		<option value="NP">Nepal</option>
		<option value="NL">Netherlands</option>
		<option value="NC">New Caledonia</option>
		<option value="NZ">New Zealand</option>
		<option value="NI">Nicaragua</option>
		<option value="NE">Niger</option>
		<option value="NG">Nigeria</option>
		<option value="NU">Niue</option>
		<option value="MK">North Macedonia</option>
		<option value="NO">Norway</option>
		<option value="OM">Oman</option>
		<option value="PK">Pakistan</option>
		<option value="PS">Palestinian Territories</option>
		<option value="PA">Panama</option>
		<option value="PG">Papua New Guinea</option>
		<option value="PY">Paraguay</option>
		<option value="PE">Peru</option>
		<option value="PH">Philippines</option>
		<option value="PN">Pitcairn Islands</option>
		<option value="PL">Poland</option>
		<option value="PT">Portugal</option>
		<option value="QA">Qatar</option>
		<option value="RE">Réunion</option>
		<option value="RO">Romania</option>
		<option value="RU">Russia</option>
		<option value="RW">Rwanda</option>
		<option value="WS">Samoa</option>
		<option value="SM">San Marino</option>
		<option value="ST">São Tomé & Príncipe</option>
		<option value="SA">Saudi Arabia</option>
		<option value="SN">Senegal</option>
		<option value="RS">Serbia</option>
		<option value="SC">Seychelles</option>
		<option value="SL">Sierra Leone</option>
		<option value="SG">Singapore</option>
		<option value="SX">Sint Maarten</option>
		<option value="SK">Slovakia</option>
		<option value="SI">Slovenia</option>
		<option value="SB">Solomon Islands</option>
		<option value="SO">Somalia</option>
		<option value="ZA">South Africa</option>
		<option value="KR">South Korea</option>
		<option value="SS">South Sudan</option>
		<option value="ES">Spain</option>
		<option value="LK">Sri Lanka</option>
		<option value="BL">St. Barthélemy</option>
		<option value="SH">St. Helena</option>
		<option value="KN">St. Kitts & Nevis</option>
		<option value="LC">St. Lucia</option>
		<option value="MF">St. Martin</option>
		<option value="PM">St. Pierre & Miquelon</option>
		<option value="VC">St. Vincent & Grenadines</option>
		<option value="SR">Suriname</option>
		<option value="SJ">Svalbard & Jan Mayen</option>
		<option value="SE">Sweden</option>
		<option value="CH">Switzerland</option>
		<option value="SY">Syria</option>
		<option value="TW">Taiwan</option>
		<option value="TJ">Tajikistan</option>
		<option value="TZ">Tanzania</option>
		<option value="TH">Thailand</option>
		<option value="TL">Timor-Leste</option>
		<option value="TG">Togo</option>
		<option value="TK">Tokelau</option>
		<option value="TO">Tonga</option>
		<option value="TT">Trinidad & Tobago</option>
		<option value="TN">Tunisia</option>
		<option value="TR">Turkey</option>
		<option value="TM">Turkmenistan</option>
		<option value="TC">Turks & Caicos Islands</option>
		<option value="TV">Tuvalu</option>
		<option value="UG">Uganda</option>
		<option value="UA">Ukraine</option>
		<option value="AE">United Arab Emirates</option>
		<option value="GB">United Kingdom</option>
		<option value="US">United States</option>
		<option value="UY">Uruguay</option>
		<option value="UZ">Uzbekistan</option>
		<option value="VU">Vanuatu</option>
		<option value="VA">Vatican City</option>
		<option value="VE">Venezuela</option>
		<option value="VN">Vietnam</option>
		<option value="WF">Wallis & Futuna</option>
		<option value="YE">Yemen</option>
		<option value="ZM">Zambia</option>
		<option value="ZW">Zimbabwe</option>
	</select>
	<input type="text" id="international-phone" placeholder="Enter phone number" style="max-width: 15em;">
	<div class="gnb-form-validation" id="international-phone-error" style="display: none;"></div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/libphonenumber-js/1.10.60/libphonenumber-js.min.js" defer></script>
<script>
	// Define language-specific translations for the error message
	const langtranslations = {
		en: {
			internationalPhoneError: 'Your phone number is not the correct length, please try again.'
		},
		fr: {
			internationalPhoneError: 'Votre numéro de téléphone n’a pas la bonne longueur, veuillez réessayer.'
		},
	};

	window.onload = function () {
		updateCountryCode(); // Set default value for phone input
	};

	function updateCountryCode() {
		const countrySelect = document.getElementById('country');
		const countryCode = countrySelect.options[countrySelect.selectedIndex].value;
		const phoneNumberInput = document.getElementById('international-phone');
		phoneNumberInput.value = '+' + libphonenumber.getCountryCallingCode(countryCode);
	}

	function validateInternationalPhoneNumber() {

		// Function to detect current language
		function getCurrentLanguage() {
			const htmlLang = document.documentElement.lang;
			return htmlLang ? htmlLang.toLowerCase() : 'en'; // Default to English if lang attribute not specified
		}

		// Function to translate strings
		function translate(key) {
			const currentLanguage = getCurrentLanguage();
			const translation = langtranslations[currentLanguage][key];
			return translation || key; // Return original key if translation not found
		}

		const countrySelect = document.getElementById('country');
		const countryCode = countrySelect.options[countrySelect.selectedIndex].value;
		const phoneNumberInput = document.getElementById('international-phone');
		const phoneNumber = phoneNumberInput.value;

		// Parse the phone number using libphonenumber-js
		try {
			const phoneNumberObj = new libphonenumber.parsePhoneNumber(phoneNumber, countryCode);
			if (!phoneNumberObj.isValid()) {
				phoneNumberInput.parentElement.classList.add('error');
				phoneNumberInput.parentElement.classList.remove('valid');
				phoneNumberInput.setAttribute('aria-invalid', 'true');
				phoneNumberInput.setAttribute('aria-describedby', 'phone-error');
				document.getElementById('international-phone-error').innerText = translate('internationalPhoneError');
				document.getElementById('international-phone-error').style.display = 'block'; // Show error message
				return;
			}
		} catch (error) {
			phoneNumberInput.parentElement.classList.add('error');
			phoneNumberInput.parentElement.classList.remove('valid');
			phoneNumberInput.setAttribute('aria-invalid', 'true');
			phoneNumberInput.setAttribute('aria-describedby', 'phone-error');
			document.getElementById('international-phone-error').innerText = translate('internationalPhoneError');
			document.getElementById('international-phone-error').style.display = 'block'; // Show error message
			return;
		}
		phoneNumberInput.parentElement.classList.remove('error');
		phoneNumberInput.parentElement.classList.add('valid');
		phoneNumberInput.removeAttribute('aria-invalid');
		phoneNumberInput.removeAttribute('aria-describedby');
		document.getElementById('international-phone-error').innerText = ''; // Clear any previous error messages
		document.getElementById('international-phone-error').style.display = 'none'; // Show error message
	}
	// Show error message when input field loses focus
	document.getElementById('international-phone').addEventListener('blur', validateInternationalPhoneNumber);
</script>