[
  {
    "path": ".dockerignore",
    "content": "node_modules\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [bndw]\n"
  },
  {
    "path": ".github/workflows/master_push.yml",
    "content": "name: ci\non:\n  push:\n    branches: master\njobs:\n  build-and-publish:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n      - name: Set up Docker\n        uses: docker/setup-buildx-action@v1\n      - name: Login to DockerHub\n        uses: docker/login-action@v1\n        with:\n          username: ${{ secrets.DOCKERHUB_USERNAME }}\n          password: ${{ secrets.DOCKERHUB_TOKEN }}\n      - name: Build and publish\n        run: make build publish\n"
  },
  {
    "path": ".github/workflows/pull_request.yml",
    "content": "name: ci\non: pull_request\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n      - name: Set up Docker\n        uses: docker/setup-buildx-action@v1\n      - name: Build\n        run: make build\n"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\n# Format using prettier\nmake fmt.write\n"
  },
  {
    "path": ".prettierrc.json",
    "content": "{\n  \"trailingComma\": \"es5\",\n  \"semi\": true,\n  \"singleQuote\": true\n}\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM node:22-alpine as builder\n\nWORKDIR /tmp\nCOPY . .\n\nRUN npx prettier --check ./src\nRUN yarn && yarn build \n\n###\n# production image\nFROM nginx:stable-alpine\nCOPY --from=builder /tmp/build /usr/share/nginx/html\n"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2020 Ben Woodward\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "REPO ?= bndw/wifi-card\nGITSHA=$(shell git rev-parse --short HEAD)\nTAG_COMMIT=$(REPO):$(GITSHA)\nTAG_LATEST=$(REPO):latest\n\nall: dev\n\n.PHONY: build\nbuild:\n\tdocker build -t $(TAG_LATEST) .\n\n.PHONY: dev\ndev:\n\tyarn\n\tyarn start\n\n.PHONY: fmt\nfmt:\n\tnpx prettier --check ./src\n\n.PHONY: fmt.write\nfmt.write:\n\tnpx prettier --write ./src\n\n.PHONY: run\nrun:\n\tdocker run --rm -p 8080:80 $(TAG_LATEST)\n\n.PHONY: publish\npublish:\n\tdocker push $(TAG_LATEST)\n\t@docker tag $(TAG_LATEST) $(TAG_COMMIT)\n\tdocker push $(TAG_COMMIT)\n"
  },
  {
    "path": "README.md",
    "content": "![ci](https://github.com/bndw/wifi-card/workflows/ci/badge.svg)\n\n# <img width=\"32px\" src=\"./public/images/wifi.png\"> WiFi Card\n\nhttps://wificard.io\n\nPrint a simple card with your WiFi login details. Tape it to the fridge, keep it in your wallet, hang on the wall for guests at home or in the hotel, etc.\n\n<a href=\"https://wificard.io/\">\n   <img alt=\"wificard\" src=\"https://user-images.githubusercontent.com/48166553/129261875-169841ab-e997-4596-af7f-ada0f68cd230.gif\">\n</a>\n\n<a href=\"https://thiswebsitedoesnottrackyou.com/\">\n   <img width=\"402\" alt=\"This website does not track you\" src=\"https://user-images.githubusercontent.com/4248167/184430158-849d4b2c-de43-483f-86fe-0743b23bc40c.png\">\n</a>\n\n## Running locally\n\nRun the official Docker image on http://localhost:8080\n\n```\nmake run\n```\n\n## Development\n\n1. Make sure you have `yarn` installed\n2. Run the live-reload server on http://localhost:3000\n   ```\n   make dev\n   ```\n\nThis project uses [Prettier](https://prettier.io/) formatting. All pull requests must pass the automated lint checks before merging. Prettier format is run automatically as a pre-commit hook.\n\n## Language Contribution Guide\n\nWe would love for you to contribute to different languages and help make it even better than it is today! As a language contributor, here are some steps we would like you to follow:\n\n1. Add a translation to [`./src/translations.js`](./src/translations.js). Here's an example of the German translation:\n\n   ```\n   {\n      id: 'de-DE',              // locale code\n      name: 'German - Deutsch', // Display name in the format 'latinName - nativeName'\n      rtl: false,               // Optional, true if this is a right-to-left language\n      translation: {\n         ...\n      }\n   }\n   ```\n\n2. Append an entry to the [Supported Languages](#supported-languages) table below.\n\n## Supported Languages\n\n| Language                     | Author Credit                                      |\n| ---------------------------- | -------------------------------------------------- |\n| Arabic                       | [Ahmed Tokyo](https://github.com/a-tokyo)          |\n| Bangla                       | [Tarek Hasan](https://github.com/Tarek-Hasan)      |\n| Catalan                      | [aniol](https://github.com/aniol)                  |\n| Cantonese Simplified         | [ous50](https://github.com/ous50)                  |\n| Chinese                      | [Baoyuantop](https://github.com/Baoyuantop)        |\n| Chinese Traditional (Taiwan) | [Dxball](https://github.com/dxball)                |\n| Danish                       | [dk90103](https://github.com/dk90103)              |\n| Dutch                        | [wouterbrink](https://github.com/wouterbrink)      |\n| English                      | [bndw](https://github.com/bndw)                    |\n| Esperanto                    | [zeecho](https://github.com/zeecho)                |\n| French                       | [Divlo](https://github.com/Divlo)                  |\n| German                       | [devofthings](https://github.com/devofthings)      |\n| German (Swiss)               | [NZehnder](https://github.com/NZehnder)            |\n| Greek                        | [nautilus7](https://github.com/nautilus7)          |\n| Hebrew                       | [Ido Bronfeld](https://github.com/HelloWorldIL)    |\n| Hindi                        | [Pushpender](https://github.com/PushpenderSaini0)  |\n| Hungarian                    | [munkacsimark](https://github.com/munkacsimark)    |\n| Indonesia                    | [nyancodeid](https://github.com/nyancodeid)        |\n| Italian                      | [Domenico Pascucci](https://github.com/pasmimmo)   |\n| Japanese                     | [hatsu38](https://github.com/hatsu38)              |\n| Korean                       | [Seungbin Oh](https://github.com/sboh1214)         |\n| Malagasy                     | [mpilasy](https://github.com/mpilasy)              |\n| Malay (Malaysia)             | [hh-shiung](https://github.com/hh-shiung)          |\n| Norwegian                    | [tplive](https://github.com/tplive)                |\n| Occitan                      | [ensag-dev](https://github.com/ensag-dev)          |\n| Persian                      | [Ramin](https://github.com/raminr77)               |\n| Polish                       | [olekstomek](https://github.com/olekstomek)        |\n| Portuguese                   | [pedrorenan](https://github.com/pedrorenan)        |\n| Portuguese (Brazil)          | [ismaelpereira](https://github.com/ismaelpereira)  |\n| Punjabi                      | [phoenixgill34](https://github.com/phoenixgill34)  |\n| Russian                      | [Teraskull](https://github.com/Teraskull)          |\n| Serbian                      | [demanderbag](https://github.com/demanderbag)      |\n| Slovak                       | [matejkubinec](https://github.com/matejkubinec)    |\n| Spanish                      | [oscfdezdz](https://github.com/oscfdezdz)          |\n| Swedish                      | [ddund](https://github.com/ddund)                  |\n| Thai                         | [l2D](https://github.com/l2D)                      |\n| Turkish                      | [Riza Ergun](https://github.com/rizaergun)         |\n| Ukrainian                    | [Teraskull](https://github.com/Teraskull)          |\n| Urdu                         | [mHassan11](https://github.com/mHassan11)          |\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"wifi-card\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@testing-library/jest-dom\": \"^6.9.1\",\n    \"@testing-library/react\": \"^16.3.2\",\n    \"@testing-library/user-event\": \"^14.6.1\",\n    \"evergreen-ui\": \"^7.1.9\",\n    \"i18next\": \"^25.8.0\",\n    \"i18next-browser-languagedetector\": \"^8.2.0\",\n    \"qrcode.react\": \"^4.2.0\",\n    \"react\": \"^19.2.3\",\n    \"react-dom\": \"^19.2.3\",\n    \"react-i18next\": \"^16.5.3\",\n    \"react-scripts\": \"^5.0.1\"\n  },\n  \"devDependencies\": {\n    \"husky\": \"^9.1.7\",\n    \"prettier\": \"3.8.1\"\n  },\n  \"scripts\": {\n    \"start\": \"react-scripts start\",\n    \"build\": \"react-scripts build\",\n    \"test\": \"react-scripts test\",\n    \"eject\": \"react-scripts eject\",\n    \"prepare\": \"husky install\"\n  },\n  \"eslintConfig\": {\n    \"extends\": \"react-app\"\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.2%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  },\n  \"main\": \"index.js\",\n  \"repository\": \"git@github.com:bndw/wifi-card.git\",\n  \"author\": \"bndw <ben@bdw.to>\",\n  \"license\": \"MIT\"\n}"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <meta name=\"theme-color\" content=\"#000000\" />\n  <meta name=\"description\"\n    content=\"Print a simple card with your WiFi login details. Tape it to the fridge, keep it in your wallet, etc.\" />\n  <link rel=\"icon\" href=\"./images/wifi.ico\" />\n  <!--\n      manifest.json provides metadata used when your web app is installed on a\n      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n    -->\n  <link rel=\"manifest\" href=\"%PUBLIC_URL%/manifest.json\" />\n  <!--\n      Notice the use of %PUBLIC_URL% in the tags above.\n      It will be replaced with the URL of the `public` folder during the build.\n      Only files inside the `public` folder can be referenced from the HTML.\n\n      Unlike \"/favicon.ico\" or \"favicon.ico\", \"%PUBLIC_URL%/favicon.ico\" will\n      work correctly both with client-side routing and a non-root public URL.\n      Learn how to configure a non-root public URL by running `npm run build`.\n    -->\n  <title>WiFi Card</title>\n</head>\n\n<body>\n  <noscript>You need to enable JavaScript to run this app. Feel free to view the\n    <a href=\"https://github.com/bndw/wifi-card\">source code</a>.</noscript>\n\n  <div id=\"root\"></div>\n  <!--\n      This HTML file is a template.\n      If you open it directly in the browser, you will see an empty page.\n\n      You can add webfonts, meta tags, or analytics to this file.\n      The build step will place the bundled scripts into the <body> tag.\n\n      To begin the development, run `npm start` or `yarn start`.\n      To create a production bundle, use `npm run build` or `yarn build`.\n    -->\n  <script>\n    // Internet Explorer 6-11\n    const isIE = /*@cc_on!@*/ false || !!document.documentMode;\n\n    if (isIE) {\n      document.getElementById('root').innerHTML =\n        'Internet Explorer is not supported. Download Firefox/Chrome/Opera.';\n      document.body.style.fontSize = '50px';\n    }\n  </script>\n</body>\n\n</html>"
  },
  {
    "path": "public/manifest.json",
    "content": "{\n  \"short_name\": \"wifi-details\",\n  \"name\": \"wifi-details\",\n  \"icons\": [\n    {\n      \"src\": \"./images/wifi.ico\",\n      \"sizes\": \"64x64 32x32 24x24 16x16\",\n      \"type\": \"image/x-icon\"\n    }\n  ],\n  \"start_url\": \".\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#000000\",\n  \"background_color\": \"#ffffff\"\n}\n"
  },
  {
    "path": "public/robots.txt",
    "content": "# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n"
  },
  {
    "path": "src/App.js",
    "content": "import { Button, Heading, Link, Pane, Paragraph } from 'evergreen-ui';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport logo from '../src/images/wifi.png';\nimport { Settings } from './components/Settings';\nimport { WifiCard } from './components/WifiCard';\nimport './style.css';\nimport { Translations } from './translations';\n\nfunction App() {\n  const html = document.querySelector('html');\n\n  const { t, i18n } = useTranslation();\n  const firstLoad = useRef(true);\n  const [settings, setSettings] = useState({\n    ssid: '',\n    password: '',\n    encryptionMode: 'WPA',\n    eapMethod: 'PWD',\n    eapIdentity: '',\n    hidePassword: false,\n    hiddenSSID: false,\n    portrait: false,\n    additionalCards: 1,\n    hideTip: false,\n    lng: 'en-US',\n  });\n\n  const [errors, setErrors] = useState({\n    ssidError: '',\n    passwordError: '',\n    eapIdentityError: '',\n  });\n\n  const htmlDirection = (languageID) => {\n    languageID = languageID || i18n.language;\n    const rtl = Translations.filter((t) => t.id === languageID)[0]?.rtl;\n    return rtl ? 'rtl' : 'ltr';\n  };\n\n  const onChangeLanguage = (language) => {\n    html.style.direction = htmlDirection(language);\n    i18n.changeLanguage(language);\n\n    setSettings({ ...settings, lng: language });\n  };\n\n  const onPrint = () => {\n    if (!settings.ssid.length) {\n      setErrors({\n        ...errors,\n        ssidError: t('wifi.alert.name'),\n      });\n      return;\n    }\n    if (settings.password.length < 8 && settings.encryptionMode === 'WPA') {\n      setErrors({\n        ...errors,\n        passwordError: t('wifi.alert.password.length.8'),\n      });\n      return;\n    }\n    if (settings.password.length < 5 && settings.encryptionMode === 'WEP') {\n      setErrors({\n        ...errors,\n        passwordError: t('wifi.alert.password.length.5'),\n      });\n      return;\n    }\n    if (\n      settings.password.length < 1 &&\n      settings.encryptionMode === 'WPA2-EAP'\n    ) {\n      setErrors({\n        ...errors,\n        passwordError: t('wifi.alert.password'),\n      });\n      return;\n    }\n    if (\n      settings.eapIdentity.length < 1 &&\n      settings.encryptionMode === 'WPA2-EAP'\n    ) {\n      setErrors({\n        ...errors,\n        eapIdentityError: t('wifi.alert.eapIdentity'),\n      });\n      return;\n    }\n    document.title = 'WiFi Card - ' + settings.ssid;\n    window.print();\n  };\n\n  const onSSIDChange = (ssid) => {\n    setErrors({ ...errors, ssidError: '' });\n    setSettings({ ...settings, ssid });\n  };\n  const onPasswordChange = (password) => {\n    setErrors({ ...errors, passwordError: '' });\n    setSettings({ ...settings, password });\n  };\n  const onEncryptionModeChange = (encryptionMode) => {\n    setErrors({ ...errors, passwordError: '' });\n    setSettings({ ...settings, encryptionMode });\n  };\n  const onEapMethodChange = (eapMethod) => {\n    setSettings({ ...settings, eapMethod });\n  };\n  const onEapIdentityChange = (eapIdentity) => {\n    setErrors({ ...errors, eapIdentityError: '' });\n    setSettings({ ...settings, eapIdentity });\n  };\n  const onOrientationChange = (portrait) => {\n    setSettings({ ...settings, portrait });\n  };\n  const onHidePasswordChange = (hidePassword) => {\n    setSettings({ ...settings, hidePassword });\n  };\n  const onHiddenSSIDChange = (hiddenSSID) => {\n    setSettings({ ...settings, hiddenSSID });\n  };\n  const onAdditionalCardsChange = (additionalCardsStr) => {\n    const amount = parseInt(additionalCardsStr);\n    amount >= 1 && setSettings({ ...settings, additionalCards: amount });\n  };\n  const onHideTipChange = (hideTip) => {\n    setSettings({ ...settings, hideTip });\n  };\n  const onFirstLoad = () => {\n    html.style.direction = htmlDirection();\n    firstLoad.current = false;\n  };\n\n  useEffect(() => {\n    // Ensure the page direction is set properly on first load\n    if (htmlDirection() === 'rtl') {\n      html.style.direction = 'rtl';\n    }\n  }, []);\n\n  return (\n    <Pane>\n      <Pane display=\"flex\">\n        <img alt=\"icon\" src={logo} width=\"32\" height=\"32\" />\n        <Heading size={900} paddingRight={16} paddingLeft={16}>\n          {t('title')}\n        </Heading>\n      </Pane>\n      <Pane>\n        <Paragraph marginTop={12}>{t('desc.use')}</Paragraph>\n\n        <Paragraph marginTop={12}>\n          {t('desc.privacy')}{' '}\n          <Link href=\"https://github.com/bndw/wifi-card\">\n            {t('desc.source')}\n          </Link>\n          .\n        </Paragraph>\n      </Pane>\n      <Pane>\n        <WifiCard\n          settings={settings}\n          ssidError={errors.ssidError}\n          passwordError={errors.passwordError}\n          eapIdentityError={errors.eapIdentityError}\n          onSSIDChange={onSSIDChange}\n          onEapIdentityChange={onEapIdentityChange}\n          onPasswordChange={onPasswordChange}\n        />\n      </Pane>\n      <Settings\n        settings={settings}\n        firstLoad={firstLoad}\n        onFirstLoad={onFirstLoad}\n        onLanguageChange={onChangeLanguage}\n        onEncryptionModeChange={onEncryptionModeChange}\n        onEapMethodChange={onEapMethodChange}\n        onOrientationChange={onOrientationChange}\n        onHidePasswordChange={onHidePasswordChange}\n        onHiddenSSIDChange={onHiddenSSIDChange}\n        onAdditionalCardsChange={onAdditionalCardsChange}\n        onHideTipChange={onHideTipChange}\n      />\n      <Button\n        id=\"print\"\n        appearance=\"primary\"\n        height={40}\n        marginRight={16}\n        onClick={onPrint}\n      >\n        {t('button.print')}\n      </Button>\n      <Pane id=\"print-area\">\n        {settings.additionalCards >= 1 &&\n          [...Array(settings.additionalCards)].map((el, idx) => (\n            <WifiCard\n              keyid={idx}\n              key={`card-nr-${idx}`}\n              settings={settings}\n              ssidError={errors.ssidError}\n              passwordError={errors.passwordError}\n              eapIdentityError={errors.eapIdentityError}\n              onSSIDChange={onSSIDChange}\n              onEapIdentityChange={onEapIdentityChange}\n              onPasswordChange={onPasswordChange}\n            />\n          ))}\n      </Pane>\n    </Pane>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "src/components/Settings.js",
    "content": "import {\n  Checkbox,\n  Pane,\n  RadioGroup,\n  SelectField,\n  TextInputField,\n} from 'evergreen-ui';\nimport { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport i18n from '../i18n';\nimport { Translations } from '../translations';\nimport './style.css';\n\nexport const Settings = (props) => {\n  const { t } = useTranslation();\n  const encryptionModes = [\n    { label: t('wifi.password.encryption.none'), value: '' },\n    { label: 'WPA/WPA2/WPA3', value: 'WPA' },\n    { label: 'WPA2-EAP', value: 'WPA2-EAP' },\n    { label: 'WEP', value: 'WEP' },\n  ];\n  const eapMethods = [{ label: 'PWD', value: 'PWD' }];\n\n  const langSelectDefaultValue = () => {\n    const t = Translations.filter((t) => t.id === i18n.language);\n    if (t.length !== 1) {\n      return 'en-US';\n    }\n    return t[0].id;\n  };\n\n  useEffect(() => {\n    if (props.firstLoad.current && window.innerWidth < 500) {\n      props.onFirstLoad();\n      props.onOrientationChange(true);\n    }\n  });\n\n  return (\n    <Pane id=\"settings\" maxWidth={props.settings.portrait ? '350px' : '100%'}>\n      <SelectField\n        width={300}\n        inputHeight={38}\n        label={t('select')}\n        onChange={(e) => props.onLanguageChange(e.target.value)}\n        defaultValue={langSelectDefaultValue()}\n      >\n        {Translations.map((t) => (\n          <option key={t.id} value={t.id}>\n            {t.name}\n          </option>\n        ))}\n      </SelectField>\n\n      <Checkbox\n        label={t('button.rotate')}\n        checked={props.settings.portrait}\n        onChange={() => props.onOrientationChange(!props.settings.portrait)}\n      />\n      <Checkbox\n        label={t('wifi.password.hide')}\n        checked={props.settings.hidePassword}\n        onChange={() =>\n          props.onHidePasswordChange(!props.settings.hidePassword)\n        }\n      />\n      <Checkbox\n        label={t('wifi.name.hiddenSSID')}\n        checked={props.settings.hiddenSSID}\n        onChange={() => props.onHiddenSSIDChange(!props.settings.hiddenSSID)}\n      />\n\n      <Checkbox\n        label={t('cards.tip.hide')}\n        checked={props.settings.hideTip}\n        onChange={() => props.onHideTipChange(!props.settings.hideTip)}\n      />\n      <TextInputField\n        type=\"number\"\n        width={300}\n        label={t('cards.additional')}\n        value={props.settings.additionalCards}\n        onChange={(e) => props.onAdditionalCardsChange(e.target.value)}\n      />\n      <RadioGroup\n        label={t('wifi.password.encryption')}\n        size={16}\n        value={props.settings.encryptionMode}\n        options={encryptionModes}\n        onChange={(e) => props.onEncryptionModeChange(e.target.value)}\n      />\n      <RadioGroup\n        label={t('wifi.encryption.eapMethod')}\n        size={16}\n        value={props.settings.eapMethod}\n        options={eapMethods}\n        className={`\n          ${props.settings.encryptionMode !== 'WPA2-EAP' && 'hidden'}\n        `}\n        onChange={(e) => props.onEapMethodChange(e.target.value)}\n      />\n    </Pane>\n  );\n};\n"
  },
  {
    "path": "src/components/WifiCard.js",
    "content": "import {\n  CameraIcon,\n  Card,\n  Heading,\n  MobilePhoneIcon,\n  Pane,\n  Paragraph,\n  Text,\n  TextareaField,\n} from 'evergreen-ui';\nimport { QRCodeSVG as QRCode } from 'qrcode.react';\nimport { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport logo from '../../src/images/wifi.png';\nimport './style.css';\n\nexport const WifiCard = (props) => {\n  const { t } = useTranslation();\n  const [qrvalue, setQrvalue] = useState('');\n\n  const escape = (v) => {\n    const needsEscape = ['\"', ';', ',', ':', '\\\\'];\n\n    let escaped = '';\n    for (const c of v) {\n      if (needsEscape.includes(c)) {\n        escaped += `\\\\${c}`;\n      } else {\n        escaped += c;\n      }\n    }\n    return escaped;\n  };\n\n  useEffect(() => {\n    let opts = {};\n\n    opts.T = props.settings.encryptionMode || 'nopass';\n    if (props.settings.encryptionMode === 'WPA2-EAP') {\n      opts.E = props.settings.eapMethod;\n      opts.I = props.settings.eapIdentity;\n    }\n    opts.S = escape(props.settings.ssid);\n    opts.P = escape(props.settings.password);\n    opts.H = props.settings.hiddenSSID;\n\n    let data = '';\n    Object.entries(opts).forEach(([k, v]) => (data += `${k}:${v};`));\n    const qrval = `WIFI:${data};`;\n\n    setQrvalue(qrval);\n  }, [props.settings]);\n\n  const portraitWidth = () => {\n    const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);\n    return isMobile ? '100%' : '280px';\n  };\n\n  const passwordFieldLabel = () => {\n    const hiddenPassword =\n      props.settings.hidePassword || !props.settings.encryptionMode;\n    return hiddenPassword ? '' : t('wifi.password');\n  };\n\n  const eapIdentityFieldLabel = () => {\n    const hiddenIdentity = props.settings.encryptionMode !== 'WPA2-EAP';\n    return hiddenIdentity ? '' : t('wifi.identity');\n  };\n\n  const eapMethodFieldLabel = () => {\n    return !eapIdentityFieldLabel() ? '' : t('wifi.encryption.eapMethod');\n  };\n\n  const keyid = props.keyid || '';\n  const suffixKeyID = (prefix) => `${prefix}-${keyid}`;\n\n  return (\n    <Card\n      className=\"card-print\"\n      elevation={3}\n      style={{ maxWidth: props.settings.portrait ? portraitWidth() : '100%' }}\n    >\n      <Pane display=\"flex\" paddingBottom={12}>\n        <img alt=\"icon\" src={logo} width=\"24\" height=\"24\" />\n        <Heading\n          size={700}\n          paddingRight={10}\n          paddingLeft={10}\n          textAlign={props.settings.portrait ? 'center' : 'unset'}\n        >\n          {t('wifi.login')}\n        </Heading>\n      </Pane>\n\n      <Pane\n        className=\"details\"\n        style={{ flexDirection: props.settings.portrait ? 'column' : 'row' }}\n      >\n        <QRCode\n          className=\"qrcode\"\n          style={{ marginBottom: props.settings.portrait ? '1em' : '0' }}\n          value={qrvalue}\n          size={150}\n        />\n\n        <Pane width={'100%'}>\n          <TextareaField\n            id={suffixKeyID('ssid')}\n            type=\"text\"\n            marginBottom={5}\n            autoComplete=\"off\"\n            autoCorrect=\"off\"\n            autoCapitalize=\"none\"\n            spellCheck={false}\n            maxLength=\"32\"\n            label={t('wifi.name')}\n            placeholder={t('wifi.name.placeholder')}\n            value={props.settings.ssid}\n            onChange={(e) => props.onSSIDChange(e.target.value)}\n            isInvalid={!!props.ssidError}\n            validationMessage={!!props.ssidError && props.ssidError}\n          />\n          {props.settings.encryptionMode === 'WPA2-EAP' && (\n            <>\n              <TextareaField\n                id={suffixKeyID('eapmethod')}\n                type=\"text\"\n                marginBottom={5}\n                readOnly={true}\n                spellCheck={false}\n                label={eapMethodFieldLabel()}\n                value={props.settings.eapMethod}\n              />\n\n              <TextareaField\n                id={suffixKeyID('identity')}\n                type=\"text\"\n                marginBottom={5}\n                autoComplete=\"off\"\n                autoCorrect=\"off\"\n                autoCapitalize=\"none\"\n                spellCheck={false}\n                label={eapIdentityFieldLabel()}\n                placeholder={t('wifi.identity.placeholder')}\n                value={props.settings.eapIdentity}\n                onChange={(e) => props.onEapIdentityChange(e.target.value)}\n                isInvalid={!!props.eapIdentityError}\n                validationMessage={\n                  !!props.eapIdentityError && props.eapIdentityError\n                }\n              />\n            </>\n          )}\n          {!(props.settings.hidePassword || !props.settings.encryptionMode) && (\n            <TextareaField\n              id={suffixKeyID('password')}\n              type=\"text\"\n              maxLength=\"63\"\n              autoComplete=\"off\"\n              autoCorrect=\"off\"\n              autoCapitalize=\"none\"\n              spellCheck={false}\n              height={\n                props.settings.portrait && props.settings.password.length > 40\n                  ? '5em'\n                  : 'auto'\n              }\n              marginBottom={5}\n              label={passwordFieldLabel()}\n              placeholder={t('wifi.password.placeholder')}\n              value={props.settings.password}\n              onChange={(e) => props.onPasswordChange(e.target.value)}\n              isInvalid={!!props.passwordError}\n              validationMessage={!!props.passwordError && props.passwordError}\n            />\n          )}\n        </Pane>\n      </Pane>\n      {!props.settings.hideTip && (\n        <>\n          <hr />\n          <Paragraph>\n            <CameraIcon />\n            <MobilePhoneIcon />\n            <Text size={300} paddingRight={8} paddingLeft={8}>\n              {t('wifi.tip')}\n            </Text>\n          </Paragraph>\n        </>\n      )}\n    </Card>\n  );\n};\n"
  },
  {
    "path": "src/components/style.css",
    "content": "@font-face {\n  font-family: 'Source Serif';\n  src: url(./SourceSerif4-Semibold.otf);\n}\n\n.card-print {\n  border-color: #aaa;\n  margin-bottom: 1em;\n  margin-top: 2em;\n  padding: 1em;\n}\n\n#print-area {\n  display: none;\n}\n\n.details {\n  display: flex;\n  align-items: center;\n}\n\n.qrcode {\n  max-width: 175px;\n  padding: 1em;\n}\n\n.hidden {\n  display: none;\n}\ntextarea {\n  background-color: #fff;\n  border: solid 1px #ddd;\n  font-family: 'Source Serif', serif !important;\n  font-size: 1.2em !important;\n  margin-bottom: 0;\n  height: 40px !important;\n  min-height: 0px !important;\n  overflow: hidden;\n  resize: none;\n}\ntextarea#password {\n  height: 60px !important;\n}\n\nhr {\n  margin-top: 0;\n}\n\nbutton {\n  height: 50px;\n  width: 180px;\n}\n\n#settings {\n  margin-bottom: 1em;\n  padding: 1em;\n}\n\n#settings label span {\n  margin-right: 8px;\n}\n\n@media print {\n  body * {\n    visibility: hidden;\n  }\n  #print-area,\n  #print-area * {\n    visibility: visible;\n    /* For printing, use a font stack that prioritizes system fonts \n       to ensure CJK characters are rendered correctly in Chrome. */\n    font-family:\n      'PingFang SC', 'Noto Sans SC', 'Noto Sans TC', 'Noto Sans JP',\n      'Noto Sans KR', 'Microsoft YaHei', serif;\n    font-weight: 500;\n    font-style: semibold;\n  }\n  #print-area {\n    position: absolute;\n    left: 0;\n    top: 0;\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-evenly;\n    row-gap: 0em;\n  }\n  .card-print {\n    border-style: dashed;\n    box-shadow: none;\n    margin-bottom: 0;\n    margin-top: 0;\n    break-inside: avoid;\n    page-break-inside: avoid;\n  }\n}\n"
  },
  {
    "path": "src/i18n.js",
    "content": "import i18n from 'i18next';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { initReactI18next } from 'react-i18next';\nimport { Translations } from './translations';\n\n// i18n wants a single object in the following format:\n// {\n//   'en-US': {\n//     translation: {\n//       title: 'WiFi Card',,\n//       ...\n//     }\n//   },\n// }\nconst resources = Translations.reduce((obj, curr) => {\n  obj[curr.id] = curr;\n  return obj;\n}, {});\n\ni18n\n  .use(initReactI18next)\n  .use(LanguageDetector)\n  .init({\n    fallbackLng: 'en-US',\n    resources,\n    interpolation: {\n      escapeValue: false,\n    },\n  });\n\nexport default i18n;\n"
  },
  {
    "path": "src/index.js",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport App from './App';\nimport './i18n';\n\nconst root = createRoot(document.getElementById('root'));\nroot.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>\n);\n"
  },
  {
    "path": "src/style.css",
    "content": "body {\n  margin: 0 auto;\n  max-width: 500px;\n  padding: 1em;\n}\n"
  },
  {
    "path": "src/translations.js",
    "content": "export const Translations = [\n  {\n    id: 'en-US',\n    name: 'English',\n    translation: {\n      title: 'WiFi Card',\n      'desc.use':\n        'Print a simple card with your WiFi login details. Tape it to the fridge, keep it in your wallet, etc.',\n      'desc.privacy':\n        'Your WiFi information is never sent to the server. No tracking, analytics, or fingerprinting are used on this website. View the',\n      'desc.source': 'source code',\n      'wifi.identity': 'Identity',\n      'wifi.identity.placeholder': 'Username',\n      'wifi.login': 'WiFi Login',\n      'wifi.name': 'Network name',\n      'wifi.name.hiddenSSID': 'Hidden SSID',\n      'cards.additional': 'Number of cards to print',\n      'cards.tip.hide': 'Hide tip (legend)',\n      'wifi.name.placeholder': 'WiFi Network name',\n      'wifi.password': 'Password',\n      'wifi.password.placeholder': 'Password',\n      'wifi.password.hide': 'Hide password',\n      'wifi.password.encryption': 'Encryption',\n      'wifi.password.encryption.none': 'None',\n      'wifi.encryption.eapMethod': 'EAP method',\n      'wifi.tip':\n        \"Point your phone's camera at the QR Code to connect automatically\",\n      'wifi.alert.name': 'Network name cannot be empty',\n      'wifi.alert.password': 'Password cannot be empty',\n      'wifi.alert.password.length.5':\n        'Password must be at least 5 characters, or change the encryption to \"None\"',\n      'wifi.alert.password.length.8':\n        'Password must be at least 8 characters, or change the encryption to \"None\"',\n      'wifi.alert.eapIdentity': 'Identity cannot be empty',\n      'button.rotate': 'Rotate',\n      'button.print': 'Print',\n      select: 'Select Language',\n    },\n  },\n  {\n    id: 'he-IL',\n    name: 'Hebrew - עברית',\n    rtl: true,\n    translation: {\n      title: 'כרטיס WiFi',\n      'desc.use':\n        'הדפיסו כרטיס פשוט עם פרטי הכניסה שלכם לרשת ה-WiFi. הדביקו אותו למקרר, שמרו אותו בארנק וכו.',\n      'desc.privacy':\n        'פרטי ה WiFi שלכם לעולם לא נשלחים לשרת. אתר זה אינו עוקב, משתמש באנליטיקות או טביעות אצבע. צפה ב',\n      'desc.source': 'קוד המקור',\n      'wifi.identity': 'זהות',\n      'wifi.identity.placeholder': 'שם משתמש',\n      'wifi.login': 'פרטי WiFi',\n      'wifi.name': 'שם רשת',\n      'wifi.name.hiddenSSID': 'רשת נסתרת (SSID)',\n      'cards.additional': 'מספר כרטיסים נוספים להדפסה',\n      'cards.tip.hide': 'הסתרת טיפ (מקרא)',\n      'wifi.name.placeholder': 'שם רשת WiFi',\n      'wifi.password': 'סיסמה',\n      'wifi.password.placeholder': 'סיסמה',\n      'wifi.password.hide': 'הסתר סיסמה',\n      'wifi.password.encryption': 'הצפנה',\n      'wifi.password.encryption.none': 'None',\n      'wifi.encryption.eapMethod': 'שיטת אימות EAP',\n      'wifi.tip': 'כוונו את מצלמת הטלפון אל קוד ה-QR כדי להתחבר אוטומטית',\n      'wifi.alert.name': 'שם רשת לא יכול להיות ריק',\n      'wifi.alert.password': 'סיסמה לא יכולה להיות ריקה',\n      'wifi.alert.password.length.5':\n        'הסיסמה חייבת להיות באורך של לפחות 5 תווים, או שנה את ההצפנה ל \"None\"',\n      'wifi.alert.password.length.8':\n        'הסיסמה חייבת להיות באורך של לפחות 8 תווים, או שנה את ההצפנה ל \"None\"',\n      'wifi.alert.eapIdentity': 'זהות לא יכולה להיות ריקה',\n      'button.rotate': 'סובב',\n      'button.print': 'הדפס',\n      select: 'בחר שפה',\n    },\n  },\n  {\n    id: 'sv-SE',\n    name: 'Swedish - Svenska',\n    translation: {\n      title: 'WiFi Kort',\n      'desc.use':\n        'Skriv ut ett enkelt kort med inloggningsuppgifter till ditt WiFI. Sätt upp det på kylskåpet eller ha det i din plånbok etc.',\n      'desc.privacy':\n        'Din WiFi information skickas aldrig till webbservern. Varken spårning, analys eller identifiering används på hemsidan. Se ',\n      'desc.source': 'källkoden',\n      'wifi.login': 'WiFi Inloggning',\n      'wifi.name': 'Nätverksnamn',\n      'wifi.name.hiddenSSID': 'Dolt SSID',\n      'wifi.name.placeholder': 'WiFi Nätverksnamn',\n      'wifi.password': 'Lösenord',\n      'wifi.password.placeholder': 'Lösenord',\n      'wifi.password.hide': 'Dölj lösenordet',\n      'wifi.password.encryption': 'Kryptering',\n      'wifi.password.encryption.none': 'Ingen',\n      'wifi.tip':\n        'Peka din telefons kamera mot QR-koden för att ansluta automatiskt',\n      'wifi.alert.name': 'Nätverksnamn måste fyllas i',\n      'wifi.alert.password.length.5':\n        'Lösenordet måste bestå av minst 5 tecken eller ändra kryptering till \"Ingen\"',\n      'wifi.alert.password.length.8':\n        'Lösenordet måste bestå av minst 8 tecken eller ändra kryptering till \"Ingen\"',\n      'button.rotate': 'Rotera',\n      'button.print': 'Skriv ut',\n      select: 'Välj språk',\n    },\n  },\n  {\n    id: 'no-NB',\n    name: 'Norwegian - Norsk',\n    translation: {\n      title: 'WiFi Kort',\n      'desc.use':\n        'Skriver ut et enkelt kort med dine Wifi innloggingsdetaljer. Sett det på kjøleskapet, ha det i lommeboka el. lign.',\n      'desc.privacy':\n        'Din wifi-informasjon blir aldri sendt til våre servere. Ingen sporing, analyse eller identifisering brukes på dette nettstedet. Se vår',\n      'desc.source': 'kildekode',\n      'wifi.login': 'WiFi Innlogging',\n      'wifi.name': 'Nettverksnavn',\n      'wifi.name.hiddenSSID': 'Skjult SSID',\n      'wifi.name.placeholder': 'WiFi Nettverksnavn',\n      'wifi.password': 'Passord',\n      'wifi.password.placeholder': 'Passord',\n      'wifi.password.hide': 'Skjul passordfeltet',\n      'wifi.password.encryption': 'Kryptering',\n      'wifi.password.encryption.none': 'Ingen',\n      'wifi.tip':\n        'Pek telefonens kamera mot QR koden for å koble til automatisk',\n      'wifi.alert.name': 'Nettverksnavnet kan ikke være tomt',\n      'wifi.alert.password.length.5':\n        'Passordet må være minst 5 karakterer, eller endre kryptering til \"Ingen\"',\n      'wifi.alert.password.length.8':\n        'Passordet må være minst 8 karakterer, eller endre kryptering til \"Ingen\"',\n      'button.rotate': 'Roter',\n      'button.print': 'Skriv ut',\n      select: 'Velg språk',\n    },\n  },\n  {\n    id: 'nl-NL',\n    name: 'Dutch - Nederlands',\n    translation: {\n      title: 'WiFi-Kaart',\n      'desc.use':\n        'Print een eenvoudige kaart met uw WiFi-inloggegevens. Plak het op je koelkast, stop het in je portemonnee, etc.',\n      'desc.privacy':\n        'Je WiFi-informatie wordt nooit naar de server verzonden. Tracking, analytics of fingerprinting wordt niet gebruikt op deze website. Bekijk de',\n      'desc.source': 'broncode',\n      'wifi.login': 'WiFi-login',\n      'wifi.name': 'Netwerknaam',\n      'wifi.name.placeholder': 'WiFi-netwerknaam',\n      'wifi.password': 'Wachtwoord',\n      'wifi.password.placeholder': 'Wachtwoord',\n      'wifi.password.hide': 'Verberg wachtwoord',\n      'wifi.name.hiddenSSID': 'Verborgen SSID',\n      'wifi.password.encryption': 'Encryptie',\n      'wifi.password.encryption.none': 'Geen',\n      'wifi.tip':\n        'Wijs met de camera van je telefoon naar de QR code om automatisch verbinding te maken',\n      'wifi.alert.name': 'Netwerknaam kan niet leeg zijn',\n      'wifi.alert.password.length.5':\n        'Wachtwoord moet ten minste 5 tekens bevatten, of verander de encryptie naar \"Geen\"',\n      'wifi.alert.password.length.8':\n        'Wachtwoord moet ten minste 8 tekens bevatten, of verander de encryptie naar \"Geen\"',\n      'button.rotate': 'Draai',\n      'button.print': 'Print',\n      select: 'Selecteer Taal',\n    },\n  },\n  {\n    id: 'zh-CN',\n    name: 'Simplified Chinese - 简体中文',\n    translation: {\n      title: 'Wi-Fi 连接卡',\n      'desc.use':\n        '打印一张带有 Wi-Fi 详细信息的登录卡片，把它贴到冰箱上、放到你的钱包里...',\n      'desc.privacy':\n        '您的 WiFi 信息永远不会发送到服务端。本网站不使用追踪、分析或指纹识别。查看',\n      'desc.source': '源码',\n      'cards.additional': '额外打印卡片数量',\n      'cards.tip.hide': '隐藏提示（图例）',\n      'wifi.identity': '身份',\n      'wifi.identity.placeholder': '用户名',\n      'wifi.login': '连接 WiFi',\n      'wifi.name': '网络名称',\n      'wifi.name.hiddenSSID': '隐藏 SSID',\n      'wifi.name.placeholder': 'WiFi 网络名称',\n      'wifi.password': '密码',\n      'wifi.password.placeholder': '密码',\n      'wifi.password.hide': '隐藏密码',\n      'wifi.password.encryption': '加密',\n      'wifi.password.encryption.none': '无',\n      'wifi.encryption.eapMethod': 'EAP 加密方式',\n      'wifi.tip': '将手机摄像头对准二维码即可自动连接',\n      'wifi.alert.name': '网络名称不能为空',\n      'wifi.alert.password.length.5':\n        '密码必须至少为 5 个字符，或将加密更改为“无”',\n      'wifi.alert.password.length.8':\n        '密码必须至少为 8 个字符，或将加密更改为“无”',\n      'button.rotate': '翻转',\n      'button.print': '打印',\n      select: '选择语言',\n    },\n  },\n  {\n    id: 'zh-HK',\n    name: 'Traditional Chinese - 繁體中文 香港',\n    translation: {\n      title: 'Wi-Fi 連接咭',\n      'desc.use':\n        '打印一張 Wi-Fi 詳細資料嘅連接卡，你可以將佢癡喺雪櫃上面、放喺銀包入面... ',\n      'desc.privacy':\n        '你嘅 Wi-Fi 資料永遠唔會傳送去網站伺服器。呢個網站唔會使用任何追蹤、分析或者裝置指紋辨識。',\n      'desc.source': '撳呢度睇源代碼',\n      'cards.additional': '要打印幾多張 Wi-Fi 卡片？',\n      'cards.tip.hide': '隱藏提示（圖例）',\n      'wifi.login': '連接 Wi-Fi',\n      'wifi.name': '網絡名稱',\n      'wifi.name.hiddenSSID': '隐藏 SSID',\n      'wifi.name.placeholder': 'Wi-Fi 網絡名稱',\n      'wifi.password': '密碼',\n      'wifi.password.placeholder': '密碼',\n      'wifi.password.hide': '隐藏密码',\n      'wifi.password.encryption': '加密',\n      'wifi.password.encryption.none': '没有任何',\n      'wifi.tip': '打開相機指住嗰QR Code就可以連接 WiFi',\n      'wifi.alert.name': '唔可以留空網絡名稱',\n      'wifi.alert.password.length.5':\n        '密碼必須至少有 5 个字串，你亦都可以将加密方式更改为“没有任何”',\n      'wifi.alert.password.length.8':\n        '密碼必須至少有 8 个字串，你亦都可以将加密方式更改为“没有任何”',\n      'button.rotate': '翻轉',\n      'button.print': '打印',\n      select: '選擇語言',\n    },\n  },\n  {\n    id: 'yue-CN',\n    name: 'Simplified Cantonese - 简体粤语',\n    translation: {\n      title: 'Wi-Fi 连接咭',\n      'desc.use':\n        '打印一张带有 Wi-Fi 详细信息嘅连接咭，你可以将佢黐喺冰箱上面，或者放喺银包入面...',\n      'desc.privacy':\n        '你嘅 Wi-Fi 信息永远不会发送到服务端。本网站不使用追踪、分析或指纹识别。',\n      'desc.source': '喺度睇源代码',\n      'cards.additional': '要*多打印*多少张 Wi-Fi 卡片？',\n      'cards.tip.hide': '隐藏提示（图例）',\n      'wifi.identity': '身份',\n      'wifi.identity.placeholder': '用户名',\n      'wifi.login': '连接 Wi-Fi',\n      'wifi.name': '网络名称',\n      'wifi.name.hiddenSSID': '呢个 Wi-Fi 嘅名收埋起身咗 ',\n      'wifi.name.placeholder': 'Wi-Fi 网络名称',\n      'wifi.password': '密码',\n      'wifi.password.placeholder': '密码',\n      'wifi.password.hide': '唔显示明文密码',\n      'wifi.password.encryption': '加密',\n      'wifi.password.encryption.none': '冇',\n      'wifi.encryption.eapMethod': 'EAP 加密方式',\n      'wifi.tip': '打开摄像头指住个二维码就可以连上呢个 Wi-Fi',\n      'wifi.alert.name': '网络名称唔可以为空',\n      'wifi.alert.password.length.5':\n        '密码必须至少有 5 个字符，你亦可以将加密方式更改为“冇”',\n      'wifi.alert.password.length.8':\n        '密码必须至少有 8 个字符，你亦可以将加密方式更改为“冇”',\n      'button.rotate': '翻转方向',\n      'button.print': '打印',\n      select: '选择语言',\n    },\n  },\n  {\n    id: 'zh-TW',\n    name: 'Traditional Chinese - 繁體中文 台灣',\n    translation: {\n      title: 'Wi-Fi Card',\n      'desc.use':\n        '列印一張含有 Wi-Fi 連接資訊的卡片，將它貼在冰箱、放在你的錢包裡... ',\n      'desc.privacy':\n        '您的 Wi-Fi 訊息永遠不會被送到伺服器。本網站不使用追蹤、分析或指紋識別。查看',\n      'desc.source': '原始碼',\n      'cards.additional': '额外列印卡片數量',\n      'cards.tip.hide': '隱藏提示（圖例）',\n      'wifi.login': '連接 WiFi',\n      'wifi.name': '網路名稱',\n      'wifi.name.hiddenSSID': '隱藏 SSID',\n      'wifi.name.placeholder': 'WiFi 網路名稱',\n      'wifi.password': '密碼',\n      'wifi.password.placeholder': '密碼',\n      'wifi.password.hide': '隱藏密碼',\n      'wifi.password.encryption': '加密',\n      'wifi.password.encryption.none': '無',\n      'wifi.tip': '將手機相機對準 QR Code 即可自動連接 WiFi',\n      'wifi.alert.name': '網路名稱不可以留空',\n      'wifi.alert.password.length.5':\n        '密碼至少為 5 個字元以上，或將加密改為\"無\"',\n      'wifi.alert.password.length.8':\n        '密碼至少為 8 個字元以上，或將加密改為\"無\"',\n      'button.rotate': '翻轉',\n      'button.print': '列印',\n      select: '選擇語言',\n    },\n  },\n  {\n    id: 'es',\n    name: 'Spanish - Español',\n    translation: {\n      title: 'Tarjeta WiFi',\n      'desc.use':\n        'Imprima una sencilla tarjeta con sus datos de acceso a la WiFi. Pégela en la nevera, guárdela en la cartera, etc.',\n      'desc.privacy':\n        'Su información WiFi nunca se envía al servidor. En este sitio web no se utiliza ningún tipo de rastreo, análisis o huella digital. Ver el',\n      'desc.source': 'código fuente',\n      'wifi.login': 'Acceso WiFi',\n      'wifi.name': 'Nombre de la red',\n      'wifi.name.placeholder': 'Nombre de la red WiFi',\n      'wifi.password': 'Contraseña',\n      'wifi.password.placeholder': 'Contraseña',\n      'wifi.name.hiddenSSID': 'SSID oculta',\n      'wifi.password.hide': 'Ocultar contraseña',\n      'wifi.password.encryption': 'Cifrado',\n      'wifi.password.encryption.none': 'Ninguno',\n      'wifi.tip':\n        'Apunte la cámara de su teléfono al código QR para conectarse automáticamente',\n      'wifi.alert.name': 'El nombre de la red no puede estar vacío',\n      'wifi.alert.password.length.5':\n        'La contraseña debe tener al menos 5 caracteres, o cambiar el cifrado a \"Ninguno\"',\n      'wifi.alert.password.length.8':\n        'La contraseña debe tener al menos 8 caracteres, o cambiar el cifrado a \"Ninguno\"',\n      'button.rotate': 'Girar',\n      'button.print': 'Imprimir',\n      select: 'Seleccionar idioma',\n    },\n  },\n  {\n    id: 'pt',\n    name: 'Portuguese - Português',\n    translation: {\n      title: 'Cartão WiFi',\n      'desc.use':\n        'Imprima um cartão com detalhes de autenticação da sua rede WiFi. Cole no frigorifico, na sala, etc.',\n      'desc.privacy':\n        'As informações da sua rede WiFi não são enviadas para o servidor. Nenhum dado é recolhido pelo website. Veja o',\n      'desc.source': 'código fonte',\n      'wifi.login': 'Autenticação WiFi ',\n      'wifi.name': 'Nome da Rede',\n      'wifi.name.placeholder': 'Nome da sua rede WiFi',\n      'wifi.password': 'Senha',\n      'wifi.password.placeholder': 'Senha da sua rede WiFi',\n      'wifi.password.hide': 'Esconder o campo de senha antes da impressão',\n      'wifi.name.hiddenSSID': 'Rede oculta',\n      'wifi.password.encryption': 'Criptografia',\n      'wifi.password.encryption.none': 'Nenhum',\n      'wifi.tip':\n        'Abra a aplicação da câmera no seu telemóvel e aponte para o QR Code para se ligar automaticamente.',\n      'wifi.alert.name': 'O Nome da rede não pode ficar em branco',\n      'wifi.alert.password.length.5':\n        'A senha precisa ter no mínimo 5 dígitos, ou alterar a criptografia para \"Nenhum\"',\n      'wifi.alert.password.length.8':\n        'A senha precisa ter no mínimo 8 dígitos, ou alterar a criptografia para \"Nenhum\"',\n      'button.rotate': 'Girar',\n      'button.print': 'Imprimir',\n      select: 'Selecionar Idioma',\n    },\n  },\n  {\n    id: 'ja',\n    name: 'Japanese - 日本語',\n    translation: {\n      title: 'WiFi ログイン',\n      'desc.use':\n        'WiFiのログイン情報を記載したシンプルなカードを印刷します。冷蔵庫に貼ったり、お財布に入れたりしてください。',\n      'desc.privacy':\n        'お客様のWiFi情報がサーバーに送信されることはありません。このウェブサイトでは、トラッキング、アナリティクス、フィンガープリントは使用されていません。確認する',\n      'desc.source': 'ソースコード',\n      'wifi.login': ' WiFi ログイン',\n      'wifi.name': 'ネットワーク名',\n      'wifi.name.hiddenSSID': '隠しSSID',\n      'wifi.name.placeholder': 'WiFi ネットワーク名',\n      'wifi.password': 'パスワード',\n      'wifi.password.placeholder': 'パスワード',\n      'wifi.password.hide': 'パスワードを非表示にする',\n      'wifi.password.encryption': '暗号化',\n      'wifi.password.encryption.none': 'なし',\n      'wifi.tip': '携帯電話のカメラをQRコードに向けると、自動的に接続されます',\n      'wifi.alert.name': 'ネットワーク名は空にできません',\n      'wifi.alert.password.length.5':\n        'パスワードを5文字以上にするか、暗号化を「なし」に変更してください',\n      'wifi.alert.password.length.8':\n        'パスワードを8文字以上にするか、暗号化を「なし」に変更してください',\n      'button.rotate': '回転する',\n      'button.print': '印刷する',\n      select: '言語を選択',\n    },\n  },\n  {\n    id: 'ru-RU',\n    name: 'Russian - Русский',\n    translation: {\n      title: 'Карта WiFi',\n      'desc.use':\n        'Распечатайте простую карточку с данными для входа в WiFi. Приклейте ее на холодильник, храните в бумажнике и т.д.',\n      'desc.privacy':\n        'Информация о вашем WiFi никогда не отправляется на сервер. На этом сайте не используется отслеживание, аналитика или цифровые отпечатки. Посмотреть',\n      'desc.source': 'исходный код',\n      'wifi.login': 'Вход в WiFi',\n      'wifi.name': 'Название сети',\n      'wifi.name.hiddenSSID': 'Скрытый SSID',\n      'wifi.name.placeholder': 'Название сети WiFi',\n      'wifi.password': 'Пароль',\n      'wifi.password.placeholder': 'Пароль',\n      'wifi.password.hide': 'Скрыть поле пароля',\n      'wifi.password.encryption': 'Шифрование',\n      'wifi.password.encryption.none': 'Нет',\n      'wifi.tip':\n        'Наведите камеру телефона на QR-код для автоматического подключения',\n      'wifi.alert.name': 'Название сети не может быть пустым',\n      'wifi.alert.password.length.5':\n        'Пароль должен состоять не менее чем из 5 символов, в противном случае измените шифрование на \"Нет\"',\n      'wifi.alert.password.length.8':\n        'Пароль должен состоять не менее чем из 8 символов, в противном случае измените шифрование на \"Нет\"',\n      'button.rotate': 'Повернуть',\n      'button.print': 'Распечатать',\n      select: 'Выбор языка',\n    },\n  },\n  {\n    id: 'fa-IR',\n    name: 'Persian Iran - فارسی',\n    rtl: true,\n    translation: {\n      title: 'کارت WiFi',\n      'desc.use':\n        'توسط اطلاعات شبکه WiFi خود یک کارت ساده چاپ کنید و آن را به یخچال بچسبانید و یا در کیف پول خود نگه دارید.',\n      'desc.privacy':\n        'اطلاعات شبکه شما هرگز به سرور ارسال نمی‌شود و هیچگونه ردیابی، آنالیز و یا تحلیل در این وب سایت انجام نمی‌شود. مشاهده ',\n      'desc.source': 'سورس کد',\n      'wifi.login': 'اتصال به شبکه WiFi',\n      'wifi.name': 'نام شبکه',\n      'wifi.name.placeholder': 'نام شبکه خود را وارد کنید',\n      'wifi.password': 'رمز‌عبور',\n      'wifi.password.placeholder': 'رمز‌عبور شبکه خود را وارد کنید',\n      'wifi.password.hide': 'رمز‌عبور را بعد از چاپ کارت مخفی کن.',\n      'wifi.password.encryption': 'رمزنگاری',\n      'wifi.password.encryption.none': 'هیچ یک',\n      'wifi.tip':\n        'دوربین تلفن خود را روی تصویر (QR Code) گرفته تا به صورت خودکار به شبکه متصل شوید.',\n      'wifi.alert.name': 'اسم شبکه شما نباید خالی باشد.',\n      'wifi.alert.password.length.5': 'رمز‌عبور باید حداقل ۵ حرف داشته باشد.',\n      'wifi.alert.password.8': 'رمز‌عبور باید حداقل ۸ حرف داشته باشد.',\n      'button.rotate': 'چرخاندن',\n      'button.print': 'چاپ',\n      select: 'انتخاب زبان',\n    },\n  },\n  {\n    id: 'uk-UA',\n    name: 'Ukrainian - Українська',\n    translation: {\n      title: 'Карта WiFi',\n      'desc.use':\n        'Роздрукуйте просту картку з даними для входу в WiFi. Приклейте її на холодильник, зберігайте в гаманці і т.д.',\n      'desc.privacy':\n        'Інформація про ваш WiFi ніколи не відправляється на сервер. На цьому сайті не використовується відстеження, аналітика або цифрові відбитки. Переглянути',\n      'desc.source': 'вихідний код',\n      'wifi.login': 'Вхід в WiFi',\n      'wifi.name': 'Назва мережі',\n      'wifi.name.hiddenSSID': 'Прихований SSID',\n      'wifi.name.placeholder': 'Назва мережі WiFi',\n      'wifi.password': 'Пароль',\n      'wifi.password.placeholder': 'Пароль',\n      'wifi.password.hide': 'Приховати поле пароля',\n      'wifi.password.encryption': 'Шифрування',\n      'wifi.password.encryption.none': 'Немає',\n      'wifi.tip':\n        'Наведіть камеру телефону на QR-код, щоб автоматично підключитися',\n      'wifi.alert.name': 'Назва мережі не може бути порожньою',\n      'wifi.alert.password.length.5':\n        'Пароль повинен складатися не менше ніж з 5 символів, в іншому випадку змініть шифрування на \"Немає\"',\n      'wifi.alert.password.length.8':\n        'Пароль повинен складатися не менше ніж з 8 символів, в іншому випадку змініть шифрування на \"Немає\"',\n      'button.rotate': 'Повернути',\n      'button.print': 'Друкувати',\n      select: 'Вибір мови',\n    },\n  },\n  {\n    id: 'de-DE',\n    name: 'German - Deutsch',\n    translation: {\n      title: 'WLAN-Karte',\n      'desc.use':\n        'Druck dir eine simple Karte mit deinen WLAN-Zugangsdaten aus. Klebe sie an deinen Kühlschrank, behalte sie in deinem Portemonnaie, etc.',\n      'desc.privacy':\n        'Deine Zugangsdaten werden niemals zum Server gesendet. Es gibt kein Tracking, Fingerprinting und auch keine Analytics auf dieser Website. Hier geht es zum',\n      'desc.source': 'Quellcode',\n      'wifi.identity': 'Identität',\n      'wifi.identity.placeholder': 'Nutzername',\n      'wifi.login': 'WLAN-Zugangsdaten',\n      'wifi.name': 'WLAN-Netzwerkname (SSID)',\n      'wifi.name.placeholder': 'WLAN-Netzwerkname (SSID)',\n      'wifi.password': 'Passwort',\n      'wifi.password.placeholder': 'Passwort',\n      'wifi.password.hide': 'Passwort verstecken',\n      'wifi.name.hiddenSSID': 'Versteckte SSID',\n      'cards.additional': 'Anzahl',\n      'cards.tip.hide': 'Hinweis verstecken (Legende)',\n      'wifi.password.encryption': 'Verschlüsselung',\n      'wifi.password.encryption.none': 'Keine',\n      'wifi.encryption.eapMethod': 'EAP-Methode',\n      'wifi.tip':\n        'Zeige mit der Kamera deines Handys auf den QR-Code, um automatisch eine Verbindung herzustellen',\n      'wifi.alert.name': 'Der Netzwerkname darf nicht leer sein',\n      'wifi.alert.password': 'Das Passwort darf nicht leer sein',\n      'wifi.alert.password.length.5':\n        'Das Passwort muss mindestends 5 Zeichen lang sein, oder stelle die Verschlüsselung auf \"Keine\"',\n      'wifi.alert.password.8':\n        'Das Passwort muss mindestends 8 Zeichen lang sein, oder stelle die Verschlüsselung auf \"Keine\"',\n      'wifi.alert.eapIdentity': 'Die Identität darf nicht leer sein',\n      'button.rotate': 'Drehen',\n      'button.print': 'Drucken',\n      select: 'Sprache auswählen',\n    },\n  },\n  {\n    id: 'de-CH',\n    name: 'German - Schwizerdütsch',\n    translation: {\n      title: 'simple.WiFi Card Creator',\n      'desc.use':\n        '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.',\n      'desc.private': 'Dini Zugegangsdate werded nie zom Server gsändet.',\n      'wifi.identity': 'Identität',\n      'wifi.identity.placeholder': 'Notzername',\n      'wifi.login': 'WLAN-Zugangsdate',\n      'wifi.name': 'WLAN-Netzwärchname',\n      'wifi.name.placeholder': 'WLAN-Netzwärchname',\n      'wifi.password': 'Passwort',\n      'wifi.password.placeholder': 'Passwort',\n      'wifi.password.hide': 'Passwort verstecke',\n      'wifi.name.hiddenSSID': 'Versteckti SSID',\n      'wifi.password.encryption': 'Verschlösselig',\n      'wifi.password.encryption.none': 'Keini',\n      'wifi.encryption.eapMethod': 'EAP Methode',\n      'wifi.tip':\n        'Zeig mit dinere Kamera vom Handys auf de QR-Code, um automatisch en Verbindung herzstelle',\n      'wifi.alert.name': 'De Netzwerkname dörf ned leer sii',\n      'wifi.alert.password': 'Das Passwort dörf ned leer sii',\n      'wifi.alert.password.length.5':\n        'Das Passwort muss mendestends 5 Zeiche lang sii, oder stell d Verschlösselig auf \"Keini\"',\n      'wifi.alert.password.8':\n        'Das Passwort muss mindestends 8 Zeichen lang sii, oder stell d Verschlösselig auf \"Keini\"',\n      'wifi.alert.eapIdentity': 'Die Identität darf ned leer sii',\n      'button.rotate': 'Dreie',\n      'button.print': 'Drocke',\n      select: 'Sprach uswähle',\n    },\n  },\n  {\n    id: 'el-GR',\n    name: 'Greek - Hellenic',\n    translation: {\n      title: 'WiFi Card',\n      'desc.use':\n        'Εκτυπώστε μια απλή κάρτα με τις πληροφορίες πρόσβασης στο WiFi δίκτυό σας. Κολλήστε την στο ψυγείο ή βάλτε τη στο πορτοφόλι σας, κτλ.',\n      'desc.privacy':\n        'Οι πληροφορίες που σχετίζονται με το δίκτυο WiFi δεν αποστέλλονται στον διακομιστή. Καμιά ιχνηλάτηση, στατιστική ανάλυση ή ταυτοποίηση δεν πραγματοποιείται από αυτή την ιστοσελίδα. Δείτε τον',\n      'desc.source': 'πηγαίο κώδικα',\n      'wifi.identity': 'Ταυτότητα',\n      'wifi.identity.placeholder': 'όνομα χρήστη',\n      'wifi.login': 'Πληροφορίες WiFi',\n      'wifi.name': 'Όνομα δικτύου',\n      'wifi.name.hiddenSSID': 'Κρυφό SSID',\n      'wifi.name.placeholder': 'όνομα δικτύου',\n      'wifi.password': 'Κωδικός πρόσβασης',\n      'wifi.password.placeholder': 'κωδικός πρόσβασης',\n      'wifi.password.hide': 'Απόκρυψη κωδικού πρόσβασης',\n      'wifi.password.encryption': 'Κρυπτογράφηση',\n      'wifi.password.encryption.none': 'Καμία',\n      'wifi.encryption.eapMethod': 'Μέθοδος EAP',\n      'wifi.tip':\n        'Στρέψτε την κάμερα του κινητού σας προς τον κώδικα QR για να συνδεθείτε αυτόματα',\n      'wifi.alert.name': 'Το όνομα δικτύου δεν μπορεί να είναι κενό',\n      'wifi.alert.password': 'Ο κωδικός πρόσβασης δεν μπορεί να είναι κενός',\n      'wifi.alert.password.length.5':\n        'Ο κωδικός πρόσβασης πρέπει να αποτελείται από τουλάχιστον 5 χαρακτήρες, διαφορετικά αλλάξτε την κρυπτογράφηση σε \"Καμία\"',\n      'wifi.alert.password.length.8':\n        'Ο κωδικός πρόσβασης πρέπει να αποτελείται από τουλάχιστον 8 χαρακτήρες, διαφορετικά αλλάξτε την κρυπτογράφηση σε \"Καμία\"',\n      'wifi.alert.eapIdentity': 'Η ταυτότητα δεν μπορεί να είναι κενή.',\n      'button.rotate': 'Περιστροφή',\n      'button.print': 'Εκτύπωση',\n      select: 'Επιλέξτε γλώσσα',\n    },\n  },\n  {\n    id: 'pl-PL',\n    name: 'Polish - Polski',\n    translation: {\n      title: 'Karta WiFi',\n      'desc.use':\n        'Wydrukuj prostą kartę z danymi logowania do sieci Wi-Fi. Przyklej go do lodówki, trzymaj w portfelu, itp.',\n      'desc.privacy':\n        'Twoje informacje o Wi-Fi nigdy nie są wysyłane na serwer. Na tej stronie nie stosuje się śledzenia, analiz ani odcisków palców. Zobacz',\n      'desc.source': 'kod źródłowy',\n      'wifi.login': 'Logowanie do WiFi',\n      'wifi.size': 'Rozmiar',\n      'wifi.size.small': 'Mały',\n      'wifi.size.medium': 'Średni',\n      'wifi.size.large': 'Duży',\n      'wifi.name': 'Nazwa sieci',\n      'wifi.name.hiddenSSID': 'Ukryj SSID sieci WiFi',\n      'wifi.name.placeholder': 'Nazwa sieci WiFi',\n      'wifi.password': 'Hasło',\n      'wifi.password.placeholder': 'Hasło',\n      'wifi.password.hide': 'Ukryj pole hasła przed wydrukowaniem',\n      'wifi.password.encryption': 'Szyfrowanie',\n      'wifi.password.encryption.none': 'Brak',\n      'wifi.tip':\n        'Skieruj aparat telefonu na kod QR, aby połączyć się automatycznie',\n      'wifi.alert.name': 'Nazwa sieci nie może być pusta',\n      'wifi.alert.password.length.5':\n        'Hasło musi mieć co najmniej 5 znaków lub zmień szyfrowanie na „Brak”',\n      'wifi.alert.password.8':\n        'Hasło musi mieć co najmniej 8 znaków lub zmień szyfrowanie na „Brak”',\n      'button.rotate': 'Obróć',\n      'button.print': 'Drukuj',\n      select: 'Wybierz język',\n    },\n  },\n  {\n    id: 'fr-FR',\n    name: 'French - Français',\n    translation: {\n      title: 'Carte Wi-Fi',\n      'desc.use':\n        'Imprimez une carte simple avec vos informations de connexion Wi-Fi. Collez-la sur le réfrigérateur, gardez-la dans votre portefeuille, etc.',\n      'desc.privacy':\n        'Vos informations Wi-Fi ne sont jamais envoyées au serveur. Aucun suivi, analyse ou prise empreinte digitale ne sont utilisés sur ce site Web. Voir le',\n      'desc.source': 'code source',\n      'wifi.login': 'Connexion Wi-Fi',\n      'wifi.name': 'Nom du réseau',\n      'wifi.name.placeholder': 'Nom du réseau Wi-Fi',\n      'wifi.name.hiddenSSID': 'SSID masqué',\n      'cards.additional': 'Nombre de cartes a imprimer',\n      'cards.tip.hide': 'Masquer la légende',\n      'wifi.password': 'Mot de passe',\n      'wifi.password.placeholder': 'Mot de passe',\n      'wifi.password.hide': 'Masquer le mot de passe',\n      'wifi.password.encryption': 'Chiffrement',\n      'wifi.password.encryption.none': 'Aucun',\n      'wifi.tip':\n        \"Dirigez l'appareil photo de votre téléphone vers le QR code pour vous connecter automatiquement\",\n      'wifi.alert.name': 'Le nom du réseau ne peut pas être vide',\n      'wifi.alert.password.length.5':\n        'Le mot de passe doit au moins faire 5 caractères, ou changez le chiffrement en \"Aucun\"',\n      'wifi.alert.password.8':\n        'Le mot de passe doit au moins faire 8 caractères, ou changez le chiffrement en \"Aucun\"',\n      'button.rotate': 'Pivoter',\n      'button.print': 'Imprimer',\n      select: 'Choisir la langue',\n    },\n  },\n  {\n    id: 'oc',\n    name: 'Occitan',\n    translation: {\n      title: 'Carta WiFi',\n      'desc.use':\n        'Imprimissètz una carta simpla amb vòstras informacions de connexion WiFi. Pegatz-la al refregidor, gardatz-la al pòrtafuèlha, etc.',\n      'desc.privacy':\n        \"Vòstras informacions WiFi son pas jamai enviadas al servidor. Cap de seguiment, d'analisi o de generacion d'emprenta numerica son pas realizats sus aqueste site Web. Veire lo\",\n      'desc.source': 'còdi font',\n      'wifi.identity': 'Identitat',\n      'wifi.identity.placeholder': 'Nom d’utilizaire',\n      'wifi.login': 'Connexion Wi-Fi',\n      'wifi.name': 'Nom de la ret',\n      'wifi.name.hiddenSSID': 'SSID amagat',\n      'cards.additional': 'Carta suplementàrias d’imprimir',\n      'cards.tip.hide': 'Rescondre astúcia (legenda)',\n      'wifi.name.placeholder': 'Nom de la ret WiFi',\n      'wifi.password': 'Senhal',\n      'wifi.password.placeholder': 'Senhal',\n      'wifi.password.hide': 'Rescondre lo senhal',\n      'wifi.password.encryption': 'Chiframent',\n      'wifi.password.encryption.none': 'Cap',\n      'wifi.encryption.eapMethod': 'Metòde EAP',\n      'wifi.tip':\n        'Viratz vòstre aparelh fòto cap al còdi QR per vos connectar automaticament',\n      'wifi.alert.name': 'Lo nom de la ret pòt pas èsser void',\n      'wifi.alert.password': 'Lo senhal pòt pas èsser void',\n      'wifi.alert.password.length.5':\n        'Lo senhal deu conténer almens 5 caractèrs o cambiatz lo chiframent per « Cap »',\n      'wifi.alert.password.8':\n        'Lo senhal deu conténer almens 8 caractèrs o cambiatz lo chiframent per « Cap »',\n      'wifi.alert.eapIdentity': 'L’identitat pòt pas èsser voide',\n      'button.rotate': 'Pivotar',\n      'button.print': 'Imprimir',\n      select: 'Causir la lenga',\n    },\n  },\n  {\n    id: 'pt-BR',\n    name: 'Portuguese - Português brasileiro',\n    translation: {\n      title: 'Cartão WiFi',\n      'desc.use':\n        'Imprime um simples cartão com os dados de login de sua WiFi. Cole na sua geladeira, guarde na sua carteira etc.',\n      'desc.privacy':\n        'As informações da sua WiFi nunca será enviada para o servidor. Nenhum serviço de tracking, analytics ou fingerprint é usado nesse site. Veja o',\n      'desc.source': 'código fonte',\n      'wifi.login': 'WiFi Login',\n      'wifi.name': 'Nome da rede',\n      'wifi.name.placeholder': 'Nome da Rede',\n      'wifi.password': 'Senha',\n      'wifi.password.placeholder': 'Senha',\n      'wifi.password.hide': 'Esconder Senha',\n      'wifi.name.hiddenSSID': 'Esconder SSID',\n      'wifi.password.encryption': 'Tipo de Segurança',\n      'wifi.password.encryption.none': 'Nenhum',\n      'wifi.tip':\n        'Aponte a camera do seu celular para o código QR para se conectar automaticamente.',\n      'wifi.alert.name': 'Nome da rede não pode estar em branco',\n      'wifi.alert.password.length.5':\n        'Sua senha deve ter pelo menos 5 caracteres, ou  altere a criptografia para \"Nenhum\"',\n      'wifi.alert.password.8':\n        'Sua senha deve ter pelo menos 8 caracteres, ou  altere a criptografia para \"Nenhum\"',\n      'button.rotate': 'Rotacionar',\n      'button.print': 'Imprimir',\n      select: 'Escolha o idioma',\n    },\n  },\n  {\n    id: 'it-IT',\n    name: 'Italian',\n    translation: {\n      title: 'WiFi Card',\n      'desc.use':\n        'Stampa una scheda con le informazioni di accesso WiFi. Attaccala al frigo, tienila nel portafogli etc.',\n      'desc.privacy':\n        'Le informazioni del tuo WiFi non verranno mai inviate ai nostri server. Nessun tracciamento, analytics, o fingerprinting viene usato su questo sito. Visiona le',\n      'desc.source': 'codice sorgente',\n      'wifi.login': 'WiFi Login',\n      'wifi.name': 'Nome della rete',\n      'wifi.name.placeholder': 'Nome della rete wifi',\n      'wifi.password': 'Password',\n      'wifi.password.placeholder': 'Password',\n      'wifi.password.hide': 'Nascondi password',\n      'wifi.name.hiddenSSID': 'SSID nascosto',\n      'wifi.password.encryption': 'Cifratura',\n      'wifi.password.encryption.none': 'Nessuno',\n      'wifi.tip':\n        'Inquadra il codice QR con il tuo smartphone per collegarti automaticamente',\n      'wifi.alert.name': 'Il nome della rete wifi non può essere vuoto',\n      'wifi.alert.password.length.5':\n        'La password deve contenere almeno 5 caratteri',\n      'wifi.alert.password.length.8':\n        'La password deve contenere almeno 8 caratteri',\n      'button.rotate': 'Ruota',\n      'button.print': 'Stampa',\n      select: 'Seleziona una lingua',\n    },\n  },\n  {\n    id: 'tr-TR',\n    name: 'Turkish - Türkçe',\n    translation: {\n      title: 'WiFi Kartı',\n      'desc.use':\n        'WiFi giriş bilgilerinizle basit bir kart yazdırın. Buzdolabına bantlayın, cüzdanınızda saklayın vb.',\n      'desc.privacy':\n        'WiFi bilgileriniz asla sunucuya gönderilmez. Bu web sitesinde hiçbir izleme, analiz veya parmak izi kullanılmamaktadır. Görüntüle',\n      'desc.source': 'kaynak kodu',\n      'wifi.login': 'WiFi Giriş',\n      'wifi.name': 'Ağ adı',\n      'wifi.name.placeholder': 'WiFi Ağ adı',\n      'wifi.password': 'Parola',\n      'wifi.password.placeholder': 'Parola',\n      'wifi.password.hide': 'Şifreyi gizle',\n      'wifi.name.hiddenSSID': 'Gizli SSID',\n      'wifi.password.encryption': 'Şifreleme',\n      'wifi.password.encryption.none': 'Hiçbiri',\n      'wifi.tip':\n        'Otomatik olarak bağlanmak için telefonunuzun kamerası ile QR kodunu okutun',\n      'wifi.alert.name': 'Ağ adı boş olamaz',\n      'wifi.alert.password.length.5':\n        'Şifre en az 5 karakter olmalıdır veya şifrelemeyi \"Yok\" olarak değiştirin',\n      'wifi.alert.password.length.8':\n        'Şifre en az 8 karakter olmalıdır veya şifrelemeyi \"Yok\" olarak değiştirin',\n      'button.rotate': 'Döndür',\n      'button.print': 'Yazdır',\n      select: 'Dil Seçin',\n    },\n  },\n  {\n    id: 'ar',\n    name: 'Arabic - العربية',\n    rtl: true,\n    translation: {\n      title: 'بطاقة واي فاي',\n      'desc.use':\n        'اطبع بطاقة بسيطة تحتوي على تفاصيل تسجيل الدخول إلى شبكة الواي فاي. إلصقها على الثلاجة، اوإحتفظ بها في محفظتك.',\n      'desc.privacy':\n        'لا يتم إرسال بيانات الشبكة الخاصة بك إلى الخادم او اي اماكن اخري. لا يتم استخدام التتبع أو التحليلات أو البصمات الإلكترونية أو حفظ البيانات على هذا الموقع. اعرض ملف',\n      'desc.source': 'البرنامج',\n      'wifi.login': 'تسجيل الدخول',\n      'wifi.name': 'إسم الشبكة',\n      'wifi.name.hiddenSSID': 'مخفي SSID',\n      'wifi.name.placeholder': 'إسم الشبكة',\n      'wifi.password': 'كلمه المرور',\n      'wifi.password.placeholder': 'كلمه المرور',\n      'wifi.password.hide': 'إخفاء حقل كلمة المرور قبل الطباعة',\n      'wifi.password.encryption': 'التشفير',\n      'wifi.password.encryption.none': 'لا يوجد',\n      'wifi.tip':\n        'وجّه كاميرا هاتفك إلى رمز الاستجابة السريعة للاتصال تلقائيًا',\n      'wifi.alert.name': 'ًلا يمكن أن يكون اسم الشبكة فارغًا',\n      'wifi.alert.password.length.5':\n        'يجب أن تكون كلمة المرور مكونة من ٥ أحرف على الأقل',\n      'wifi.alert.password.length.8':\n        'يجب أن تكون كلمة المرور مكونة من ٨ أحرف على الأقل',\n      'button.rotate': 'تدوير',\n      'button.print': 'طباعة',\n      select: 'اختر اللغة',\n    },\n  },\n  {\n    id: 'hi-IN',\n    name: 'Hindi - हिन्दी',\n    translation: {\n      title: 'वाईफाई कार्ड',\n      'desc.use':\n        'अपने वाईफाई लॉगिन की जानकारी एक साधारण कार्ड पे प्रिंट करे। अपने फ्रिज पर लगाएं, अपने बटुए में रखें, आदि।',\n      'desc.privacy':\n        'आपके वाईफाई की जानकारी कभी किसी सर्वर पर नहीं भेजी जाती। इस वेबसाइट पर ट्रैकिंग , एनालिटिक्स या फिंगरप्रिंटिंग का इस्तेमाल नहीं होता।',\n      'desc.source': 'सोर्स कोड देखो',\n      'wifi.login': 'वाईफाई लॉगिन',\n      'wifi.name': 'नेटवर्क का नाम',\n      'wifi.name.placeholder': 'वाईफाई नेटवर्क का नाम',\n      'wifi.password': 'पासवर्ड',\n      'wifi.password.placeholder': 'पासवर्ड',\n      'wifi.password.hide': 'पासवर्ड छुपाएं',\n      'wifi.name.hiddenSSID': 'छिपा हुआ SSID',\n      'wifi.password.encryption': 'एन्क्रिप्शन',\n      'wifi.password.encryption.none': 'कोई नहीं',\n      'wifi.tip':\n        'अपने आप कनेक्ट होने के लिए अपने फ़ोन के कैमरे से QR कोड को स्कैन करें',\n      'wifi.alert.name': 'नेटवर्क का नाम खाली नहीं हो सकता',\n      'wifi.alert.password.length.5':\n        'पासवर्ड कम से कम 5 अक्षरों का होना चाहिए, या एन्क्रिप्शन को \"कोई नहीं\" में बदलें',\n      'wifi.alert.password.length.8':\n        'पासवर्ड कम से कम 8 अक्षरों का होना चाहिए, या एन्क्रिप्शन को \"कोई नहीं\" में बदलें',\n      'button.rotate': 'घुमाएँ',\n      'button.print': 'प्रिंट करे',\n      select: 'भाषा चुने',\n    },\n  },\n  {\n    id: 'ca',\n    name: 'Catalan - Català',\n    translation: {\n      title: 'Targeta WiFi',\n      'desc.use':\n        'Imprimeix una targeta senzilla amb les teves dades per iniciar sessió WiFi. Enganxeu-ho a la nevera, guardeu-ho a la cartera, etc.',\n      'desc.privacy':\n        'La vostra informació de WiFi mai no s’envia al servidor. En aquest lloc web no s’utilitza cap rastreig, analítica ni empremta digital. Si vols pots veure el',\n      'desc.source': 'codi font',\n      'wifi.login': 'Inici de sessió WiFi',\n      'wifi.name': 'Nom de la xarxa',\n      'wifi.name.hiddenSSID': 'SSID amagat',\n      'wifi.name.placeholder': 'Nom de la xarxa WiFi',\n      'wifi.password': 'Contrasenya',\n      'wifi.password.placeholder': 'Contrasenya',\n      'wifi.password.hide': 'Amaga la contrasenya',\n      'wifi.password.encryption': 'Encriptació',\n      'wifi.password.encryption.none': 'Cap',\n      'wifi.tip':\n        'Apunteu la càmera del telèfon cap al codi QR per connectar-vos automàticament',\n      'wifi.alert.name': 'El nom de la xarxa no pot estar buit',\n      'wifi.alert.password.length.5':\n        \"La contrasenya ha de tenir com a mínim 5 caràcters o canvieu l'encriptació per « Cap »\",\n      'wifi.alert.password.length.8':\n        \"La contrasenya ha de tenir com a mínim 8 caràcters o canvieu l'encriptació per « Cap »\",\n      'button.rotate': 'Gira',\n      'button.print': 'Imprimeix',\n      select: 'Escolliu l’idioma',\n    },\n  },\n  {\n    id: 'id-ID',\n    name: 'Indonesian',\n    translation: {\n      title: 'Kartu WiFi',\n      'desc.use':\n        'Cetak kartu sederhana ini dengan informasi login WiFi anda. Tempelkan di pintu lemari es, atau simpan di dompet anda, dll.',\n      'desc.privacy':\n        'Informasi WiFi anda tidak akan dikirim ke server manapun. Tidak ada pelacakan, analitik, atau sidik jari yang digunakan di situs website ini. Lihat',\n      'desc.source': 'source code',\n      'wifi.login': 'Login WiFi',\n      'wifi.name': 'Nama Jaringan',\n      'wifi.name.placeholder': 'Nama Jaringan WiFi',\n      'wifi.password': 'Kata Sandi',\n      'wifi.password.placeholder': 'Kata Sandi',\n      'wifi.name.hiddenSSID': 'Sembunyikan SSID',\n      'wifi.password.hide': 'Sembunyikan kata sandi',\n      'wifi.password.encryption': 'Enkripsi',\n      'wifi.password.encryption.none': 'Tidak ada',\n      'wifi.tip':\n        'Arahkan kamera ponsel anda ke Kode QR untuk terhubung ke WiFi secara otomatis',\n      'wifi.alert.name': 'Nama jaringan tidak boleh kosong',\n      'wifi.alert.password.length.5':\n        'Kata sandi minimal harus 5 karakter, atau ubah enkripsi menjadi \"Tidak ada\"',\n      'wifi.alert.password.length.8':\n        'Kata sandi minimal harus 8 karakter, atau ubah enkripsi menjadi \"Tidak ada\"',\n      'button.rotate': 'Putar',\n      'button.print': 'Cetak',\n      select: 'Pilih Bahasa',\n    },\n  },\n  {\n    id: 'ko',\n    name: 'Korean - 한국어',\n    translation: {\n      title: 'WiFi 카드',\n      'desc.use':\n        'WiFi 로그인 정보를 알려주는 간단한 카드를 출력하세요. 냉장고에 붙이거나, 지갑에 소지하는 등 다양하게 이용하세요.',\n      'desc.privacy':\n        '입력한 WiFi 정보는 서버로 전송되지 않습니다. 이 웹사이트는 추적, 분석, 디지털 지문을 사용하지 않습니다. 소스 코드를 참조하세요',\n      'desc.source': '소스 코드',\n      'wifi.login': 'WiFi 로그인',\n      'wifi.name': '네트워크 이름',\n      'wifi.name.placeholder': 'WiFi 네트워크 이름',\n      'wifi.name.hiddenSSID': '숨겨진 SSID',\n      'wifi.password': '비밀번호',\n      'wifi.password.placeholder': '비밀번호',\n      'wifi.password.hide': '비밀번호 가리기',\n      'wifi.password.encryption': '보안',\n      'wifi.password.encryption.none': '없음',\n      'wifi.tip': '휴대폰의 카메라를 QR 코드에 가져대어 자동으로 연결하세요',\n      'wifi.alert.name': '네트워크 이름은 공백일 수 없습니다',\n      'wifi.alert.password.length.5':\n        '비밀번호를 5글자 이상 입력하시거나 보안을 \"없음\"으로 변경하세요.',\n      'wifi.alert.password.length.8':\n        '비밀번호를 8글자 이상 입력하시거나 보안을 \"없음\"으로 변경하세요.',\n      'button.rotate': '회전',\n      'button.print': '인쇄',\n      select: '언어 선택',\n    },\n  },\n  {\n    id: 'hu-HU',\n    name: 'Hungarian - Magyar',\n    translation: {\n      title: 'WiFi Kártya',\n      'desc.use':\n        'Nyomtass ki egy egyszerű kártyát a WiFi bejelentkezési adataiddal. Ragaszd fel a hűtőszekrényedre, tartsd a pénztárcádban, stb.',\n      'desc.privacy':\n        'A WiFi adataid sosem lesznek elküldve a szerverre. Ezen a weboldalon nincs követés, nincs analitika vagy digitális ujjlenyomatozás. Nézd meg a',\n      'desc.source': 'forráskódot',\n      'wifi.login': 'WiFi Bejelentkezés',\n      'wifi.name': 'Hálózat neve',\n      'wifi.name.placeholder': 'WiFi hálózat neve',\n      'wifi.password': 'Jelszó',\n      'wifi.password.placeholder': 'Jelszó',\n      'wifi.name.hiddenSSID': 'Rejtett SSID',\n      'wifi.password.hide': 'Jelszó elrejtése',\n      'wifi.password.encryption': 'Titkosítás',\n      'wifi.password.encryption.none': 'Nincs',\n      'wifi.tip':\n        'Olvasd be a QR kódot a telefonod kamerájával az automatikus csatlakozáshoz',\n      'wifi.alert.name': 'A Hálózat neve nem lehet üres',\n      'wifi.alert.password.length.5':\n        'A jelszó minimum 5 karakter legyen, vagy állítsd a titkosítást \"Nincs\"-re',\n      'wifi.alert.password.length.8':\n        'A jelszó minimum 8 karakter legyen, vagy állítsd a titkosítást \"Nincs\"-re',\n      'button.rotate': 'Forgatás',\n      'button.print': 'Nyomtatás',\n      select: 'Válassz nyelvet',\n    },\n  },\n  {\n    id: 'sr',\n    name: 'Serbian - Srpski',\n    translation: {\n      title: 'WiFi Karta',\n      'desc.use':\n        'Odštampajte jednostavnu karticu sa Vašim WiFi podacima za prijavu. Zalepite je na frižideru, držite je u novčaniku, itd.',\n      'desc.privacy':\n        'Informacije o Vašoj WiFi mreži se nikada ne šalju na server. Nema nikakvog praćenja, analitike ili formi identifikacije na ovom sajtu.',\n      'desc.source': 'Izvorni kod',\n      'wifi.login': 'WiFi prijava',\n      'wifi.name': 'Ime mreže',\n      'wifi.name.placeholder': 'Ime WiFi mreže',\n      'wifi.password': 'Šifra',\n      'wifi.password.placeholder': 'Šifra',\n      'wifi.name.hiddenSSID': 'Sakriven SSID ',\n      'wifi.password.hide': 'Sakri šifru',\n      'wifi.password.encryption': 'Enkripcija',\n      'wifi.password.encryption.none': 'Nema',\n      'wifi.tip':\n        'Uperite kameru Vašeg telefona na QR kod da bi ste se povezali automatski na mrežu',\n      'wifi.alert.name': 'Ime mreže ne može biti prazno',\n      'wifi.alert.password.length.5':\n        'Šifra mora imati minimum 5 karaktera ili promeni enkripciju na \"Nema\"',\n      'wifi.alert.password.length.8':\n        'Šifra mora imati minimum 8 karaktera ili promeni enkripciju na \"Nema\"',\n      'button.rotate': 'Rotiraj',\n      'button.print': 'Odštampaj',\n      select: 'Odaberite jezik',\n    },\n  },\n  {\n    id: 'sr-Cyrl-CS',\n    name: 'Serbian - Српски',\n    translation: {\n      title: 'WiFi карта',\n      'desc.use':\n        'Одштампајте једноставну картицу са Вашим WiFi подацима за пријаву. Залепите је на фрижидеру, држите је у новчанику, итд.',\n      'desc.privacy':\n        'Информације о Вашој WiFi мрежи се никада не саљу на сервер. Нема никаквог праћења, аналитике или форми индетификације на овом сајту.',\n      'desc.source': 'Изворни код',\n      'wifi.login': 'WiFi мрежа',\n      'wifi.name': 'Име мреже',\n      'wifi.name.placeholder': 'Име WiFi мреже',\n      'wifi.password': 'Шифра',\n      'wifi.password.placeholder': 'Шифра',\n      'wifi.name.hiddenSSID': 'Сакривен SSID ',\n      'wifi.password.hide': 'Сакри шифру',\n      'wifi.password.encryption': 'Енкрипција',\n      'wifi.password.encryption.none': 'Нема',\n      'wifi.tip':\n        'Уперите камеру Вашег телефона на QR код да би сте се повезали аутомацки на мрежу',\n      'wifi.alert.name': 'Име мреже не може бити празно',\n      'wifi.alert.password.length.5':\n        'Шифра мора имати минимум 5 карактера или промени енкрипцију на \"Нема\"',\n      'wifi.alert.password.length.8':\n        'Шифра мора имати минимум 8 карактера или промени енкрипцију на \"Нема\"',\n      'button.rotate': 'Ротирај',\n      'button.print': 'Одштампај',\n      select: 'Одаберите језик',\n    },\n  },\n  {\n    id: 'Ur',\n    name: 'Urdu',\n    translation: {\n      title: 'وائی ​​فائی کارڈ',\n      'desc.use':\n        'اپنے وائی فائی لاگ ان کی تفصیلات کے ساتھ ایک سادہ کارڈ پرنٹ کریں۔ اسے فریج میں ٹیپ کریں ، اسے اپنے پرس میں رکھیں ، وغیرہ۔',\n      'desc.privacy':\n        'آپ کی وائی فائی معلومات کبھی بھی سرور کو نہیں بھیجی جاتی۔ اس ویب سائٹ پر کوئی ٹریکنگ ، تجزیات ، یا فنگر پرنٹنگ استعمال نہیں کی جاتی ہے۔ دیکھیں۔',\n      'desc.source': 'سورس کوڈ',\n      'wifi.login': 'وائی ​​فائی لاگ ان',\n      'wifi.name': 'نیٹ ورک کا نام',\n      'wifi.name.hiddenSSID': 'پوشیدہ SSID۔',\n      'wifi.name.placeholder': 'وائی ​​فائی نیٹ ورک کا نام۔',\n      'wifi.password': 'پاس ورڈ',\n      'wifi.password.placeholder': 'پاس ورڈ',\n      'wifi.password.hide': 'پاس ورڈ چھپائیں۔',\n      'wifi.password.encryption': 'خفیہ کاری۔',\n      'wifi.password.encryption.none': 'کوئی نہیں',\n      'wifi.tip':\n        'اپنے فون کے کیمرے کو QR کوڈ کی طرف اشارہ کریں تاکہ خود بخود جڑ جائے۔',\n      'wifi.alert.name': 'نیٹ ورک کا نام خالی نہیں ہو سکتا۔',\n      'wifi.alert.password.length.5':\n        'پاس ورڈ کم از کم 5 حروف کا ہونا چاہیے ، یا خفیہ کاری کو \"کوئی نہیں\" میں تبدیل کرنا چاہیے',\n      'wifi.alert.password.length.8':\n        'پاس ورڈ کم از کم 8 حروف کا ہونا چاہیے ، یا خفیہ کاری کو \"کوئی نہیں\" میں تبدیل کرنا چاہیے',\n      'button.rotate': 'گھمائیں',\n      'button.print': 'پرنٹ کریں',\n      select: 'زبان منتخب کریں۔',\n    },\n  },\n  {\n    id: 'th-TH',\n    name: 'Thai - ภาษาไทย',\n    translation: {\n      title: 'การ์ด WiFi',\n      'desc.use':\n        'พิมพ์การ์ดอย่างง่ายพร้อมรายละเอียดการเข้าสู่ระบบ WiFi ของคุณ. ติดเทปไว้บนตู้เย็น, เก็บไว้ในกระเป๋าสตางค์ ฯลฯ',\n      'desc.privacy':\n        'ข้อมูล WiFi ของคุณจะไม่ถูกส่งไปยังเซิร์ฟเวอร์, ไม่มีการติดตาม, การวิเคราะห์, หรือลายนิ้วมือบนเว็บไซต์นี้. ดู',\n      'desc.source': 'ซอร์ซโคด',\n      'wifi.login': 'เข้าสู่ระบบ WiFi',\n      'wifi.name': 'ชื่อเครือข่าย',\n      'wifi.name.hiddenSSID': 'SSID ถูกซ่อนอยู่',\n      'wifi.name.placeholder': 'ชื่อเครือข่าย WiFi',\n      'wifi.password': 'รหัสผ่าน WiFi',\n      'wifi.password.placeholder': 'รหัสผ่าน WiFi',\n      'wifi.password.hide': 'ซ่อนรหัสผ่าน WiFi บนการ์ด',\n      'wifi.password.encryption': 'การเข้ารหัส',\n      'wifi.password.encryption.none': 'ไม่มี',\n      'wifi.tip': 'หันกล้องของโทรศัพท์ไปที่ QR Code เพื่อเชื่อมต่อโดยอัตโนมัติ',\n      'wifi.alert.name': 'ต้องระบุชื่อเครือข่าย',\n      'wifi.alert.password.length.5':\n        'รหัสผ่านต้องมีอักขระอย่างน้อย 5 ตัว หรือเปลี่ยนการเข้ารหัสเป็น \"ไม่มี\"',\n      'wifi.alert.password.length.8':\n        'รหัสผ่านต้องมีอักขระอย่างน้อย 8 ตัว หรือเปลี่ยนการเข้ารหัสเป็น \"ไม่มี\"',\n      'button.rotate': 'หมุนแนวการ์ด',\n      'button.print': 'พิมพ์',\n      select: 'เลือกภาษา',\n    },\n  },\n  {\n    id: 'pb-IN',\n    name: 'Punjabi - ਪੰਜਾਬੀ',\n    translation: {\n      title: 'ਵਾਈਫਾਈ ਕਾਰਡ',\n      'desc.use':\n        'ਆਪਣੇ ਫਾਈ ਲੌਗਇਨ ਵੇਰਵਿਆਂ ਦੇ ਨਾਲ ਇੱਕ ਸਧਾਰਨ ਕਾਰਡ ਪ੍ਰਿੰਟ ਕਰੋ। ਇਸਨੂੰ ਫਰਿੱਜ ਵਿੱਚ ਟੇਪ ਕਰੋ, ਇਸਨੂੰ ਆਪਣੇ ਬਟੂਏ ਵਿੱਚ ਰੱਖੋ, ਆਦਿ',\n      'desc.privacy':\n        'ਤੁਹਾਡੀ ਫਾਈ ਜਾਣਕਾਰੀ ਕਦੇ ਵੀ ਸਰਵਰ ਨੂੰ ਨਹੀਂ ਭੇਜੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਵੈੱਬਸਾਈਟ ਤੇ ਕੋਈ ਟਰੈਕਿੰਗ, ਵਿਸ਼ਲੇਸ਼ਣ ਜਾਂ ਫਿੰਗਰਪ੍ਰਿੰਟਿੰਗ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ। ਵੇਖੋ',\n      'desc.source': 'ਸੂਤਰ ਸੰਕੇਤਾਵਲੀ',\n      'wifi.login': 'ਫਾਈ ਲਾਗਿਨ',\n      'wifi.name': 'ਨੈੱਟਵਰਕ ਦਾ ਨਾਮ',\n      'wifi.name.hiddenSSID': 'ਲੁਕਿਆ ਹੋਇਆ SSID',\n      'wifi.name.placeholder': 'ਫਾਈ ਨੈੱਟਵਰਕ ਦਾ ਨਾਮ',\n      'wifi.password': 'ਪਾਸਵਰਡ',\n      'wifi.password.placeholder': 'ਪਾਸਵਰਡ',\n      'wifi.password.hide': 'ਓਹਲੇ ਪਾਸਵਰਡ',\n      'wifi.password.encryption': 'ਐਨਕ੍ਰਿਪਸ਼ਨ',\n      'wifi.password.encryption.none': 'ਕੋਈ ਨਹੀਂ',\n      'wifi.tip':\n        'ਸਵੈਚਲਿਤ ਤੌਰ ਤੇ ਕਨੈਕਟ ਕਰਨ ਲਈ ਆਪਣੇ ਫ਼ੋਨ ਦੇ ਕੈਮਰੇ ਨੂੰ QR ਕੋਡ ਤੇ ਪੁਆਇੰਟ ਕਰੋ',\n      'wifi.alert.name': 'ਨੈੱਟਵਰਕ ਨਾਮ ਖਾਲੀ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ',\n      'wifi.alert.password.length.5':\n        'ਪਾਸਵਰਡ ਘੱਟੋ-ਘੱਟ ਪੰਜ ਅੱਖਰਾਂ ਦਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਜਾਂ ਐਨਕ੍ਰਿਪਸ਼ਨ ਨੂੰ ਕੋਈ ਨਹੀਂ ਵਿੱਚ ਬਦਲਣਾ ਚਾਹੀਦਾ ਹੈ',\n      'wifi.alert.password.length.8':\n        'ਪਾਸਵਰਡ ਘੱਟੋ-ਘੱਟ ਅੱਠ ਅੱਖਰਾਂ ਦਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਜਾਂ ਐਨਕ੍ਰਿਪਸ਼ਨ ਨੂੰ ਕੋਈ ਨਹੀਂ ਵਿੱਚ ਬਦਲਣਾ ਚਾਹੀਦਾ ਹੈ',\n      'button.rotate': 'ਘੁੰਮਾਓ',\n      'button.print': 'ਛਾਪੋ',\n      select: 'ਭਾਸ਼ਾ ਚੁਣੋ',\n    },\n  },\n  {\n    id: 'dk-DA',\n    name: 'Danish - Dansk',\n    translation: {\n      title: 'WiFi Kort',\n      'desc.use':\n        'Udskriv et enkelt kort med dine Wifi login oplysninger. Sæt det på køleskapet, læg det i din pung eller lignende.',\n      'desc.privacy':\n        'Dine Wifi informationer bliver aldrig sendt til vores servere. Ingen sporing, analyse eller identifikation anvendes på dette website. Se vores',\n      'desc.source': 'kildekode',\n      'wifi.login': 'WiFi login',\n      'wifi.name': 'Netværksnavn',\n      'wifi.name.hiddenSSID': 'Skjult SSID',\n      'wifi.name.placeholder': 'WiFi Netværksnavn',\n      'wifi.password': 'Kodeord',\n      'wifi.password.placeholder': 'Kodeord',\n      'wifi.password.hide': 'Skjul kodeord',\n      'wifi.password.encryption': 'Kryptering',\n      'wifi.password.encryption.none': 'Ingen',\n      'wifi.tip': 'Ret telefonens kamera mod QR koden for tilslutte automatisk',\n      'wifi.alert.name': 'Netværksnavnet må ikke være tomt',\n      'wifi.alert.password.length.5':\n        'Kodeordet skal være på mindst 5 tegn, eller skift kryptering til \"Ingen\"',\n      'wifi.alert.password.length.8':\n        'Kodeordet skal være på mindst 8 tegn, eller skift kryptering til \"Ingen\"',\n      'button.rotate': 'Roter',\n      'button.print': 'Print ud',\n      select: 'Vælg sprog',\n    },\n  },\n  {\n    id: 'sk-SK',\n    name: 'Slovak - Slovenčina',\n    translation: {\n      title: 'WiFi Karta',\n      'desc.use':\n        '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ď.',\n      'desc.privacy':\n        '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ť',\n      'desc.source': 'zdrojový kód',\n      'wifi.identity': 'Identita',\n      'wifi.identity.placeholder': 'Uživateľské meno',\n      'wifi.login': 'WiFi Login',\n      'wifi.name': 'Názov siete',\n      'wifi.name.hiddenSSID': 'Skryté SSID',\n      'cards.additional': 'Počet ďalších kariet na tlač',\n      'cards.tip.hide': 'Schovať nápovedu',\n      'wifi.name.placeholder': 'Názov siete WiFi',\n      'wifi.password': 'Heslo',\n      'wifi.password.placeholder': 'Heslo',\n      'wifi.password.hide': 'Schovať heslo',\n      'wifi.password.encryption': 'Šifrovanie',\n      'wifi.password.encryption.none': 'Žiadne',\n      'wifi.encryption.eapMethod': 'Metóda EAP',\n      'wifi.tip':\n        'Namierte fotoaparát telefónu na QR kód a automaticky sa pripojte.',\n      'wifi.alert.name': 'Názov siete nesmie byť prázdny',\n      'wifi.alert.password': 'Heslo nesmie byť prázdne',\n      'wifi.alert.password.length.5':\n        'Heslo musí mať aspoň 5 znakov, alebo zmeňte šifrovanie na \"Žiadne\"',\n      'wifi.alert.password.length.8':\n        'Heslo musí mať aspoň 8 znakov, alebo zmeňte šifrovanie na \"Žiadne\"',\n      'wifi.alert.eapIdentity': 'Identita nesmie byť prázdna',\n      'button.rotate': 'Otočiť',\n      'button.print': 'Vytlačiť',\n      select: 'Vybrať jazyk',\n    },\n  },\n  {\n    id: 'mg-MG',\n    name: 'Malagasy - Malagasy',\n    translation: {\n      title: 'Karatra Wifi',\n      'desc.use':\n        \"Antontay ny karatra tsotra maneho ny mombamomba ny wifi-nao. Apetraho eran'ny trano, ataovy any anaty boky, sns\",\n      'desc.privacy':\n        \"Tsy tehirizinay na aiza na aiza izay zavatra ampidirinao eto. Tsy misy fanarahana na fitsikilovana eto amin'ity pejy ity. Misy fanazavana\",\n      'desc.source': 'source code',\n      'wifi.identity': 'Anarana',\n      'wifi.identity.placeholder': 'Anarana',\n      'wifi.login': 'Momba ny WiFi',\n      'wifi.name': 'SSID',\n      'wifi.name.hiddenSSID': 'SSID miafina',\n      'cards.additional': \"Isan' ny karatra fanampiny atonta\",\n      'cards.tip.hide': 'Aza asiana fanazavana (legend)',\n      'wifi.name.placeholder': \"Anaran'ny tambajotra WiFi (SSID)\",\n      'wifi.password': 'Fanalahidy',\n      'wifi.password.placeholder': 'Teny fanalahidy',\n      'wifi.password.hide': 'Afeno ny fanalahidy',\n      'wifi.password.encryption': 'Encryption',\n      'wifi.password.encryption.none': 'Tsy misy',\n      'wifi.encryption.eapMethod': 'EAP method',\n      'wifi.tip':\n        \"Mba hidiranao malakilaky dia alaivo sary amin'ny fakantsarinao ilay QR Code\",\n      'wifi.alert.name': 'Tsy maintsy misy anarana ilay tambajotra',\n      'wifi.alert.password': 'Tsy maintsy fenoina ny fanalahidy',\n      'wifi.alert.password.length.5':\n        \"Tsy maintsy mihoatry ny litera 5 ny fanalahidy, na tsy maintsy ovaina ho 'Tsy Misy' ny Encryption\",\n      'wifi.alert.password.length.8':\n        \"Tsy maintsy mihoatry ny litera 8 ny fanalahidy, na tsy maintsy ovaina ho 'Tsy Misy' ny Encryption\",\n      'wifi.alert.eapIdentity': 'Tsy maintsy fenoina ny anarana',\n      'button.rotate': 'Ahodino',\n      'button.print': 'Antontay',\n      select: 'Mifidiana fiteny hafa',\n    },\n  },\n  {\n    id: 'bn-BD',\n    name: 'Bangla - বাংলা',\n    translation: {\n      title: 'ওয়াইফাই কার্ড',\n      'desc.use':\n        'আপনার ওয়াই-ফাই লগইন বিবরণ সহ একটি সাধারণ কার্ড প্রিন্ট করুন। এটি ফ্রিজে টেপ দিয়ে লাগান, আপনার ওয়ালেটে রাখুন, ইত্যাদি।',\n      'desc.privacy':\n        'আপনার ওয়াই-ফাই তথ্য কখনই সার্ভারে পাঠানো হয় না। এই ওয়েবসাইটে কোন ট্র্যাকিং, অ্যানালিটিক্স বা ফিঙ্গারপ্রিন্টিং ব্যবহার করা হয় না। দেখুন',\n      'desc.source': 'সোর্স কোড',\n      'wifi.login': 'ওয়াই-ফাই লগইন',\n      'wifi.name': 'নেটওয়ার্কের নাম',\n      'wifi.name.hiddenSSID': 'লুকানো SSID',\n      'cards.additional': 'অতিরিক্ত কার্ড প্রিন্ট করা হবে',\n      'cards.tip.hide': 'নির্দেশ (টীকা) লুকান',\n      'wifi.name.placeholder': 'ওয়াই-ফাই নেটওয়ার্কের নাম',\n      'wifi.password': 'পাসওয়ার্ড',\n      'wifi.password.placeholder': 'পাসওয়ার্ড',\n      'wifi.password.hide': 'পাসওয়ার্ড লুকান',\n      'wifi.password.encryption': 'এনক্রিপশন',\n      'wifi.password.encryption.none': 'নেই',\n      'wifi.tip':\n        'স্বয়ংক্রিয়ভাবে সংযোগ করতে আপনার ফোনের ক্যামেরা QR কোডে নির্দেশ করুন',\n      'wifi.alert.name': 'নেটওয়ার্কের নাম খালি হতে পারে না',\n      'wifi.alert.password': 'পাসওয়ার্ড খালি হতে পারে না',\n      'wifi.alert.password.length.5':\n        'পাসওয়ার্ড কমপক্ষে ৫ অক্ষরের হতে হবে, অথবা এনক্রিপশন পরিবর্তন করে \"নেই\" দিন',\n      'wifi.alert.password.length.8':\n        'পাসওয়ার্ড কমপক্ষে ৮ অক্ষরের হতে হবে, অথবা এনক্রিপশন পরিবর্তন করে \"নেই\" দিন',\n      'button.rotate': 'ঘুরান',\n      'button.print': 'প্রিন্ট',\n      select: 'ভাষা নির্বাচন করুন',\n    },\n  },\n  {\n    id: 'eo',\n    name: 'Esperanto',\n    translation: {\n      title: 'Vifia karto',\n      'desc.use':\n        'Presu simplan karton kun viaj vifiaj ensalutaj detaloj. Bendu ĝin al la fridujo, konservu ĝin en via monujo, ktp.',\n      'desc.privacy':\n        'Viaj vifiaj informoj neniam estas senditaj al la servilo. Neniu spurado, analizo aŭ fingrospurado estas uzataj en ĉi tiu retejo. Vidi la',\n      'desc.source': 'fontokodon',\n      'wifi.identity': 'Identeco',\n      'wifi.identity.placeholder': 'Uzantnomo',\n      'wifi.login': 'Vifia ensaluto',\n      'wifi.name': 'Retnomo',\n      'wifi.name.hiddenSSID': 'Kaŝita SSID',\n      'cards.additional': 'Pliaj kartoj por presi',\n      'cards.tip.hide': 'Kaŝi konsileton (klarigeto)',\n      'wifi.name.placeholder': 'Nomo de vifia reto',\n      'wifi.password': 'Pasvorto',\n      'wifi.password.placeholder': 'Pasvorto',\n      'wifi.password.hide': 'Kaŝi pasvorton',\n      'wifi.password.encryption': 'Ĉifrado',\n      'wifi.password.encryption.none': 'Nenio',\n      'wifi.encryption.eapMethod': 'EAP-metodo',\n      'wifi.tip':\n        'Metu la fotilon de via telefono antaŭ la QR-kodo por aŭtomate konektiĝi',\n      'wifi.alert.name': 'Retnomo ne povas esti malplena',\n      'wifi.alert.password': 'Pasvorto ne povas esti malplena',\n      'wifi.alert.password.length.5':\n        'Pasvorto devas enhavi almenaŭ 5 signoj, aŭ ŝanĝu la ĉifradon al \"Neniu\"',\n      'wifi.alert.password.length.8':\n        'Pasvorto devas enhavi almenaŭ 8 signoj, aŭ ŝanĝu la ĉifradon al \"Neniu\"',\n      'wifi.alert.eapIdentity': 'Identeco ne povas esti malplena',\n      'button.rotate': 'Rotacii',\n      'button.print': 'Presi',\n      select: 'Elektu lingvon',\n    },\n  },\n  {\n    id: 'ms-MY',\n    name: 'Malay - Malaysia',\n    translation: {\n      title: 'Kad WiFi',\n      'desc.use':\n        'Cetak kad ringkas dengan butiran login anda. Tampal pada peti sejuk, simpan dalam dompet anda, dan sebagainya.',\n      'desc.privacy':\n        'Informasi WiFi anda tidak dihantar ke server. Tiada penjejakan, analitik, atau pencetakan cap jari digunakan di laman web ini. Lihat',\n      'desc.source': 'kod sumber',\n      'wifi.identity': 'Identiti',\n      'wifi.identity.placeholder': 'Nama Pengguna',\n      'wifi.login': 'Login WiFi',\n      'wifi.name': 'Nama Rangkaian',\n      'wifi.name.hiddenSSID': 'SSID Tersembunyi',\n      'cards.additional': 'Bilangan kad untuk dicetak',\n      'cards.tip.hide': 'Sembunyikan panduan (legenda)',\n      'wifi.name.placeholder': 'Nama Rangkaian WiFi',\n      'wifi.password': 'Kata Laluan',\n      'wifi.password.placeholder': 'Kata Laluan',\n      'wifi.password.hide': 'Sembunyikan kata laluan',\n      'wifi.password.encryption': 'Enkripsi',\n      'wifi.password.encryption.none': 'Tiada',\n      'wifi.encryption.eapMethod': 'Kaedah EAP',\n      'wifi.tip': 'Imbas Kod QR untuk menyambung ke WiFi secara automatik',\n      'wifi.alert.name': 'Nama rangkaian tidak boleh kosong',\n      'wifi.alert.password': 'Kata laluan tidak boleh kosong',\n      'wifi.alert.password.length.5':\n        'Kata laluan mesti sekurang-kurangnya 5 aksara, atau tukar enkripsi kepada \"Tiada\"',\n      'wifi.alert.password.length.8':\n        'Kata laluan mesti sekurang-kurangnya 8 aksara, atau tukar enkripsi kepada \"Tiada\"',\n      'wifi.alert.eapIdentity': 'Identiti tidak boleh kosong',\n      'button.rotate': 'Putar',\n      'button.print': 'Cetak',\n      select: 'Pilih Bahasa',\n    },\n  },\n].sort((a, b) => {\n  return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;\n});\n"
  }
]