aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBen Woodward <ben@bdw.to>2026-01-24 20:46:24 -0800
committerGitHub <noreply@github.com>2026-01-24 20:46:24 -0800
commite1927f633cab988ceeb8bcd51dd03aaa5b3f2392 (patch)
treea776d7287d2c9583151f2567d9cf4f22d010aeed /src
parentfbde2cd27669ac29e1c0bc9393f9a83ffa93f8c6 (diff)
Updates jan 2026 (#313)
* Update dependencies to latest versions and migrate to React 19 - Update all dependencies to latest versions - Migrate to React 19 createRoot API (replaces deprecated ReactDOM.render) - Update qrcode.react import to v4 named export (QRCodeSVG) * Format CSS with prettier * Add Hebrew translation * Add Slovak translation * Add Malagasy translation * Add Bangla translation * Init field * Change the logic concerning number of cards to print * fix/clean * Fix Increment-field-ID-in-the-print-area * Increment-field-ID-in-the-print-area * Review id implementation logic * Fix git commit * Handle Query parameter * Fix package.json * Fix query parameter for language * fix query parameter for language * Fix EncryptionModeChange query parameters // Error when non in query * Fix EncryptionModeChange query parameters // Error when empty in query * clean Setting.js don't need to import i18n * clean file App.js * first iteration for Hash * Add Esperanto translation * Update translations for Occitan 2 lines added * Update translations.js Added Swiss German to the Translations JavaScript-File * Update translations.js Removed custom Translations-Strings of my own Version. * Update README.md * Format translations.js with prettier --------- Co-authored-by: Ido Bronfeld <idobronfeld@gmail.com> Co-authored-by: Matej Kubinec <matej.kubinec@outlook.com> Co-authored-by: mpilasy <88362233+mpilasy@users.noreply.github.com> Co-authored-by: Tarek Hasan <94107336+Tarek-Hasan@users.noreply.github.com> Co-authored-by: ofostier <ofostier@gmail.com> Co-authored-by: zeecho <30541894+zeecho@users.noreply.github.com> Co-authored-by: Mejans <61360811+Mejans@users.noreply.github.com> Co-authored-by: Jan Zehnder <44242812+NZehnder@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r--src/App.js115
-rw-r--r--src/components/Settings.js1
-rw-r--r--src/components/WifiCard.js13
-rw-r--r--src/components/style.css7
-rw-r--r--src/components/useHashParam.js48
-rw-r--r--src/index.js8
-rw-r--r--src/translations.js259
7 files changed, 410 insertions, 41 deletions
diff --git a/src/App.js b/src/App.js
index 6eb712a..94a3e97 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,38 +1,105 @@
1import { Button, Heading, Link, Pane, Paragraph } from 'evergreen-ui'; 1import { Button, Heading, Link, Pane, Paragraph } from 'evergreen-ui';
2import React, { useEffect, useRef, useState } from 'react'; 2import React, { useEffect, useRef, useState, useCallback } from 'react';
3import { useTranslation } from 'react-i18next'; 3import { useTranslation } from 'react-i18next';
4import logo from '../src/images/wifi.png'; 4import logo from '../src/images/wifi.png';
5import { Settings } from './components/Settings'; 5import { Settings } from './components/Settings';
6import { WifiCard } from './components/WifiCard'; 6import { WifiCard } from './components/WifiCard';
7import './style.css'; 7import './style.css';
8import { Translations } from './translations'; 8import { Translations } from './translations';
9import useHashParam from './components/useHashParam';
9 10
10function App() { 11function App() {
12 const getHashSearchParams = (location) => {
13 const hash = location.hash.slice(1);
14 const [prefix, query] = hash.split('?');
15
16 return [prefix, new URLSearchParams(query)];
17 };
18 const getHashParam = (key, location = window.location) => {
19 const [_, searchParams] = getHashSearchParams(location);
20 return searchParams.get(key);
21 };
22 const setHashParam = (key, value, location = window.location) => {
23 const [prefix, searchParams] = getHashSearchParams(location);
24
25 if (typeof value === 'undefined') {
26 searchParams.delete(key);
27 } else {
28 searchParams.set(key, value);
29 }
30
31 const search = searchParams.toString();
32 location.hash = search ? `${prefix}?${search}` : prefix;
33 };
34
35 let pssid = getHashParam('ssid'); //params.get('ssid') || '';
36 let ppassword = getHashParam('password') || '';
37 let pencryptionMode =
38 getHashParam('encryptionMode') !== null
39 ? getHashParam('encryptionMode')
40 : 'WPA';
41 let peapMethod = getHashParam('eapMethod') || 'PWD';
42 let peapIdentity = getHashParam('eapIdentity') || '';
43 let phidePassword =
44 getHashParam('hidePassword') === null
45 ? false
46 : getHashParam('hidePassword').toLowerCase() === 'true'
47 ? true
48 : false;
49 let phiddenSSID =
50 getHashParam('hiddenSSID') === null
51 ? false
52 : getHashParam('hiddenSSID').toLowerCase() === 'true'
53 ? true
54 : false;
55 let pportrait =
56 getHashParam('portrait') === null
57 ? false
58 : getHashParam('portrait').toLowerCase() === 'true'
59 ? true
60 : false || false;
61 let padditionalCards = getHashParam('additionalCards') || 1;
62 let phideTip =
63 getHashParam('hideTip') === null
64 ? false
65 : getHashParam('hideTip').toLowerCase() === 'true'
66 ? true
67 : false;
68 let planguage =
69 getHashParam('lng') === null || getHashParam('lng').toLowerCase() === ''
70 ? 'en-US'
71 : getHashParam('lng');
72
73 // ########################
11 const html = document.querySelector('html'); 74 const html = document.querySelector('html');
75
12 const { t, i18n } = useTranslation(); 76 const { t, i18n } = useTranslation();
13 const firstLoad = useRef(true); 77 const firstLoad = useRef(true);
14 const [settings, setSettings] = useState({ 78 const [settings, setSettings] = useState({
15 // Network SSID name 79 // Network SSID name
16 ssid: '', 80 ssid: pssid,
17 // Network password 81 // Network password
18 password: '', 82 password: ppassword,
19 // Settings: Network encryption mode 83 // Settings: Network encryption mode
20 encryptionMode: 'WPA', 84 encryptionMode: pencryptionMode,
21 // Settings: EAP Method 85 // Settings: EAP Method
22 eapMethod: 'PWD', 86 eapMethod: peapMethod,
23 // Settings: EAP identity 87 // Settings: EAP identity
24 eapIdentity: '', 88 eapIdentity: peapIdentity,
25 // Settings: Hide password on the printed card 89 // Settings: Hide password on the printed card
26 hidePassword: false, 90 hidePassword: phidePassword,
27 // Settings: Mark your network as hidden SSID 91 // Settings: Mark your network as hidden SSID
28 hiddenSSID: false, 92 hiddenSSID: phiddenSSID,
29 // Settings: Portrait orientation 93 // Settings: Portrait orientation
30 portrait: false, 94 portrait: pportrait,
31 // Settings: Additional cards 95 // Settings: Additional cards
32 additionalCards: 0, 96 additionalCards: padditionalCards,
33 // Settings: Show tip (legend) on card 97 // Settings: Show tip (legend) on card
34 hideTip: false, 98 hideTip: phideTip,
99 // Display language
100 lng: planguage,
35 }); 101 });
102
36 const [errors, setErrors] = useState({ 103 const [errors, setErrors] = useState({
37 ssidError: '', 104 ssidError: '',
38 passwordError: '', 105 passwordError: '',
@@ -48,6 +115,8 @@ function App() {
48 const onChangeLanguage = (language) => { 115 const onChangeLanguage = (language) => {
49 html.style.direction = htmlDirection(language); 116 html.style.direction = htmlDirection(language);
50 i18n.changeLanguage(language); 117 i18n.changeLanguage(language);
118
119 setSettings({ ...settings, lng: language });
51 }; 120 };
52 121
53 const onPrint = () => { 122 const onPrint = () => {
@@ -126,7 +195,7 @@ function App() {
126 }; 195 };
127 const onAdditionalCardsChange = (additionalCardsStr) => { 196 const onAdditionalCardsChange = (additionalCardsStr) => {
128 const amount = parseInt(additionalCardsStr); 197 const amount = parseInt(additionalCardsStr);
129 amount >= 0 && setSettings({ ...settings, additionalCards: amount }); 198 amount >= 1 && setSettings({ ...settings, additionalCards: amount });
130 }; 199 };
131 const onHideTipChange = (hideTip) => { 200 const onHideTipChange = (hideTip) => {
132 setSettings({ ...settings, hideTip }); 201 setSettings({ ...settings, hideTip });
@@ -136,22 +205,34 @@ function App() {
136 firstLoad.current = false; 205 firstLoad.current = false;
137 }; 206 };
138 207
208 const generateUrl = () => {
209 Object.entries(settings).map(([key, value]) => {
210 //console.log(key+" = " + value)
211 setHashParam(key, value);
212 if (key === 'ssid') setName(value);
213 return true;
214 });
215 };
216 const [name, setName] = useHashParam('name');
217
139 useEffect(() => { 218 useEffect(() => {
140 // Ensure the page direction is set properly on first load 219 // Ensure the page direction is set properly on first load
141 if (htmlDirection() === 'rtl') { 220 if (htmlDirection() === 'rtl') {
142 html.style.direction = 'rtl'; 221 html.style.direction = 'rtl';
143 } 222 }
223 generateUrl();
144 }); 224 });
145 225
146 return ( 226 return (
147 <Pane> 227 <Pane>
228 Hello{' '}
229 {name ? name + '! You name is stored in hash params #️⃣' : 'visitor!'}
148 <Pane display="flex"> 230 <Pane display="flex">
149 <img alt="icon" src={logo} width="32" height="32" /> 231 <img alt="icon" src={logo} width="32" height="32" />
150 <Heading size={900} paddingRight={16} paddingLeft={16}> 232 <Heading size={900} paddingRight={16} paddingLeft={16}>
151 {t('title')} 233 {t('title')}
152 </Heading> 234 </Heading>
153 </Pane> 235 </Pane>
154
155 <Pane> 236 <Pane>
156 <Paragraph marginTop={12}>{t('desc.use')}</Paragraph> 237 <Paragraph marginTop={12}>{t('desc.use')}</Paragraph>
157 238
@@ -163,7 +244,6 @@ function App() {
163 . 244 .
164 </Paragraph> 245 </Paragraph>
165 </Pane> 246 </Pane>
166
167 <Pane> 247 <Pane>
168 <WifiCard 248 <WifiCard
169 settings={settings} 249 settings={settings}
@@ -175,7 +255,6 @@ function App() {
175 onPasswordChange={onPasswordChange} 255 onPasswordChange={onPasswordChange}
176 /> 256 />
177 </Pane> 257 </Pane>
178
179 <Settings 258 <Settings
180 settings={settings} 259 settings={settings}
181 firstLoad={firstLoad} 260 firstLoad={firstLoad}
@@ -189,7 +268,6 @@ function App() {
189 onAdditionalCardsChange={onAdditionalCardsChange} 268 onAdditionalCardsChange={onAdditionalCardsChange}
190 onHideTipChange={onHideTipChange} 269 onHideTipChange={onHideTipChange}
191 /> 270 />
192
193 <Button 271 <Button
194 id="print" 272 id="print"
195 appearance="primary" 273 appearance="primary"
@@ -200,9 +278,10 @@ function App() {
200 {t('button.print')} 278 {t('button.print')}
201 </Button> 279 </Button>
202 <Pane id="print-area"> 280 <Pane id="print-area">
203 {settings.additionalCards >= 0 && 281 {settings.additionalCards >= 1 &&
204 [...Array(settings.additionalCards + 1)].map((el, idx) => ( 282 [...Array(settings.additionalCards)].map((el, idx) => (
205 <WifiCard 283 <WifiCard
284 keyid={idx}
206 key={`card-nr-${idx}`} 285 key={`card-nr-${idx}`}
207 settings={settings} 286 settings={settings}
208 ssidError={errors.ssidError} 287 ssidError={errors.ssidError}
diff --git a/src/components/Settings.js b/src/components/Settings.js
index 837b4f0..0485aaf 100644
--- a/src/components/Settings.js
+++ b/src/components/Settings.js
@@ -20,6 +20,7 @@ export const Settings = (props) => {
20 { label: 'WEP', value: 'WEP' }, 20 { label: 'WEP', value: 'WEP' },
21 ]; 21 ];
22 const eapMethods = [{ label: 'PWD', value: 'PWD' }]; 22 const eapMethods = [{ label: 'PWD', value: 'PWD' }];
23
23 const langSelectDefaultValue = () => { 24 const langSelectDefaultValue = () => {
24 const t = Translations.filter((t) => t.id === i18n.language); 25 const t = Translations.filter((t) => t.id === i18n.language);
25 if (t.length !== 1) { 26 if (t.length !== 1) {
diff --git a/src/components/WifiCard.js b/src/components/WifiCard.js
index 70e1189..e977ac8 100644
--- a/src/components/WifiCard.js
+++ b/src/components/WifiCard.js
@@ -8,7 +8,7 @@ import {
8 Text, 8 Text,
9 TextareaField, 9 TextareaField,
10} from 'evergreen-ui'; 10} from 'evergreen-ui';
11import QRCode from 'qrcode.react'; 11import { QRCodeSVG as QRCode } from 'qrcode.react';
12import { useEffect, useState } from 'react'; 12import { useEffect, useState } from 'react';
13import { useTranslation } from 'react-i18next'; 13import { useTranslation } from 'react-i18next';
14import logo from '../../src/images/wifi.png'; 14import logo from '../../src/images/wifi.png';
@@ -71,6 +71,9 @@ export const WifiCard = (props) => {
71 return !eapIdentityFieldLabel() ? '' : t('wifi.encryption.eapMethod'); 71 return !eapIdentityFieldLabel() ? '' : t('wifi.encryption.eapMethod');
72 }; 72 };
73 73
74 const keyid = props.keyid || '';
75 const suffixKeyID = (prefix) => `${prefix}-${keyid}`;
76
74 return ( 77 return (
75 <Card 78 <Card
76 className="card-print" 79 className="card-print"
@@ -102,7 +105,7 @@ export const WifiCard = (props) => {
102 105
103 <Pane width={'100%'}> 106 <Pane width={'100%'}>
104 <TextareaField 107 <TextareaField
105 id="ssid" 108 id={suffixKeyID('ssid')}
106 type="text" 109 type="text"
107 marginBottom={5} 110 marginBottom={5}
108 autoComplete="off" 111 autoComplete="off"
@@ -120,7 +123,7 @@ export const WifiCard = (props) => {
120 {props.settings.encryptionMode === 'WPA2-EAP' && ( 123 {props.settings.encryptionMode === 'WPA2-EAP' && (
121 <> 124 <>
122 <TextareaField 125 <TextareaField
123 id="eapmethod" 126 id={suffixKeyID('eapmethod')}
124 type="text" 127 type="text"
125 marginBottom={5} 128 marginBottom={5}
126 readOnly={true} 129 readOnly={true}
@@ -130,7 +133,7 @@ export const WifiCard = (props) => {
130 /> 133 />
131 134
132 <TextareaField 135 <TextareaField
133 id="identity" 136 id={suffixKeyID('identity')}
134 type="text" 137 type="text"
135 marginBottom={5} 138 marginBottom={5}
136 autoComplete="off" 139 autoComplete="off"
@@ -150,7 +153,7 @@ export const WifiCard = (props) => {
150 )} 153 )}
151 {!(props.settings.hidePassword || !props.settings.encryptionMode) && ( 154 {!(props.settings.hidePassword || !props.settings.encryptionMode) && (
152 <TextareaField 155 <TextareaField
153 id="password" 156 id={suffixKeyID('password')}
154 type="text" 157 type="text"
155 maxLength="63" 158 maxLength="63"
156 autoComplete="off" 159 autoComplete="off"
diff --git a/src/components/style.css b/src/components/style.css
index 10eac9b..87ba63a 100644
--- a/src/components/style.css
+++ b/src/components/style.css
@@ -67,6 +67,13 @@ button {
67 #print-area, 67 #print-area,
68 #print-area * { 68 #print-area * {
69 visibility: visible; 69 visibility: visible;
70 /* For printing, use a font stack that prioritizes system fonts
71 to ensure CJK characters are rendered correctly in Chrome. */
72 font-family:
73 'PingFang SC', 'Noto Sans SC', 'Noto Sans TC', 'Noto Sans JP',
74 'Noto Sans KR', 'Microsoft YaHei', serif;
75 font-weight: 500;
76 font-style: semibold;
70 } 77 }
71 #print-area { 78 #print-area {
72 position: absolute; 79 position: absolute;
diff --git a/src/components/useHashParam.js b/src/components/useHashParam.js
new file mode 100644
index 0000000..e43e1e4
--- /dev/null
+++ b/src/components/useHashParam.js
@@ -0,0 +1,48 @@
1import { useState, useEffect, useCallback } from 'react';
2
3const getHashSearchParams = (location) => {
4 const hash = location.hash.slice(1);
5 const [prefix, query] = hash.split('?');
6
7 return [prefix, new URLSearchParams(query)];
8};
9
10const getHashParam = (key, location = window.location) => {
11 const [_, searchParams] = getHashSearchParams(location);
12 return searchParams.get(key);
13};
14
15const setHashParam = (key, value, location = window.location) => {
16 const [prefix, searchParams] = getHashSearchParams(location);
17
18 if (typeof value === 'undefined') {
19 searchParams.delete(key);
20 } else {
21 searchParams.set(key, value);
22 }
23
24 const search = searchParams.toString();
25 location.hash = search ? `${prefix}?${search}` : prefix;
26};
27
28const useHashParam = (key) => {
29 const [innerValue, setInnerValue] = useState();
30
31 useEffect(() => {
32 const handleHashChange = () => setInnerValue(getHashParam(key));
33 handleHashChange();
34 window.addEventListener('hashchange', handleHashChange);
35 return () => window.removeEventListener('hashchange', handleHashChange);
36 }, [key]);
37
38 const setValue = useCallback(
39 (value) => {
40 setHashParam(key, value);
41 },
42 [key]
43 );
44
45 return [innerValue, setValue];
46};
47
48export default useHashParam;
diff --git a/src/index.js b/src/index.js
index 30091ec..07ea073 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,11 +1,11 @@
1import React from 'react'; 1import React from 'react';
2import ReactDOM from 'react-dom'; 2import { createRoot } from 'react-dom/client';
3import App from './App'; 3import App from './App';
4import './i18n'; 4import './i18n';
5 5
6ReactDOM.render( 6const root = createRoot(document.getElementById('root'));
7root.render(
7 <React.StrictMode> 8 <React.StrictMode>
8 <App /> 9 <App />
9 </React.StrictMode>, 10 </React.StrictMode>
10 document.getElementById('root')
11); 11);
diff --git a/src/translations.js b/src/translations.js
index 479afc3..2f033c1 100644
--- a/src/translations.js
+++ b/src/translations.js
@@ -14,7 +14,7 @@ export const Translations = [
14 'wifi.login': 'WiFi Login', 14 'wifi.login': 'WiFi Login',
15 'wifi.name': 'Network name', 15 'wifi.name': 'Network name',
16 'wifi.name.hiddenSSID': 'Hidden SSID', 16 'wifi.name.hiddenSSID': 'Hidden SSID',
17 'cards.additional': 'Additional cards to print', 17 'cards.additional': 'Number of cards to print',
18 'cards.tip.hide': 'Hide tip (legend)', 18 'cards.tip.hide': 'Hide tip (legend)',
19 'wifi.name.placeholder': 'WiFi Network name', 19 'wifi.name.placeholder': 'WiFi Network name',
20 'wifi.password': 'Password', 20 'wifi.password': 'Password',
@@ -38,6 +38,44 @@ export const Translations = [
38 }, 38 },
39 }, 39 },
40 { 40 {
41 id: 'he-IL',
42 name: 'Hebrew - עברית',
43 rtl: true,
44 translation: {
45 title: 'כרטיס WiFi',
46 'desc.use':
47 'הדפיסו כרטיס פשוט עם פרטי הכניסה שלכם לרשת ה-WiFi. הדביקו אותו למקרר, שמרו אותו בארנק וכו.',
48 'desc.privacy':
49 'פרטי ה WiFi שלכם לעולם לא נשלחים לשרת. אתר זה אינו עוקב, משתמש באנליטיקות או טביעות אצבע. צפה ב',
50 'desc.source': 'קוד המקור',
51 'wifi.identity': 'זהות',
52 'wifi.identity.placeholder': 'שם משתמש',
53 'wifi.login': 'פרטי WiFi',
54 'wifi.name': 'שם רשת',
55 'wifi.name.hiddenSSID': 'רשת נסתרת (SSID)',
56 'cards.additional': 'מספר כרטיסים נוספים להדפסה',
57 'cards.tip.hide': 'הסתרת טיפ (מקרא)',
58 'wifi.name.placeholder': 'שם רשת WiFi',
59 'wifi.password': 'סיסמה',
60 'wifi.password.placeholder': 'סיסמה',
61 'wifi.password.hide': 'הסתר סיסמה',
62 'wifi.password.encryption': 'הצפנה',
63 'wifi.password.encryption.none': 'None',
64 'wifi.encryption.eapMethod': 'שיטת אימות EAP',
65 'wifi.tip': 'כוונו את מצלמת הטלפון אל קוד ה-QR כדי להתחבר אוטומטית',
66 'wifi.alert.name': 'שם רשת לא יכול להיות ריק',
67 'wifi.alert.password': 'סיסמה לא יכולה להיות ריקה',
68 'wifi.alert.password.length.5':
69 'הסיסמה חייבת להיות באורך של לפחות 5 תווים, או שנה את ההצפנה ל "None"',
70 'wifi.alert.password.length.8':
71 'הסיסמה חייבת להיות באורך של לפחות 8 תווים, או שנה את ההצפנה ל "None"',
72 'wifi.alert.eapIdentity': 'זהות לא יכולה להיות ריקה',
73 'button.rotate': 'סובב',
74 'button.print': 'הדפס',
75 select: 'בחר שפה',
76 },
77 },
78 {
41 id: 'sv-SE', 79 id: 'sv-SE',
42 name: 'Swedish - Svenska', 80 name: 'Swedish - Svenska',
43 translation: { 81 translation: {
@@ -134,12 +172,14 @@ export const Translations = [
134 id: 'zh-CN', 172 id: 'zh-CN',
135 name: 'Simplified Chinese - 简体中文', 173 name: 'Simplified Chinese - 简体中文',
136 translation: { 174 translation: {
137 title: 'WiFi 连接卡', 175 title: 'Wi-Fi 连接卡',
138 'desc.use': 176 'desc.use':
139 '打印一张带有 WiFi 详细信息的登录卡片,把它贴到冰箱上、放到你的钱包里...', 177 '打印一张带有 Wi-Fi 详细信息的登录卡片,把它贴到冰箱上、放到你的钱包里...',
140 'desc.privacy': 178 'desc.privacy':
141 '您的 WiFi 信息永远不会发送到服务端。本网站不使用追踪、分析或指纹识别。查看', 179 '您的 WiFi 信息永远不会发送到服务端。本网站不使用追踪、分析或指纹识别。查看',
142 'desc.source': '源码', 180 'desc.source': '源码',
181 'cards.additional': '额外打印卡片数量',
182 'cards.tip.hide': '隐藏提示(图例)',
143 'wifi.identity': '身份', 183 'wifi.identity': '身份',
144 'wifi.identity.placeholder': '用户名', 184 'wifi.identity.placeholder': '用户名',
145 'wifi.login': '连接 WiFi', 185 'wifi.login': '连接 WiFi',
@@ -167,16 +207,18 @@ export const Translations = [
167 id: 'zh-HK', 207 id: 'zh-HK',
168 name: 'Traditional Chinese - 繁體中文 香港', 208 name: 'Traditional Chinese - 繁體中文 香港',
169 translation: { 209 translation: {
170 title: 'WiFi 連接', 210 title: 'Wi-Fi 連接',
171 'desc.use': 211 'desc.use':
172 '打印一張 WiFi 詳細資料嘅連接卡,將佢癡喺雪櫃上面、放喺銀包入面... ', 212 '打印一張 Wi-Fi 詳細資料嘅連接卡,佢癡喺雪櫃上面、放喺銀包入面... ',
173 'desc.privacy': 213 'desc.privacy':
174 '你嘅 WiFi 資料永遠唔會傳送去網站伺服器。呢個網站無使用任何追蹤、分析或者裝置指紋辨識。睇吓', 214 '你嘅 Wi-Fi 資料永遠唔會傳送去網站伺服器。呢個網站唔會使用任何追蹤、分析或者裝置指紋辨識。',
175 'desc.source': '源代碼', 215 'desc.source': '撳呢度睇源代碼',
176 'wifi.login': '連接 WiFi', 216 'cards.additional': '要打印幾多張 Wi-Fi 卡片?',
217 'cards.tip.hide': '隱藏提示(圖例)',
218 'wifi.login': '連接 Wi-Fi',
177 'wifi.name': '網絡名稱', 219 'wifi.name': '網絡名稱',
178 'wifi.name.hiddenSSID': '隐藏 SSID', 220 'wifi.name.hiddenSSID': '隐藏 SSID',
179 'wifi.name.placeholder': 'WiFi 網絡名稱', 221 'wifi.name.placeholder': 'Wi-Fi 網絡名稱',
180 'wifi.password': '密碼', 222 'wifi.password': '密碼',
181 'wifi.password.placeholder': '密碼', 223 'wifi.password.placeholder': '密碼',
182 'wifi.password.hide': '隐藏密码', 224 'wifi.password.hide': '隐藏密码',
@@ -201,8 +243,10 @@ export const Translations = [
201 'desc.use': 243 'desc.use':
202 '打印一张带有 Wi-Fi 详细信息嘅连接咭,你可以将佢黐喺冰箱上面,或者放喺银包入面...', 244 '打印一张带有 Wi-Fi 详细信息嘅连接咭,你可以将佢黐喺冰箱上面,或者放喺银包入面...',
203 'desc.privacy': 245 'desc.privacy':
204 '你嘅 Wi-Fi 信息永远不会发送到服务端。本网站不使用追踪、分析或指纹识别。喺度睇', 246 '你嘅 Wi-Fi 信息永远不会发送到服务端。本网站不使用追踪、分析或指纹识别。',
205 'desc.source': '源代码', 247 'desc.source': '喺度睇源代码',
248 'cards.additional': '要*多打印*多少张 Wi-Fi 卡片?',
249 'cards.tip.hide': '隐藏提示(图例)',
206 'wifi.identity': '身份', 250 'wifi.identity': '身份',
207 'wifi.identity.placeholder': '用户名', 251 'wifi.identity.placeholder': '用户名',
208 'wifi.login': '连接 Wi-Fi', 252 'wifi.login': '连接 Wi-Fi',
@@ -230,12 +274,14 @@ export const Translations = [
230 id: 'zh-TW', 274 id: 'zh-TW',
231 name: 'Traditional Chinese - 繁體中文 台灣', 275 name: 'Traditional Chinese - 繁體中文 台灣',
232 translation: { 276 translation: {
233 title: 'WiFi Card', 277 title: 'Wi-Fi Card',
234 'desc.use': 278 'desc.use':
235 '列印一張含有 WiFi 連接資訊的卡片,將它貼在冰箱、放在你的錢包裡... ', 279 '列印一張含有 Wi-Fi 連接資訊的卡片,將它貼在冰箱、放在你的錢包裡... ',
236 'desc.privacy': 280 'desc.privacy':
237 '您的 WiFi 訊息永遠不會被送到伺服器。本網站不使用追蹤、分析或指紋識別。查看', 281 '您的 Wi-Fi 訊息永遠不會被送到伺服器。本網站不使用追蹤、分析或指紋識別。查看',
238 'desc.source': '原始碼', 282 'desc.source': '原始碼',
283 'cards.additional': '额外列印卡片數量',
284 'cards.tip.hide': '隱藏提示(圖例)',
239 'wifi.login': '連接 WiFi', 285 'wifi.login': '連接 WiFi',
240 'wifi.name': '網路名稱', 286 'wifi.name': '網路名稱',
241 'wifi.name.hiddenSSID': '隱藏 SSID', 287 'wifi.name.hiddenSSID': '隱藏 SSID',
@@ -478,6 +524,40 @@ export const Translations = [
478 }, 524 },
479 }, 525 },
480 { 526 {
527 id: 'de-CH',
528 name: 'German - Schwizerdütsch',
529 translation: {
530 title: 'simple.WiFi Card Creator',
531 'desc.use':
532 'Sie chönd met dem Tool en eifachi Charte mit ehrene WLAN-Date erstelle. Verwänded Sie die, om eifach ehres interne WLAN unter de Metarbeiter zteile oder om es GASCHT-WLAN mit em Chond zteile.',
533 'desc.private': 'Dini Zugegangsdate werded nie zom Server gsändet.',
534 'wifi.identity': 'Identität',
535 'wifi.identity.placeholder': 'Notzername',
536 'wifi.login': 'WLAN-Zugangsdate',
537 'wifi.name': 'WLAN-Netzwärchname',
538 'wifi.name.placeholder': 'WLAN-Netzwärchname',
539 'wifi.password': 'Passwort',
540 'wifi.password.placeholder': 'Passwort',
541 'wifi.password.hide': 'Passwort verstecke',
542 'wifi.name.hiddenSSID': 'Versteckti SSID',
543 'wifi.password.encryption': 'Verschlösselig',
544 'wifi.password.encryption.none': 'Keini',
545 'wifi.encryption.eapMethod': 'EAP Methode',
546 'wifi.tip':
547 'Zeig mit dinere Kamera vom Handys auf de QR-Code, um automatisch en Verbindung herzstelle',
548 'wifi.alert.name': 'De Netzwerkname dörf ned leer sii',
549 'wifi.alert.password': 'Das Passwort dörf ned leer sii',
550 'wifi.alert.password.length.5':
551 'Das Passwort muss mendestends 5 Zeiche lang sii, oder stell d Verschlösselig auf "Keini"',
552 'wifi.alert.password.8':
553 'Das Passwort muss mindestends 8 Zeichen lang sii, oder stell d Verschlösselig auf "Keini"',
554 'wifi.alert.eapIdentity': 'Die Identität darf ned leer sii',
555 'button.rotate': 'Dreie',
556 'button.print': 'Drocke',
557 select: 'Sprach uswähle',
558 },
559 },
560 {
481 id: 'el-GR', 561 id: 'el-GR',
482 name: 'Greek - Hellenic', 562 name: 'Greek - Hellenic',
483 translation: { 563 translation: {
@@ -578,6 +658,7 @@ export const Translations = [
578 'Le mot de passe doit au moins faire 8 caractères, ou changez le chiffrement en "Aucun"', 658 'Le mot de passe doit au moins faire 8 caractères, ou changez le chiffrement en "Aucun"',
579 'button.rotate': 'Pivoter', 659 'button.rotate': 'Pivoter',
580 'button.print': 'Imprimer', 660 'button.print': 'Imprimer',
661 'cards.additional': 'Nombre de cartes a imprimer',
581 select: 'Choisir la langue', 662 select: 'Choisir la langue',
582 }, 663 },
583 }, 664 },
@@ -596,6 +677,8 @@ export const Translations = [
596 'wifi.login': 'Connexion Wi-Fi', 677 'wifi.login': 'Connexion Wi-Fi',
597 'wifi.name': 'Nom de la ret', 678 'wifi.name': 'Nom de la ret',
598 'wifi.name.hiddenSSID': 'SSID amagat', 679 'wifi.name.hiddenSSID': 'SSID amagat',
680 'cards.additional': 'Carta suplementàrias d’imprimir',
681 'cards.tip.hide': 'Rescondre astúcia (legenda)',
599 'wifi.name.placeholder': 'Nom de la ret WiFi', 682 'wifi.name.placeholder': 'Nom de la ret WiFi',
600 'wifi.password': 'Senhal', 683 'wifi.password': 'Senhal',
601 'wifi.password.placeholder': 'Senhal', 684 'wifi.password.placeholder': 'Senhal',
@@ -1080,6 +1163,154 @@ export const Translations = [
1080 select: 'Vælg sprog', 1163 select: 'Vælg sprog',
1081 }, 1164 },
1082 }, 1165 },
1166 {
1167 id: 'sk-SK',
1168 name: 'Slovak - Slovenčina',
1169 translation: {
1170 title: 'WiFi Karta',
1171 'desc.use':
1172 'Vytlačte si jednoduchú kartu s prihlasovacími údajmi do siete Wi-Fi. Prilepte ju na chladničku, majte ju v peňaženke atď.',
1173 'desc.privacy':
1174 'Vaše Wi-Fi informácie sa nikdy neodošlú na server. Na tejto webovej stránke sa nepoužíva žiadne sledovanie, analytika ani fingerprinting. Zobraziť',
1175 'desc.source': 'zdrojový kód',
1176 'wifi.identity': 'Identita',
1177 'wifi.identity.placeholder': 'Uživateľské meno',
1178 'wifi.login': 'WiFi Login',
1179 'wifi.name': 'Názov siete',
1180 'wifi.name.hiddenSSID': 'Skryté SSID',
1181 'cards.additional': 'Počet ďalších kariet na tlač',
1182 'cards.tip.hide': 'Schovať nápovedu',
1183 'wifi.name.placeholder': 'Názov siete WiFi',
1184 'wifi.password': 'Heslo',
1185 'wifi.password.placeholder': 'Heslo',
1186 'wifi.password.hide': 'Schovať heslo',
1187 'wifi.password.encryption': 'Šifrovanie',
1188 'wifi.password.encryption.none': 'Žiadne',
1189 'wifi.encryption.eapMethod': 'Metóda EAP',
1190 'wifi.tip':
1191 'Namierte fotoaparát telefónu na QR kód a automaticky sa pripojte.',
1192 'wifi.alert.name': 'Názov siete nesmie byť prázdny',
1193 'wifi.alert.password': 'Heslo nesmie byť prázdne',
1194 'wifi.alert.password.length.5':
1195 'Heslo musí mať aspoň 5 znakov, alebo zmeňte šifrovanie na "Žiadne"',
1196 'wifi.alert.password.length.8':
1197 'Heslo musí mať aspoň 8 znakov, alebo zmeňte šifrovanie na "Žiadne"',
1198 'wifi.alert.eapIdentity': 'Identita nesmie byť prázdna',
1199 'button.rotate': 'Otočiť',
1200 'button.print': 'Vytlačiť',
1201 select: 'Vybrať jazyk',
1202 },
1203 },
1204 {
1205 id: 'mg-MG',
1206 name: 'Malagasy - Malagasy',
1207 translation: {
1208 title: 'Karatra Wifi',
1209 'desc.use':
1210 "Antontay ny karatra tsotra maneho ny mombamomba ny wifi-nao. Apetraho eran'ny trano, ataovy any anaty boky, sns",
1211 'desc.privacy':
1212 "Tsy tehirizinay na aiza na aiza izay zavatra ampidirinao eto. Tsy misy fanarahana na fitsikilovana eto amin'ity pejy ity. Misy fanazavana",
1213 'desc.source': 'source code',
1214 'wifi.identity': 'Anarana',
1215 'wifi.identity.placeholder': 'Anarana',
1216 'wifi.login': 'Momba ny WiFi',
1217 'wifi.name': 'SSID',
1218 'wifi.name.hiddenSSID': 'SSID miafina',
1219 'cards.additional': "Isan' ny karatra fanampiny atonta",
1220 'cards.tip.hide': 'Aza asiana fanazavana (legend)',
1221 'wifi.name.placeholder': "Anaran'ny tambajotra WiFi (SSID)",
1222 'wifi.password': 'Fanalahidy',
1223 'wifi.password.placeholder': 'Teny fanalahidy',
1224 'wifi.password.hide': 'Afeno ny fanalahidy',
1225 'wifi.password.encryption': 'Encryption',
1226 'wifi.password.encryption.none': 'Tsy misy',
1227 'wifi.encryption.eapMethod': 'EAP method',
1228 'wifi.tip':
1229 "Mba hidiranao malakilaky dia alaivo sary amin'ny fakantsarinao ilay QR Code",
1230 'wifi.alert.name': 'Tsy maintsy misy anarana ilay tambajotra',
1231 'wifi.alert.password': 'Tsy maintsy fenoina ny fanalahidy',
1232 'wifi.alert.password.length.5':
1233 "Tsy maintsy mihoatry ny litera 5 ny fanalahidy, na tsy maintsy ovaina ho 'Tsy Misy' ny Encryption",
1234 'wifi.alert.password.length.8':
1235 "Tsy maintsy mihoatry ny litera 8 ny fanalahidy, na tsy maintsy ovaina ho 'Tsy Misy' ny Encryption",
1236 'wifi.alert.eapIdentity': 'Tsy maintsy fenoina ny anarana',
1237 'button.rotate': 'Ahodino',
1238 'button.print': 'Antontay',
1239 select: 'Mifidiana fiteny hafa',
1240 },
1241 },
1242 {
1243 id: 'bn-BD',
1244 name: 'Bangla - বাংলা',
1245 translation: {
1246 title: 'ওয়াইফাই কার্ড',
1247 'desc.use':
1248 'আপনার ওয়াই-ফাই লগইন বিবরণ সহ একটি সাধারণ কার্ড প্রিন্ট করুন। এটি ফ্রিজে টেপ দিয়ে লাগান, আপনার ওয়ালেটে রাখুন, ইত্যাদি।',
1249 'desc.privacy':
1250 'আপনার ওয়াই-ফাই তথ্য কখনই সার্ভারে পাঠানো হয় না। এই ওয়েবসাইটে কোন ট্র্যাকিং, অ্যানালিটিক্স বা ফিঙ্গারপ্রিন্টিং ব্যবহার করা হয় না। দেখুন',
1251 'desc.source': 'সোর্স কোড',
1252 'wifi.login': 'ওয়াই-ফাই লগইন',
1253 'wifi.name': 'নেটওয়ার্কের নাম',
1254 'wifi.name.hiddenSSID': 'লুকানো SSID',
1255 'cards.additional': 'অতিরিক্ত কার্ড প্রিন্ট করা হবে',
1256 'cards.tip.hide': 'নির্দেশ (টীকা) লুকান',
1257 'wifi.name.placeholder': 'ওয়াই-ফাই নেটওয়ার্কের নাম',
1258 'wifi.password': 'পাসওয়ার্ড',
1259 'wifi.password.placeholder': 'পাসওয়ার্ড',
1260 'wifi.password.hide': 'পাসওয়ার্ড লুকান',
1261 'wifi.password.encryption': 'এনক্রিপশন',
1262 'wifi.password.encryption.none': 'নেই',
1263 'wifi.tip':
1264 'স্বয়ংক্রিয়ভাবে সংযোগ করতে আপনার ফোনের ক্যামেরা QR কোডে নির্দেশ করুন',
1265 'wifi.alert.name': 'নেটওয়ার্কের নাম খালি হতে পারে না',
1266 'wifi.alert.password': 'পাসওয়ার্ড খালি হতে পারে না',
1267 'wifi.alert.password.length.5':
1268 'পাসওয়ার্ড কমপক্ষে ৫ অক্ষরের হতে হবে, অথবা এনক্রিপশন পরিবর্তন করে "নেই" দিন',
1269 'wifi.alert.password.length.8':
1270 'পাসওয়ার্ড কমপক্ষে ৮ অক্ষরের হতে হবে, অথবা এনক্রিপশন পরিবর্তন করে "নেই" দিন',
1271 'button.rotate': 'ঘুরান',
1272 'button.print': 'প্রিন্ট',
1273 select: 'ভাষা নির্বাচন করুন',
1274 },
1275 },
1276 {
1277 id: 'eo',
1278 name: 'Esperanto',
1279 translation: {
1280 title: 'Vifia karto',
1281 'desc.use':
1282 'Presu simplan karton kun viaj vifiaj ensalutaj detaloj. Bendu ĝin al la fridujo, konservu ĝin en via monujo, ktp.',
1283 'desc.privacy':
1284 'Viaj vifiaj informoj neniam estas senditaj al la servilo. Neniu spurado, analizo aŭ fingrospurado estas uzataj en ĉi tiu retejo. Vidi la',
1285 'desc.source': 'fontokodon',
1286 'wifi.identity': 'Identeco',
1287 'wifi.identity.placeholder': 'Uzantnomo',
1288 'wifi.login': 'Vifia ensaluto',
1289 'wifi.name': 'Retnomo',
1290 'wifi.name.hiddenSSID': 'Kaŝita SSID',
1291 'cards.additional': 'Pliaj kartoj por presi',
1292 'cards.tip.hide': 'Kaŝi konsileton (klarigeto)',
1293 'wifi.name.placeholder': 'Nomo de vifia reto',
1294 'wifi.password': 'Pasvorto',
1295 'wifi.password.placeholder': 'Pasvorto',
1296 'wifi.password.hide': 'Kaŝi pasvorton',
1297 'wifi.password.encryption': 'Ĉifrado',
1298 'wifi.password.encryption.none': 'Nenio',
1299 'wifi.encryption.eapMethod': 'EAP-metodo',
1300 'wifi.tip':
1301 'Metu la fotilon de via telefono antaŭ la QR-kodo por aŭtomate konektiĝi',
1302 'wifi.alert.name': 'Retnomo ne povas esti malplena',
1303 'wifi.alert.password': 'Pasvorto ne povas esti malplena',
1304 'wifi.alert.password.length.5':
1305 'Pasvorto devas enhavi almenaŭ 5 signoj, aŭ ŝanĝu la ĉifradon al "Neniu"',
1306 'wifi.alert.password.length.8':
1307 'Pasvorto devas enhavi almenaŭ 8 signoj, aŭ ŝanĝu la ĉifradon al "Neniu"',
1308 'wifi.alert.eapIdentity': 'Identeco ne povas esti malplena',
1309 'button.rotate': 'Rotacii',
1310 'button.print': 'Presi',
1311 select: 'Elektu lingvon',
1312 },
1313 },
1083].sort((a, b) => { 1314].sort((a, b) => {
1084 return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1; 1315 return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;
1085}); 1316});