|
|
@@ -0,0 +1,430 @@
|
|
|
+import { Trans } from '@lingui/react/macro';
|
|
|
+import {
|
|
|
+ Dialog,
|
|
|
+ DialogTitle,
|
|
|
+ DialogContent,
|
|
|
+ DialogHeader,
|
|
|
+ DialogTrigger,
|
|
|
+ DialogFooter,
|
|
|
+ DialogClose,
|
|
|
+} from '../ui/dialog.js';
|
|
|
+import { Button } from '../ui/button.js';
|
|
|
+import { FormItem, FormLabel } from '../ui/form.js';
|
|
|
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select.js';
|
|
|
+import { Label } from '../ui/label.js';
|
|
|
+import { uiConfig } from 'virtual:vendure-ui-config';
|
|
|
+import { useUserSettings } from '@/providers/user-settings.js';
|
|
|
+
|
|
|
+/**
|
|
|
+ * This is copied from the generated types from @vendure/common/lib/generated-types.d.ts
|
|
|
+ * It is used to provide a list of available currency codes for the user to select from.
|
|
|
+ * esbuild currently does not support import enums.
|
|
|
+ */
|
|
|
+enum CurrencyCode {
|
|
|
+ /** United Arab Emirates dirham */
|
|
|
+ AED = 'AED',
|
|
|
+ /** Afghan afghani */
|
|
|
+ AFN = 'AFN',
|
|
|
+ /** Albanian lek */
|
|
|
+ ALL = 'ALL',
|
|
|
+ /** Armenian dram */
|
|
|
+ AMD = 'AMD',
|
|
|
+ /** Netherlands Antillean guilder */
|
|
|
+ ANG = 'ANG',
|
|
|
+ /** Angolan kwanza */
|
|
|
+ AOA = 'AOA',
|
|
|
+ /** Argentine peso */
|
|
|
+ ARS = 'ARS',
|
|
|
+ /** Australian dollar */
|
|
|
+ AUD = 'AUD',
|
|
|
+ /** Aruban florin */
|
|
|
+ AWG = 'AWG',
|
|
|
+ /** Azerbaijani manat */
|
|
|
+ AZN = 'AZN',
|
|
|
+ /** Bosnia and Herzegovina convertible mark */
|
|
|
+ BAM = 'BAM',
|
|
|
+ /** Barbados dollar */
|
|
|
+ BBD = 'BBD',
|
|
|
+ /** Bangladeshi taka */
|
|
|
+ BDT = 'BDT',
|
|
|
+ /** Bulgarian lev */
|
|
|
+ BGN = 'BGN',
|
|
|
+ /** Bahraini dinar */
|
|
|
+ BHD = 'BHD',
|
|
|
+ /** Burundian franc */
|
|
|
+ BIF = 'BIF',
|
|
|
+ /** Bermudian dollar */
|
|
|
+ BMD = 'BMD',
|
|
|
+ /** Brunei dollar */
|
|
|
+ BND = 'BND',
|
|
|
+ /** Boliviano */
|
|
|
+ BOB = 'BOB',
|
|
|
+ /** Brazilian real */
|
|
|
+ BRL = 'BRL',
|
|
|
+ /** Bahamian dollar */
|
|
|
+ BSD = 'BSD',
|
|
|
+ /** Bhutanese ngultrum */
|
|
|
+ BTN = 'BTN',
|
|
|
+ /** Botswana pula */
|
|
|
+ BWP = 'BWP',
|
|
|
+ /** Belarusian ruble */
|
|
|
+ BYN = 'BYN',
|
|
|
+ /** Belize dollar */
|
|
|
+ BZD = 'BZD',
|
|
|
+ /** Canadian dollar */
|
|
|
+ CAD = 'CAD',
|
|
|
+ /** Congolese franc */
|
|
|
+ CDF = 'CDF',
|
|
|
+ /** Swiss franc */
|
|
|
+ CHF = 'CHF',
|
|
|
+ /** Chilean peso */
|
|
|
+ CLP = 'CLP',
|
|
|
+ /** Renminbi (Chinese) yuan */
|
|
|
+ CNY = 'CNY',
|
|
|
+ /** Colombian peso */
|
|
|
+ COP = 'COP',
|
|
|
+ /** Costa Rican colon */
|
|
|
+ CRC = 'CRC',
|
|
|
+ /** Cuban convertible peso */
|
|
|
+ CUC = 'CUC',
|
|
|
+ /** Cuban peso */
|
|
|
+ CUP = 'CUP',
|
|
|
+ /** Cape Verde escudo */
|
|
|
+ CVE = 'CVE',
|
|
|
+ /** Czech koruna */
|
|
|
+ CZK = 'CZK',
|
|
|
+ /** Djiboutian franc */
|
|
|
+ DJF = 'DJF',
|
|
|
+ /** Danish krone */
|
|
|
+ DKK = 'DKK',
|
|
|
+ /** Dominican peso */
|
|
|
+ DOP = 'DOP',
|
|
|
+ /** Algerian dinar */
|
|
|
+ DZD = 'DZD',
|
|
|
+ /** Egyptian pound */
|
|
|
+ EGP = 'EGP',
|
|
|
+ /** Eritrean nakfa */
|
|
|
+ ERN = 'ERN',
|
|
|
+ /** Ethiopian birr */
|
|
|
+ ETB = 'ETB',
|
|
|
+ /** Euro */
|
|
|
+ EUR = 'EUR',
|
|
|
+ /** Fiji dollar */
|
|
|
+ FJD = 'FJD',
|
|
|
+ /** Falkland Islands pound */
|
|
|
+ FKP = 'FKP',
|
|
|
+ /** Pound sterling */
|
|
|
+ GBP = 'GBP',
|
|
|
+ /** Georgian lari */
|
|
|
+ GEL = 'GEL',
|
|
|
+ /** Ghanaian cedi */
|
|
|
+ GHS = 'GHS',
|
|
|
+ /** Gibraltar pound */
|
|
|
+ GIP = 'GIP',
|
|
|
+ /** Gambian dalasi */
|
|
|
+ GMD = 'GMD',
|
|
|
+ /** Guinean franc */
|
|
|
+ GNF = 'GNF',
|
|
|
+ /** Guatemalan quetzal */
|
|
|
+ GTQ = 'GTQ',
|
|
|
+ /** Guyanese dollar */
|
|
|
+ GYD = 'GYD',
|
|
|
+ /** Hong Kong dollar */
|
|
|
+ HKD = 'HKD',
|
|
|
+ /** Honduran lempira */
|
|
|
+ HNL = 'HNL',
|
|
|
+ /** Croatian kuna */
|
|
|
+ HRK = 'HRK',
|
|
|
+ /** Haitian gourde */
|
|
|
+ HTG = 'HTG',
|
|
|
+ /** Hungarian forint */
|
|
|
+ HUF = 'HUF',
|
|
|
+ /** Indonesian rupiah */
|
|
|
+ IDR = 'IDR',
|
|
|
+ /** Israeli new shekel */
|
|
|
+ ILS = 'ILS',
|
|
|
+ /** Indian rupee */
|
|
|
+ INR = 'INR',
|
|
|
+ /** Iraqi dinar */
|
|
|
+ IQD = 'IQD',
|
|
|
+ /** Iranian rial */
|
|
|
+ IRR = 'IRR',
|
|
|
+ /** Icelandic króna */
|
|
|
+ ISK = 'ISK',
|
|
|
+ /** Jamaican dollar */
|
|
|
+ JMD = 'JMD',
|
|
|
+ /** Jordanian dinar */
|
|
|
+ JOD = 'JOD',
|
|
|
+ /** Japanese yen */
|
|
|
+ JPY = 'JPY',
|
|
|
+ /** Kenyan shilling */
|
|
|
+ KES = 'KES',
|
|
|
+ /** Kyrgyzstani som */
|
|
|
+ KGS = 'KGS',
|
|
|
+ /** Cambodian riel */
|
|
|
+ KHR = 'KHR',
|
|
|
+ /** Comoro franc */
|
|
|
+ KMF = 'KMF',
|
|
|
+ /** North Korean won */
|
|
|
+ KPW = 'KPW',
|
|
|
+ /** South Korean won */
|
|
|
+ KRW = 'KRW',
|
|
|
+ /** Kuwaiti dinar */
|
|
|
+ KWD = 'KWD',
|
|
|
+ /** Cayman Islands dollar */
|
|
|
+ KYD = 'KYD',
|
|
|
+ /** Kazakhstani tenge */
|
|
|
+ KZT = 'KZT',
|
|
|
+ /** Lao kip */
|
|
|
+ LAK = 'LAK',
|
|
|
+ /** Lebanese pound */
|
|
|
+ LBP = 'LBP',
|
|
|
+ /** Sri Lankan rupee */
|
|
|
+ LKR = 'LKR',
|
|
|
+ /** Liberian dollar */
|
|
|
+ LRD = 'LRD',
|
|
|
+ /** Lesotho loti */
|
|
|
+ LSL = 'LSL',
|
|
|
+ /** Libyan dinar */
|
|
|
+ LYD = 'LYD',
|
|
|
+ /** Moroccan dirham */
|
|
|
+ MAD = 'MAD',
|
|
|
+ /** Moldovan leu */
|
|
|
+ MDL = 'MDL',
|
|
|
+ /** Malagasy ariary */
|
|
|
+ MGA = 'MGA',
|
|
|
+ /** Macedonian denar */
|
|
|
+ MKD = 'MKD',
|
|
|
+ /** Myanmar kyat */
|
|
|
+ MMK = 'MMK',
|
|
|
+ /** Mongolian tögrög */
|
|
|
+ MNT = 'MNT',
|
|
|
+ /** Macanese pataca */
|
|
|
+ MOP = 'MOP',
|
|
|
+ /** Mauritanian ouguiya */
|
|
|
+ MRU = 'MRU',
|
|
|
+ /** Mauritian rupee */
|
|
|
+ MUR = 'MUR',
|
|
|
+ /** Maldivian rufiyaa */
|
|
|
+ MVR = 'MVR',
|
|
|
+ /** Malawian kwacha */
|
|
|
+ MWK = 'MWK',
|
|
|
+ /** Mexican peso */
|
|
|
+ MXN = 'MXN',
|
|
|
+ /** Malaysian ringgit */
|
|
|
+ MYR = 'MYR',
|
|
|
+ /** Mozambican metical */
|
|
|
+ MZN = 'MZN',
|
|
|
+ /** Namibian dollar */
|
|
|
+ NAD = 'NAD',
|
|
|
+ /** Nigerian naira */
|
|
|
+ NGN = 'NGN',
|
|
|
+ /** Nicaraguan córdoba */
|
|
|
+ NIO = 'NIO',
|
|
|
+ /** Norwegian krone */
|
|
|
+ NOK = 'NOK',
|
|
|
+ /** Nepalese rupee */
|
|
|
+ NPR = 'NPR',
|
|
|
+ /** New Zealand dollar */
|
|
|
+ NZD = 'NZD',
|
|
|
+ /** Omani rial */
|
|
|
+ OMR = 'OMR',
|
|
|
+ /** Panamanian balboa */
|
|
|
+ PAB = 'PAB',
|
|
|
+ /** Peruvian sol */
|
|
|
+ PEN = 'PEN',
|
|
|
+ /** Papua New Guinean kina */
|
|
|
+ PGK = 'PGK',
|
|
|
+ /** Philippine peso */
|
|
|
+ PHP = 'PHP',
|
|
|
+ /** Pakistani rupee */
|
|
|
+ PKR = 'PKR',
|
|
|
+ /** Polish złoty */
|
|
|
+ PLN = 'PLN',
|
|
|
+ /** Paraguayan guaraní */
|
|
|
+ PYG = 'PYG',
|
|
|
+ /** Qatari riyal */
|
|
|
+ QAR = 'QAR',
|
|
|
+ /** Romanian leu */
|
|
|
+ RON = 'RON',
|
|
|
+ /** Serbian dinar */
|
|
|
+ RSD = 'RSD',
|
|
|
+ /** Russian ruble */
|
|
|
+ RUB = 'RUB',
|
|
|
+ /** Rwandan franc */
|
|
|
+ RWF = 'RWF',
|
|
|
+ /** Saudi riyal */
|
|
|
+ SAR = 'SAR',
|
|
|
+ /** Solomon Islands dollar */
|
|
|
+ SBD = 'SBD',
|
|
|
+ /** Seychelles rupee */
|
|
|
+ SCR = 'SCR',
|
|
|
+ /** Sudanese pound */
|
|
|
+ SDG = 'SDG',
|
|
|
+ /** Swedish krona/kronor */
|
|
|
+ SEK = 'SEK',
|
|
|
+ /** Singapore dollar */
|
|
|
+ SGD = 'SGD',
|
|
|
+ /** Saint Helena pound */
|
|
|
+ SHP = 'SHP',
|
|
|
+ /** Sierra Leonean leone */
|
|
|
+ SLL = 'SLL',
|
|
|
+ /** Somali shilling */
|
|
|
+ SOS = 'SOS',
|
|
|
+ /** Surinamese dollar */
|
|
|
+ SRD = 'SRD',
|
|
|
+ /** South Sudanese pound */
|
|
|
+ SSP = 'SSP',
|
|
|
+ /** São Tomé and Príncipe dobra */
|
|
|
+ STN = 'STN',
|
|
|
+ /** Salvadoran colón */
|
|
|
+ SVC = 'SVC',
|
|
|
+ /** Syrian pound */
|
|
|
+ SYP = 'SYP',
|
|
|
+ /** Swazi lilangeni */
|
|
|
+ SZL = 'SZL',
|
|
|
+ /** Thai baht */
|
|
|
+ THB = 'THB',
|
|
|
+ /** Tajikistani somoni */
|
|
|
+ TJS = 'TJS',
|
|
|
+ /** Turkmenistan manat */
|
|
|
+ TMT = 'TMT',
|
|
|
+ /** Tunisian dinar */
|
|
|
+ TND = 'TND',
|
|
|
+ /** Tongan paʻanga */
|
|
|
+ TOP = 'TOP',
|
|
|
+ /** Turkish lira */
|
|
|
+ TRY = 'TRY',
|
|
|
+ /** Trinidad and Tobago dollar */
|
|
|
+ TTD = 'TTD',
|
|
|
+ /** New Taiwan dollar */
|
|
|
+ TWD = 'TWD',
|
|
|
+ /** Tanzanian shilling */
|
|
|
+ TZS = 'TZS',
|
|
|
+ /** Ukrainian hryvnia */
|
|
|
+ UAH = 'UAH',
|
|
|
+ /** Ugandan shilling */
|
|
|
+ UGX = 'UGX',
|
|
|
+ /** United States dollar */
|
|
|
+ USD = 'USD',
|
|
|
+ /** Uruguayan peso */
|
|
|
+ UYU = 'UYU',
|
|
|
+ /** Uzbekistan som */
|
|
|
+ UZS = 'UZS',
|
|
|
+ /** Venezuelan bolívar soberano */
|
|
|
+ VES = 'VES',
|
|
|
+ /** Vietnamese đồng */
|
|
|
+ VND = 'VND',
|
|
|
+ /** Vanuatu vatu */
|
|
|
+ VUV = 'VUV',
|
|
|
+ /** Samoan tala */
|
|
|
+ WST = 'WST',
|
|
|
+ /** CFA franc BEAC */
|
|
|
+ XAF = 'XAF',
|
|
|
+ /** East Caribbean dollar */
|
|
|
+ XCD = 'XCD',
|
|
|
+ /** CFA franc BCEAO */
|
|
|
+ XOF = 'XOF',
|
|
|
+ /** CFP franc (franc Pacifique) */
|
|
|
+ XPF = 'XPF',
|
|
|
+ /** Yemeni rial */
|
|
|
+ YER = 'YER',
|
|
|
+ /** South African rand */
|
|
|
+ ZAR = 'ZAR',
|
|
|
+ /** Zambian kwacha */
|
|
|
+ ZMW = 'ZMW',
|
|
|
+ /** Zimbabwean dollar */
|
|
|
+ ZWL = 'ZWL',
|
|
|
+}
|
|
|
+
|
|
|
+export function LanguageDialog() {
|
|
|
+ const { availableLocales, availableLanguages } = uiConfig;
|
|
|
+ const { settings, setDisplayLanguage, setDisplayLocale } = useUserSettings();
|
|
|
+ const availableCurrencyCodes = Object.values(CurrencyCode);
|
|
|
+
|
|
|
+ return (
|
|
|
+ <DialogContent>
|
|
|
+ <DialogHeader>
|
|
|
+ <DialogTitle>
|
|
|
+ <Trans>Select display language</Trans>
|
|
|
+ </DialogTitle>
|
|
|
+ </DialogHeader>
|
|
|
+ <div className="grid grid-cols-2 gap-6">
|
|
|
+ <div className="space-y-1 w-full">
|
|
|
+ <Label>
|
|
|
+ <Trans>Display language</Trans>
|
|
|
+ </Label>
|
|
|
+ <Select defaultValue={settings.displayLanguage} onValueChange={setDisplayLanguage}>
|
|
|
+ <SelectTrigger className="w-full">
|
|
|
+ <SelectValue placeholder="Select a language" />
|
|
|
+ </SelectTrigger>
|
|
|
+ <SelectContent>
|
|
|
+ {availableLanguages.map(language => (
|
|
|
+ <SelectItem key={language} value={language}>
|
|
|
+ {/* TODO: Translate with global helper function */}
|
|
|
+ Language {language}
|
|
|
+ </SelectItem>
|
|
|
+ ))}
|
|
|
+ </SelectContent>
|
|
|
+ </Select>
|
|
|
+ </div>
|
|
|
+ <div className="space-y-1">
|
|
|
+ <Label>
|
|
|
+ <Trans>Locale</Trans>
|
|
|
+ </Label>
|
|
|
+ <Select defaultValue={settings.displayLocale} onValueChange={setDisplayLocale}>
|
|
|
+ <SelectTrigger className="w-full">
|
|
|
+ <SelectValue placeholder="Select a locale" />
|
|
|
+ </SelectTrigger>
|
|
|
+ <SelectContent>
|
|
|
+ {availableLocales.map(locale => (
|
|
|
+ <SelectItem key={locale} value={locale}>
|
|
|
+ {/* TODO: Translate with global helper function */}
|
|
|
+ Locale {locale}
|
|
|
+ </SelectItem>
|
|
|
+ ))}
|
|
|
+ </SelectContent>
|
|
|
+ </Select>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="bg-sidebar border border-border rounded-md px-6 py-4 space-y-4">
|
|
|
+ <span className="font-medium block text-accent-foreground">
|
|
|
+ <Trans>Sample Formatting</Trans>: {settings.displayLocale} {settings.displayLanguage}
|
|
|
+ </span>
|
|
|
+ <Select>
|
|
|
+ <SelectTrigger>
|
|
|
+ <SelectValue placeholder="Select a currency" />
|
|
|
+ </SelectTrigger>
|
|
|
+ <SelectContent>
|
|
|
+ {availableCurrencyCodes.map(currency => (
|
|
|
+ <SelectItem key={currency} value={currency}>
|
|
|
+ {/* TODO: Translate with global helper function */}
|
|
|
+ {currency}
|
|
|
+ </SelectItem>
|
|
|
+ ))}
|
|
|
+ </SelectContent>
|
|
|
+ </Select>
|
|
|
+ <div className="flex flex-col">
|
|
|
+ <span className="text-muted-foreground text-sm font-medium">Medium date</span>
|
|
|
+ {/* TODO: Format date with global helper function */}
|
|
|
+ <span>2025-03-14</span>
|
|
|
+ </div>
|
|
|
+ <div className="flex flex-col">
|
|
|
+ <span className="text-muted-foreground text-sm font-medium">Short date</span>
|
|
|
+ {/* TODO: Format date with global helper function */}
|
|
|
+ <span>2025-03-14</span>
|
|
|
+ </div>
|
|
|
+ <div className="flex flex-col">
|
|
|
+ <span className="text-muted-foreground text-sm font-medium">Price</span>
|
|
|
+ {/* TODO: Format price with global helper function */}
|
|
|
+ <span>100.00</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <DialogFooter>
|
|
|
+ <DialogClose asChild>
|
|
|
+ <Button>Close</Button>
|
|
|
+ </DialogClose>
|
|
|
+ </DialogFooter>
|
|
|
+ </DialogContent>
|
|
|
+ );
|
|
|
+}
|